PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : XP-Style für Windows Shell Property Sheet


Sephiroth
2006-10-24, 15:59:49
Was muß ich tun, damit eine neue property sheet page für die Windows Shell auch den XP-Style nutzt?
Die Sachen mit der Manifest, die hier bei Microsoft nachzulesen (http://www.microsoft.com/germany/msdn/library/windows/windowsxp/VerwendenVonVisuellenStilenInWindowsXP.mspx?mfr=true) sind, habe ich probiert und sie gehen nicht.


Übrigens auch interessant, daß CONTROL_PANEL_RESOURCE_ID in der Winuser.rh nicht definiert ist, obwohl das da mit steht (http://www.microsoft.com/germany/msdn/library/windows/windowsxp/VerwendenVonVisuellenStilenInWindowsXP.mspx#ESD).


Wo anders habe ich auch folgendes gelesen:
Manifest is not enough to display XP styles in Windows Shell. In case if you want XP-styled property pages, you need to set property TsxNamespacePropertySheet.ActivateXPThemes = True
(quelle (http://www.shellplus.com/forum/viewtopic.php?topic=496&forum=2))

Leider hilft mir das gerade wenig, da sich das auf Shell+ für Delphi bezieht.


p.s.
Ja ich rufe InitCommonControls auf und Linke gegen die comctl32.lib.
Ich verwende übrigens MS VC++ 2005 Express Edition, falls das weiterhilft.

Elemental
2006-10-25, 08:23:53
Gibts da bei dir sowas wie
Application.EnableVisualStyles() ?

Sephiroth
2006-10-25, 15:41:49
Nicht das ich wüsste, verwende ja kein kein Windows-Forms.

Das Beispiel auf The Code Project (http://www.codeproject.com/shell/ShellExtGuide5.asp) geht neu kompiliert auch nicht mehr (also der XP-Style).

Juerg
2006-10-26, 13:01:26
Was liefert InitCommonControlsEx als Rückgabewert?
Welche ICC_*_CLASSES werden initialisiert?
TsxNamespacePropertySheet is was von Delphi IMHO.

Sephiroth
2006-10-26, 17:09:17
Was liefert InitCommonControlsEx als Rückgabewert?
Welche ICC_*_CLASSES werden initialisiert?
gibt mir ein false zurück bei ICC_STANDARD_CLASSES

InitCommonControlsEx Function (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/common/functions/initcommoncontrolsex.asp)
Windows XP: If a manifest is used, InitCommonControlsEx is not required.

achja, es handelt sich dabei um eine dll

Juerg
2006-11-02, 14:40:40
Ja, die ICC_STANDARD_CLASSES umfassen nur

ICC_STANDARD_CLASSES
-------------------------
Load one of the intrinsic User32 control classes. The user controls include button, edit, static, listbox, combobox, and scrollbar.

Brauchst Du nicht die Tab Controls für ein Property Sheet?

ICC_TAB_CLASSES
-------------------
Load tab and ToolTip control classes.


hier nachzulesen:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/common/structures/initcommoncontrolsex.asp

Der Aufruf *muss* erfolgreich sein. Ansonsten fehlt comtl32.dll oder ist nicht Version 6 oder höher. Eine Manifest Datei muss auch vorhanden sein:

Sephiroth
2006-11-05, 22:01:41
Ja, die ICC_STANDARD_CLASSES umfassen nur

ICC_STANDARD_CLASSES
-------------------------
Load one of the intrinsic User32 control classes. The user controls include button, edit, static, listbox, combobox, and scrollbar.

Brauchst Du nicht die Tab Controls für ein Property Sheet?

ICC_TAB_CLASSES
-------------------
Load tab and ToolTip control classes.


hier nachzulesen:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/common/structures/initcommoncontrolsex.asp

Der Aufruf *muss* erfolgreich sein. Ansonsten fehlt comtl32.dll oder ist nicht Version 6 oder höher. Eine Manifest Datei muss auch vorhanden sein:
Danke, jetzt kommt schonmal nen true zurück. :)
Funktionieren tut es dennoch nicht.

Gibt es eine spezielle "Stelle", wann ich den Aufruf machen muß? Hab das vorher noch nie gemacht, wie man unschwer erkennt. ^^

Juerg
2006-11-06, 08:29:50
Das erste was Deine Anwendung machen *muss*, bevor irgendetwas anderes geschieht, ist die InitCommonControlsEx aufrufen. Also noch bevor CreateWindow oder CreateWindowEx. Irgend etwas in dieser Art:
INITCOMMONCONTROLSEX cc;
memset(&cc, 0, sizeof(INITCOMMONCONTROLSEX));

cc.dwSize = sizeof(INITCOMMONCONTROLSEX);
cc.dwICC = ICC_TAB_CLASSES | ICC_WIN95_CLASSES;
InitCommonControlsEx(&cc);

hWnd = CreateWindowEx(NULL,
WC_TABCONTROL,
"MyPropertiesClassName",
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
0, 0,
100, 100,
hWndParent,
NULL,
hInstance,
NULL);

Sephiroth
2006-11-06, 20:30:55
Aufrufen tu ich es in der Implementierung der Methode Initialize von IShellExtInit - das ist afaik früh genug. Danach wird meine AddPages Implementierung von IShellPropSheetExt aufgerufen (geschieht automatisch, wenn Initialize grünes Licht gibt). Dort erstelle ich nun die property sheet page mit CreatePropertySheetPage(). Und genau da scheint das eigentliche Problem zu liegen, denn: CreatePropertySheetPage Function (http://windowssdk.msdn.microsoft.com/en-us/library/ms670337.aspx)
Note Before common controls version 7.0, this function did not support visual styles.

WTF? Version 7? Das müsste Aero sein. :frown:

Sephiroth
2006-11-06, 20:53:31
copy an Explorer.exe.manifest to the same directory where explorer.exe is.

reboot the computer or Kill Explorer.exe with TaskMgr ,

then you will see.

i copy Explorer.exe.manifest because the property sheet is a child thread of explorer.exe, and the .manifest file only work with Host Exe File , and it is only loaded when the program start up.
(link (http://www.codeproject.com/shell/shellextguide5.asp?df=100&forumid=573&exp=0&fr=26&select=1209507#xx1209507xx))

Das geht sogar :ugly:. aber anders muß es doch auch gehen. ;(

Juerg
2006-11-07, 10:50:00
Vielleicht solltest Du mal folgende Seiten von Michael Dunn zu Gemüte führen:

The Complete Idiot's Guide to Writing Shell Extensions - Part I bis IX
http://www.codeproject.com/shell/ShellExtGuide.asp

Speziell die Initialize Interface Seite:
http://www.codeproject.com/shell/shellextguide5.asp#inititf

CYourClassShlExt sollte das IShellExtInit Interface implementieren und dann:


STDMETHODIMP CYourClassShlExt::Initialize (bla... bla...)
{
bla... bla...

INITCOMMONCONTROLSEX iccex = { sizeof(INITCOMMONCONTROLSEX), ICC_DATE_CLASSES };

// Init the common controls.
InitCommonControlsEx ( &iccex );

Lade mal das Demo herunter. Vielleicht hat Du damit Erfolg:
http://www.codeproject.com/shell/ShellExtGuide5/ShellExtGuide5_demo.zip

Sephiroth
2006-11-07, 14:15:04
Vielleicht solltest Du mal folgende Seiten von Michael Dunn zu Gemüte führen:

The Complete Idiot's Guide to Writing Shell Extensions - Part I bis IX
http://www.codeproject.com/shell/ShellExtGuide.asp

Speziell die Initialize Interface Seite:
http://www.codeproject.com/shell/shellextguide5.asp#inititf

CYourClassShlExt sollte das IShellExtInit Interface implementieren und dann:


STDMETHODIMP CYourClassShlExt::Initialize (bla... bla...)
{
bla... bla...

INITCOMMONCONTROLSEX iccex = { sizeof(INITCOMMONCONTROLSEX), ICC_DATE_CLASSES };

// Init the common controls.
InitCommonControlsEx ( &iccex );

Lade mal das Demo herunter. Vielleicht hat Du damit Erfolg:
http://www.codeproject.com/shell/ShellExtGuide5/ShellExtGuide5_demo.zip
Ich habe mich doch daran gehalten und in Beitrag #3 steht auch, daß eben genau dieser Code neukompiliert keinen XP-Style mehr nutzt.

Juerg
2006-11-07, 18:33:41
Hast Du das Kompilat mal auf einer anderen Maschine versucht auszuführen?

Sephiroth
2006-11-07, 19:43:16
gleiches Resultat

Juerg
2006-11-08, 12:13:58
Grrmbl... Habe mich mal näher damit beschäftigt. Es sieht so aus als dass COM Objekte die auf die Active Template Library aufsetzen *nicht* XP Themes fähig sind.

Sephiroth
2006-11-08, 19:51:15
Da muß aber etwas im argen liegen, denn das bereits kompilierte Beispiel von Michal Dunn auf codegproject.com nutzt die visual styles.
Ich fürchte bald das es an der Express Edition liegt.

Juerg
2006-11-08, 22:27:18
Ja ich fürchte, Du hast recht. Ich habe ja schon geschrieben, dass die Express Edition keine ATL unterstützt.

Nachdem ich einen abartig versteckten "Bug" korrigiert habe, funktioniert das Beispiel http://www.codeproject.com/shell/She...uide5_demo.zip anstandslos.

Ich hatte zuerst VS2005 Prof Edition versucht mit dem Ergebnis: :eek:

warning Registry.SetValue deprecated
fatal error CVT1100 duplicate resource tape:MANIFEST, name:2, language:0x0409 file: CVTRES
fatal error LINK1123: failure during conversion to COFF: file invalid or corrupt file:FileTime

Nachdem der Versuch mit VS6.0 noch viele Fehler mehr produzierte :rolleyes: habe ich halt den (die) Fehler in VS2005 versucht auszubügeln. Was mir auch gelungen ist.

Leider kann ich VS2005 nicht hier reinstellen :D

Sephiroth
2006-11-08, 22:33:57
Und bei dir hat es dann die den XP-Style genutzt?
Was musstest du denn ändern?
Werde mal in der Uni nachsehen, was die für eine Version haben.

So an sich funktioniert es ja ... ;(

Juerg
2006-11-08, 22:46:47
Ja, der XP-Style wurde für die Date Controls angewendet.

Ich habe in winuser.rh die Konstante: ISOLATIONAWARE_MANIFEST_RESOURCE_ID geändert. Damit sind die beiden fatalen Fehler gelöst. Die Warnung von SetValue kannst Du für den Moment getrost vernachlässigen.

Juerg
2006-11-08, 22:49:07
Ach übrigens ICC_DATE_CLASSES ist schon richtig. Ich habe zuerst gedacht, dass das Property Sheet selbst, also der Tab Control kein XP-Style aufweist. Deshalb hab ich ICC_TAB_CLASSES vorgeschlagen.