XP-Styles in Buttonbar

German support forum

Moderators: white, Hacker, Stefan2

Sven
Member
Member
Posts: 111
Joined: 2003-02-10, 21:32 UTC
Location: Varel, Germany
Contact:

Post by *Sven »

ghisler(Author) wrote:TC verwendet ein einziges nicht durchsichtiges Bitmap fuer den Buttonbar - nicht für jeden Button ein Bitmap! Der ganze Toolbar kann so auf einmal gezeichnet werden. Deshalb geht das so leider nicht mit der Transparenz...
1) Imageliste erstellen und transparente Farbe festlegen (wahrscheinlich 192,192,192) - ImageList_Create
2) Toolbar-Bitmap der Imageliste hinzufügen - ImageList_AddBitmap
3) Zum Zeichnen der Buttons ImageList_Draw verwenden
User avatar
Lefteous
Power Member
Power Member
Posts: 9535
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

2Sven

zu 1) Transparente Farbe einer ImageList auf einen bestimmten Wert festlegen? Wie soll das gehen? Die Transparenz wird, soweit ich weiß, durch Masken-Bitmaps erreicht. Wird ein Symbol hinzugefügt werden sie automatisch erstellt.

zu 2) Eine solche Funktion ist mir unbekannt.


2ghisler(author)
Leider habe ich bisher nicht herausgefunden, wie man die Icons selbst in eine Datei speichern könnte.
Ich benutze hierzu gerne ImageList_Read und ImageList_Write.
Der Toolbar verwendet Halbdurchsichtigkeit und verschiedene Farben für inaktiv, Maus über dem Button etc.
Das wären dann also 3 verschiedene ImageLists für Normal, "Maus über Button" und Indeterminate:

"Maus über Button": Das sehe ich eher als Bonus an - "nice to have", muss aber nicht sein.
Indeterminate: Das wird ja im Total Commander nicht verwendet - oder täusche ich mich da.
Sven
Member
Member
Posts: 111
Joined: 2003-02-10, 21:32 UTC
Location: Varel, Germany
Contact:

Post by *Sven »

Sorry, da habe ich mich versehen, die MFC kapselt hier einiges an anderen Stellen. :oops: Das Bitmap wird via

Code: Select all

HIMAGELIST ImageList_LoadBitmap(
    HINSTANCE hi,
    LPCTSTR lpbmp,
    int cx,
    int cGrow,
    COLORREF crMask); 
hinzugefügt. Hier kann man den Farbwert der Maske angeben, bei mir ist der in der Regel (255, 0, 255).

Man braucht nur eine Imageliste. Die Buttoneffekte werden mit den UxTheme-Funktionen gezeichnet, das Bitmap wird immer nur drübergelegt.
User avatar
Lefteous
Power Member
Power Member
Posts: 9535
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

2Sven

ich hab gerade mal ein bißchen in der commctrl.h gestöbert. Das Teil ist einfach ein ImageList_LoadImage mit ein paar defaults:

#define ImageList_LoadBitmap(hi, lpbmp, cx, cGrow, crMask) ImageList_LoadImage(hi, lpbmp, cx, cGrow, crMask, IMAGE_BITMAP, 0)

Mit der Funktion wird dann die große Bitmap der ImageList hinzugefügt. Da würde ich eher ImageList_Read nehmen. Man extrahiert Icons mit ExtractIcon, fügt sie mit ImageList_AddIcon hinzu, mit ImageList_Write wird das ganze persistent gemacht und mit ImageList_Read wieder geladen. Da muss ich mich nicht mit Masken und Bitmaps rumquälen (aus der die ImageList intern natürlich weiterhin besteht ;)) .
User avatar
Lefteous
Power Member
Power Member
Posts: 9535
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

Ich versuche gerade die Problematik an einem eigenen Beispiel nachzuvollziehen. Ich habe dabei allerdings Probleme mit ImageList_DrawIndirect. Die neuen Elemente des Struktur werden beim Übersetzen als nicht bekannt angemeckert. Keine Ahnung woran das liegt.
Sven
Member
Member
Posts: 111
Joined: 2003-02-10, 21:32 UTC
Location: Varel, Germany
Contact:

Post by *Sven »

Eventuell hat MS die Struktur erweitert und Du benutzt noch veraltete Header-Dateien. Warum nimmst Du nicht einfach ImageList_Draw? Das sollte eigentlich reichen.
User avatar
Lefteous
Power Member
Power Member
Posts: 9535
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

2Sven

In der include-Datei steht:

#if (_WIN32_WINNT >= 0x501)
DWORD fState;
DWORD Frame;
COLORREF crEffect;
#endif

wenn ich die Bedingung entferne geht es. Was muss ich ändern, damit es auch ohne die Änderung geht?
Sven
Member
Member
Posts: 111
Joined: 2003-02-10, 21:32 UTC
Location: Varel, Germany
Contact:

Post by *Sven »

Das sind Werte, die erst ab XP unterstützt werden. Vermutlich ist bei Dir _WIN32_WINNT kleiner als 0x501 und der Präprozessor überspringt dann die entsprechenden Zeilen. Abhilfe schafft ein

Code: Select all

#define _WIN32_WINNT 0x501
vor dem Einschließen der Header-Dateien.

Man sollte aber extrem vorsichtig mit den #defines für _WIN32_WINDOWS und _WIN32_WINNT sein. Unter Umständen läuft die Software dann nicht mehr auf älteren Systemen.
Jonas
Senior Member
Senior Member
Posts: 325
Joined: 2003-05-27, 16:59 UTC
Location: Germany
Contact:

Post by *Jonas »

Ich würd einfach ganz brutal ein
#define _WIN32_WINNT 0x501
über das #include-statement setzen und schauen ob der rest dann auch noch geht....
User avatar
Lefteous
Power Member
Power Member
Posts: 9535
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

2Sven und 2Jonas

danke für Eure Tipps. Mich würde jetzt noch interessieren, warum bei mir _WIN32_WINNT < 0x501 ist. Ich habe ein Windows XP Pro von der Stange - irgendwas stimmt da nicht. Der Hinweis, dass das Programm dann unter älteren Windows-Versionen nicht läuft ist wohl nur zu richtig, deswegen möchte ich das Problem am liebsten dadurch lösen, dass Programm ohne "Kunstgriffe" übersetzt werden kann.
Zunächst werde ich aber mal schaun wie das ganze auf nem älteren System läuft.
Sven
Member
Member
Posts: 111
Joined: 2003-02-10, 21:32 UTC
Location: Varel, Germany
Contact:

Post by *Sven »

_WIN32_WINNT hat mit Deinem Betriebssystem überhaupt nichts zu tun. Dies ist ein Präprozessor-Makro und es steuert, welche Symbole und Funktionen aus den Windows-Headerdateien beim Kompilieren eingebunden werden sollen.

Mit welcher Programmiersprache bzw. mit welchem Compiler arbeitest Du?
User avatar
Lefteous
Power Member
Power Member
Posts: 9535
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

Sven wrote:_WIN32_WINNT hat mit Deinem Betriebssystem überhaupt nichts zu tun. Dies ist ein Präprozessor-Makro und es steuert, welche Symbole und Funktionen aus den Windows-Headerdateien beim Kompilieren eingebunden werden sollen.
jo das stimmt. Ich dachte halt, das wird irgendwo in Abhängigkeit vom OS gesetzt, das ist aber Unsinn.
ImageList_DrawIndirect ist zwar eine schöne Funktion, entgegen der MSDN-Doku funktioniert das Teil (auch ohne die erweiterte Struktur) nicht unter Windows 95 mit IE 3 und Commctrl 4.7.

Erste Ergebnisse aus meiner Aktion "Jugend forscht":
Es scheint, wie von ghisler schon angedeutet, einige Kompatibilitätsprobleme bei den Commctrl zu geben. Da hilft nur testen unter allen Commctrl-Versionen.
1. So habe ich festgestellt, dass die Toolbar unter Win 95 unter bestimmten Umständern (Flags) flackert, was bei einem identischen Programm unter XP nicht passiert. 100% eingekreist habe ich das Problem noch nicht.
2. Wenn ich meiner ImageList zum Beispiel 5 Symbole hinzufüge, die ersten beiden enthalten keine "XP-Symbole", die anderen schon. Wenn ich nun dem letzten Button TBSTATE_INDETERMINATE gebe wird der Button falsch gezeichnet (Er verhält sich inaktiv, sieht aber nicht so aus). Die Symbole mit niedriger Farbtiefe jedoch werden im inaktiven Status korrekt gezeichnet. Wenn ich nur "XP-Symbole in die ImageList lade, wird der inaktive Button korrekt gezeichnet (was ziemlich gut aussieht ;)).
3. Wenn ich die Nachricht TB_SETBITMAPSIZE nicht sende werden die Symbole unter Win 95 auf den Buttons an die falsche Stelle gemalt. Unter XP geht das auch ohne diese Nachricht.
4. Unter Win 95 habe ich es bislang nicht hingekriegt, einen Rechtsklick auf die ToolBar oder einen ToolButton abzufangen (Es wird immer 0 als erkannter Button zurückgegeben). Unter XP null problemo (immer der korrekte Index bzw. negativer Wert wenn Toolbar) :?:
Sven wrote: Mit welcher Programmiersprache bzw. mit welchem Compiler arbeitest Du?
MS 7.1 (IDE und Compiler)
Last edited by Lefteous on 2003-10-07, 11:02 UTC, edited 1 time in total.
User avatar
Lefteous
Power Member
Power Member
Posts: 9535
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

Eine Anmerkung noch zu 1.:

Das Flackern tritt auf wenn TBSTYLE_FLAT gesetzt wurde. Getestet habe ich das mit ImageList_AddIcon (vorheriges Extrahieren von Symbolen aus Bibliotheken) und ImageList_LoadImage (Laden einer Bitmap aus einer Datei). In beiden Fällen tritt das Verhalten auf.
User avatar
Lefteous
Power Member
Power Member
Posts: 9535
Joined: 2003-02-09, 01:18 UTC
Location: Germany
Contact:

Post by *Lefteous »

Schade, dass dieser Thread so im Sande verlaufen ist. Ich bin auf ein neues Problem gestoßen: Während das bei XP mitgelieferte Theme "Windows XP" keinen Hintergrund für Toolbars zeichnet, ist dies bei vielen anderen der Fall. Das sieht teilweise sehr eleganz aus. Als Referenz könnte man die Toolbar des Internet Explorers anführen. Hier wird der Hintergrund korrekt gezeichnet. Bei meinem Beispiel-Programm leider nicht. Jemand eine Idee?
Post Reply