![]() |
Theme Func von C nach Delphi
Hallo,
ich habe da etwas brauchbares für mich gefunden. Leider ist der Source in C. (war als Delphi Code nicht zu finden, außerdem ist die UxTheme.pas von Delphi bei weitem nicht mit der kompletten API der DLL ausgestattet). Habe schon versucht dieses Wirrwar nach Delphi zu coden, bin aber kläglich gescheitert. Jetzt meine Bitte, Hoffnung das es irgend jemanden (beider Sprachen mächtig) gibt der das hin bekommt. vielen Dank andreas
Delphi-Quellcode:
+//#include <stdlib.h>
+#include <stdio.h> +//#include <string.h> +#include <windows.h> +#include <uxtheme.h> + +typedef void* HTHEMEFILE; + +HRESULT WINAPI EnumThemeColors(LPWSTR pszThemeFileName, LPWSTR pszSizeName, + DWORD dwColorNum, LPWSTR pszColorName); +HRESULT WINAPI EnumThemeSizes(LPWSTR pszThemeFileName, LPWSTR pszColorName, + DWORD dwSizeNum, LPWSTR pszSizeName); +HRESULT WINAPI OpenThemeFile(LPCWSTR pszThemeFileName, LPCWSTR pszColorName, + LPCWSTR pszSizeName, HTHEMEFILE *hThemeFile, + DWORD unknown); +HRESULT WINAPI GetThemeDefaults(LPCWSTR pszThemeFileName, LPWSTR pszColorName, + DWORD dwColorNameLen, LPWSTR pszSizeName, + DWORD dwSizeNameLen); +HRESULT WINAPI CloseThemeFile(HTHEMEFILE hThemeFile); +HRESULT WINAPI ApplyTheme(HTHEMEFILE hThemeFile, char *unknown, HWND hWnd); + +typedef HRESULT (WINAPI*EnumTheme)(LPWSTR,LPWSTR,DWORD,LPWSTR); +typedef int (*operation)(int,char*[]); + +typedef struct _CMDOPTS { + char *option; + int params; + operation oper; +} CMDOPTS; + +int install(int argc, char *argv[]); +int uninstall(int argc, char *argv[]); +int info(int argc, char *argv[]); +int help(int argc, char *argv[]); + +CMDOPTS opts[] = { + {"install", 1, install}, + {"uninstall", 0, uninstall}, + {"info", 0, info}, + {"help", 0, help}, +}; + +int install(int argc, char *argv[]) +{ + HRESULT hr; + int ret = 0; + WCHAR szFile[MAX_PATH]; + WCHAR szColor[60]; + WCHAR szSize[60]; + HTHEMEFILE hThemeFile; + char b[] = "\0"; + + MultiByteToWideChar(CP_ACP, 0, argv[2], -1, szFile, MAX_PATH); + if(argc >= 5) { + MultiByteToWideChar(CP_ACP, 0, argv[3], -1, szColor, sizeof(szColor)/sizeof(szColor[0])); + MultiByteToWideChar(CP_ACP, 0, argv[4], -1, szSize, sizeof(szSize)/sizeof(szSize[0])); + hr = OpenThemeFile(szFile, szColor, szSize, &hThemeFile, 0); + } + else { + hr = OpenThemeFile(szFile, NULL, NULL, &hThemeFile, 0); + } + if(FAILED(hr)) { + fprintf(stderr, "Failed to load theme %s: 0x%08lx\n", argv[2], hr); + return 2; + } + hr = ApplyTheme(hThemeFile, b, NULL); + if(FAILED(hr)) { + fprintf(stderr, "Failed to apply theme %s: 0x%08lx\n", argv[2], hr); + ret = 2; + } + CloseThemeFile(hThemeFile); + return ret; +} + +int uninstall(int argc, char *argv[]) +{ + HRESULT hr; + char b[] = "\0"; + hr = ApplyTheme(NULL, b, NULL); + if(FAILED(hr)) { + fprintf(stderr, "Failed to uninstall theme: 0x%08lx\n", hr); + return 2; + } + return 0; +} + +int enumValues(char *theme, char *type, EnumTheme enumtheme) +{ + HRESULT hr; + WCHAR szFile[MAX_PATH]; + WCHAR szNameW[60]; + char szNameA[60]; + int index = 0; + MultiByteToWideChar(CP_ACP, 0, theme, -1, szFile, MAX_PATH); + while(SUCCEEDED(hr = enumtheme(szFile, NULL, index++, szNameW))) { + WideCharToMultiByte(CP_ACP, 0, szNameW, -1, szNameA, sizeof(szNameA)/sizeof(szNameA[0]), 0, 0); + printf("\t%s\n", szNameA); + } + if(hr == E_PROP_ID_UNSUPPORTED) + return 0; + fprintf(stderr, "Error enumerating %s: 0x%08lx\n", type, hr); + return 2; +} + +int info(int argc, char *argv[]) +{ + HRESULT hr; + WCHAR szThemeFileNameW[MAX_PATH]; + char szThemeFileNameA[MAX_PATH]; + WCHAR szColorNameW[60]; + char szColorNameA[60]; + WCHAR szSizeNameW[60]; + char szSizeNameA[60]; + char *pre = ""; + + if(argc >= 3) { + lstrcpy(szThemeFileNameA, argv[2]); + MultiByteToWideChar(CP_ACP, 0, szThemeFileNameA, -1, szThemeFileNameW, MAX_PATH); + hr = GetThemeDefaults(szThemeFileNameW, + szColorNameW, sizeof(szColorNameW)/sizeof(szColorNameW[0]), + szSizeNameW, sizeof(szSizeNameW)/sizeof(szSizeNameW[0])); + if(FAILED(hr)) { + fprintf(stderr, "Failed to get info on theme %s: 0x%08lx\n", szThemeFileNameA, hr); + return 2; + } + pre = "Default "; + } + else { + if(!IsThemeActive()) { + printf("Themeing is not enabled\n"); + return 0; + } + hr = GetCurrentThemeName(szThemeFileNameW, sizeof(szThemeFileNameW)/sizeof(szThemeFileNameW[0]), + szColorNameW, sizeof(szColorNameW)/sizeof(szColorNameW[0]), + szSizeNameW, sizeof(szSizeNameW)/sizeof(szSizeNameW[0])); + if(FAILED(hr)) { + fprintf(stderr, "Failed to get info on current theme: 0x%08lx\n", hr); + return 2; + } + WideCharToMultiByte(CP_ACP, 0, szThemeFileNameW, -1, szThemeFileNameA, sizeof(szThemeFileNameA)/sizeof(szThemeFileNameA[0]), 0, 0); + printf("Installed theme:\n"); + } + WideCharToMultiByte(CP_ACP, 0, szColorNameW, -1, szColorNameA, sizeof(szColorNameA)/sizeof(szColorNameA[0]), 0, 0); + WideCharToMultiByte(CP_ACP, 0, szSizeNameW, -1, szSizeNameA, sizeof(szSizeNameA)/sizeof(szSizeNameA[0]), 0, 0); + + printf("File: %s\n", szThemeFileNameA); + printf("%sColor: %s\n", pre, szColorNameA); + printf("%sSize: %s\n", pre, szSizeNameA); + + if(argc >= 3) { + printf("Colors:\n"); + enumValues(szThemeFileNameA, "colors", EnumThemeColors); + printf("Sizes:\n"); + enumValues(argv[2], "sizes", EnumThemeSizes); + } + return 0; +} + +int help(int argc, char *argv[]) { + printf("winetheme install [theme] [color] [size]\n"); + printf("\tInstall theme using color and size, if color and size\n"); + printf("\tare omited, the default for the theme is used\n"); + printf("winetheme uninstall\n"); + printf("\tRemove installed theme\n"); + printf("winetheme info [theme]\n"); + printf("\tInformation about specified theme or, if omitted, installed theme\n"); + return 0; +} + +int main(int argc, char *argv[]) +{ + int i; + operation oper = help; + + if(argc > 1) { + for(i=0; i<sizeof(opts)/sizeof(opts[0]); i++) { + if(argc >= opts[i].params+2 && !strcmp(argv[1], opts[i].option)) { + oper = opts[i].oper; + break; + } + } + } + return oper(argc, argv); +} |
Re: Theme Func von C nach Delphi
Besser die Win32 Konversion von Marcel van Brakel verwenden.
![]() Alternativ noch ein bischen warten bis wir die Jedi-Apilib bei SourceForge bestueckt haben. Kann nicht mehr lange dauern bis ich mit der Ueberarbeitung fertig bin. |
Re: Theme Func von C nach Delphi
Hallo Robert,
habe mal in die Jedi-API reingeschaut. Auch hier gibt es z.B. die Funktionen OpenThemeFile, ApplyTheme und CloseThemeFile nicht. Eigentlich möchte ich nur für Windows XP das Themes (Design) ändern (Global). Die ganze Sache mit Themes und Schemes ist unter XP sehr undurchsichtig. So gibt es zwar eine Funktion:
Delphi-Quellcode:
aber wie zu sehen nur über den Import aus der "Desk.cpl". Zumal damit auf Windows-Standard
Function EnableScheme(sName: String): LongInt;
Var Handle : THandle; DeskSetCurrentScheme: TDeskSetCurrentScheme; Begin Handle := LoadLibrary('desk.cpl'); If Handle <> 0 Then Begin DeskSetCurrentScheme := GetProcAddress(Handle, 'DeskSetCurrentScheme'); Try Result := DeskSetCurrentScheme(sName); Except End; End; End; geschaltet wird. D.h. hiermit wird kein Themes geschaltet sondern das herkömmliche Windows Outfit. Bis dato konnte ich keine Funktion auftun, welches dies mit einem Themes macht. Wie gesagt, es geht mir nicht darum einer Application ein Thema zu verpassen, sondern Windows global auf ein Themes zu schalten. gruss Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz