Allgemeine Steuerelemente werden nicht ordnungsgemäß mit dem WM_CTLCOLORSTATIC-Handler gezeichnet, nachdem ich Visual Styles aktiviert habe

8

EINFÜHRUNG UND RELEVANTE INFORMATION:

Ich habe 2 Dialogfelder erstellt über Ressourceneditor . Da ich Microsoft Visual Studio Express Edition verwende, musste ich den Editor für freie Ressourcen herunterladen, um sie zu erstellen. In meinem Programm habe ich Visual Styles wie folgt aktiviert:

%Vor%

Soweit ich weiß, Kontrollkästchen , Optionsfeld und Gruppenfeld erhalten Sie WM_CTLCOLORSTATIC Nachricht zum Malen ihres Textes.

Das habe ich für das erste und zweite -Dialogfeld programmiert:

%Vor%

Ich möchte, dass diese Steuerelemente transparenten Texthintergrund und schwarze Farbe ihres Textes haben.

DAS PROBLEM:

Auf Windows XP , hier ist das Ergebnisbild für den ersten Dialog:

Gruppenfeld hat blauen und braunen Rand, während Kontrollkästchen alles schwarz markiert. Auf Windows 7 , nachdem ich das gleiche Programm gestartet habe, bekomme ich folgendes:

Hier haben Gruppenfeld und Kontrollkästchen die richtige Textfarbe, aber den Hintergrund des Kontrollkästchens und den Rand des Gruppenfeld sind falsch. In meinem Dialogfeld habe ich statische Steuerelemente und sie sind ordnungsgemäß sowohl auf Windows 7 und Windows XP .

WAS HABE ICH SO WEIT VERSUCHT:

Ich habe das SO-Archiv durchsucht, aber nichts gefunden, was ich verwenden könnte, um meinen WM_CTLCOLORSTATIC -Handler zu ändern.

Ich habe eine Problemumgehung gefunden, die Visual Styles von diesen Steuerelementen entfernt, so dass das gewünschte Ergebnis erzielt werden kann, aber ich muss die Visual Styles und den Hintergrund des Textes transparent machen, damit diese Lösung mich nicht befriedigen kann.

Nachdem ich Visual Styles-Referenz durchgelesen und ein wenig experimentiert habe, habe ich einen Workaround für das Optionsfeld und Kontrollkästchen gefunden (aber nicht für Gruppenfeld ) mit dem folgenden Code:

%Vor%

Trotzdem habe ich "die Wand getroffen":

In meinem Dialogfeld gibt es eine Baumansicht und sobald ich einen Knoten auswähle und Leertaste (oder irgendeinen anderen Schlüssel) drücke, wird die Hintergrund-Bitmap über meine statische Steuerelemente.

Nachdem ich DrawThemeParentBackground() auskommentiert habe, das Programm neu kompiliert und gestartet habe, funktioniert alles (wenn ich den Baumknoten auswähle und Leertaste drücke), dann bin ich "auf Platz eins".

DIE FRAGEN:

  1. Wie kann ich meinen WM_CTLCOLORSTATIC -Handler ändern, um mein Problem zu beheben?

  2. Wenn das obige nicht möglich ist, kann ich den gewünschten Effekt mit NM_CUSTOMDRAW bekommen?

HINWEIS:

Ich denke, dass ich group box mit GDI zeichnen muss. Wenn dies der Fall ist, werde ich auch diese Lösung akzeptieren, da mein Hauptanliegen checkbox und radio button ist.

BEARBEITET MIT VORGEGEBENEM BEISPIEL PROJEKT:

Auf Anfrage sende ich eine SSCCE ein. Gehen Sie folgendermaßen vor, um das Projekt zu erstellen:

1.) Erstellen Sie das Standard-Win32-Projekt in Visual Studio.

2.) Kopieren Sie im stdafx.h die folgenden Direktiven unter #include <windows.h> :

%Vor%

3.) Ändern Sie im Ressourceneditor das Dialogfeld Über , indem Sie zwei Optionsfelder , zwei Kontrollkästchen und ein hinzufügen Gruppenbox umschließen (siehe auch die obigen Bilder, um zu sehen, was ich meine) und ein treeview Steuerelement hinzufügen (dieses Steuerelement löst das Problem aus).

4.) Fügen Sie in Ihrer Hauptdatei cpp die Hilfsfunktion zum Zeichnen des benutzerdefinierten Hintergrunds hinzu:

%Vor%

5.) Initiiere common controls in _tWinMain :

%Vor%

6.) Fügen Sie einige Elemente in die Baumansicht in WM_INITDIALOG :

ein %Vor%

7.) Zeichnen Sie den benutzerdefinierten Hintergrund des Dialogfelds:

%Vor%

8.) Fügen Sie den Handler für WM_CTLCOLORSTATIC :

hinzu %Vor%

Das wären alle erforderlichen Schritte und Informationen, um ein minimales Programm zu erstellen, das das Problem aufzeigt. Führen Sie nun die Anwendung aus und beobachten Sie die Unterschiede:

Optionsfeld mit IDC_RADIO1 und Kontrollkästchen mit IDC_CHECK1 wird korrekt dargestellt (transparenter Text mit schwarzer Farbe), während anderes Kontrollkästchen und Radio Button wird nicht. Nachdem Sie auf treeview geklickt und Leertaste gedrückt haben, sehen Sie das Problem mit dem Dialoghintergrund.

ENDE VON EDIT

Danke.

Beste Grüße.

    
AlwaysLearningNewStuff 20.03.2014, 09:01
quelle

2 Antworten

3

Ich habe Ihren Dialog erstellt und es sowohl in xp als auch in 7 ausgeführt und alles ist gut gelaufen. Was Sie tun sollten, ist folgendes:

Erstellen Sie eine Bitmap im Speicher und machen Sie alle Ihre Zeichnungen dort. Dies sollte der Dialoghintergrund sein.

%Vor%

Zum Erstellen von Radiobutton und Checkbox verwenden Sie die Klasse "button" nicht statisch mit

%Vor%

Stile.

In Ihrem Dialog sollten Sie einschließen

%Vor%

Stil. Dies löst den Hintergrund, der die Steuerelemente beim Drücken von Leerzeichen überlagert.

Sie sollten den Hintergrund des Dialogs nicht in WM_ERASEBKGND message sondern in WM_PAINT

zeichnen %Vor%

Und schließlich für den transparenten Hintergrund, in WM_NOTIFY :

%Vor%

Am Ende entsorgen Sie Ihre Ressourcen:

%Vor%

BEARBEITEN

%Vor%

EDIT2 (zum Ändern der Größe)

Ändern Sie WM_PAINT:

%Vor%

In WM_SIZE:

%Vor%

Damit die Größenänderung funktioniert, müssen Sie hdcMemDialogBackground mit dem Maximum erstellen Dimensionsdialogbox wird zB 1280x1024 oder 1680x1050 oder irgendeinen anderen haben.

Das ist es.

valter

    
quelle
2

Im WM_CTLCOLORSTATIC -Handler können Sie nur BG von statischen Steuerelementen ändern.

Drucktasten, Optionsfelder und Prüftasten sind die gleichen Steuer - Tasten. Um BG zu ändern, müssen Sie mit WM_CTLCOLORBTN umgehen. Ein Beispiel finden Sie hier .

    
Dmitry Sokolov 22.03.2014 11:20
quelle

Tags und Links