AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Theme Func von C nach Delphi

Ein Thema von adecke · begonnen am 12. Dez 2004 · letzter Beitrag vom 12. Dez 2004
Antwort Antwort
adecke

Registriert seit: 9. Okt 2004
15 Beiträge
 
#1

Theme Func von C nach Delphi

  Alt 12. Dez 2004, 12:25
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);
+}
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: Theme Func von C nach Delphi

  Alt 12. Dez 2004, 12:56
Besser die Win32 Konversion von Marcel van Brakel verwenden.
http://members.chello.nl/m.vanbrakel2/
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.
  Mit Zitat antworten Zitat
adecke

Registriert seit: 9. Okt 2004
15 Beiträge
 
#3

Re: Theme Func von C nach Delphi

  Alt 12. Dez 2004, 13:40
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:
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;
aber wie zu sehen nur über den Import aus der "Desk.cpl". Zumal damit auf Windows-Standard
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz