Hallo,
ich möchte die Hintergrundfarbe einer MsgBox ändern.
Im Prinzip habe ich auch schon eine funktionierende Lösung, die allerdings je nach Laune von Windows funktioniert oder auch nicht.
Vielleicht hat ja ein API-Spezialist Ideen oder Erklärungen warum das nicht sauber funktioniert.
Für die Msgbox (hier die Sofmodalmessagebox, kann aber auch jede andere Version sein) habe ich eine WindowProc-Umleitung eingerichtet.
mlpOldProc = SetWindowLongA(mhDlg, GWL_WNDPROC, AddressOf WindowProc)
Für die DlgBox selbst und für die beiden Statics (Icon und Textfeld) werden die beiden WM_CTLCOLOR..-Messages versendet.
Die Textfarbe wird gesetzt und der Pinsel mhBrush zurückgegeben.
Funktioniert tadellos.
Jetzt meine Frage.
Das kann 10 mal gut gehen und plötzlich wird beim nächsten Aufruf keine Hintergrundfarbe gesetzt.
Ich habe festgestellt, dass in diesen Fällen auch keine WM_CTLCOLOR..-Message hier ankommt.
Irgendwann nach weiteren Aufrufen ist wieder alles ok.
Am Aufruf oder irgendwelchen Parametern hat sich nichts geändert. mhBrush ist ebenfalls gefüllt.
Zweite Frage:
Ich habe in einer anderen Prozedur noch weitere Statics (Textfelder) mit CreateWindowEx hier implementiert und das Originaltextfeld ausgeblendet oder auch destroyed.
Die funktionieren bzgl. der Hintergrundfarbe gar nicht, obwohl für diese Statics die WM_CTLCOLOR..-Messages und die passendenden Handle hier ankommen.
Manchmal wird ein Teilbereich hier eingefärbt, der aber nicht den Bereich der Statics färbt, sondern wie mir scheint nur der Bereich des Originaltextfeldes, auch wenn dieses ausgeblendet oder destroyed wurde.
Das ganze entzieht sich meiner Logik.
Hat jemand dazu eine Meinung?
Gruß
Karl-Heinz
ich möchte die Hintergrundfarbe einer MsgBox ändern.
Im Prinzip habe ich auch schon eine funktionierende Lösung, die allerdings je nach Laune von Windows funktioniert oder auch nicht.
Vielleicht hat ja ein API-Spezialist Ideen oder Erklärungen warum das nicht sauber funktioniert.
Für die Msgbox (hier die Sofmodalmessagebox, kann aber auch jede andere Version sein) habe ich eine WindowProc-Umleitung eingerichtet.
mlpOldProc = SetWindowLongA(mhDlg, GWL_WNDPROC, AddressOf WindowProc)
VB.NET-Quellcode
- Private Function WindowProc(ByVal hwnd As LongPtr, ByVal uMsg As Long, _
- ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
- Dim tPS As PAINTSTRUCT
- Select Case uMsg
- Case &HF ' WM_PAINT
- BeginPaint hwnd, tPS: EndPaint hwnd, tPS ' Gesamte Dlgbox mit Farbe füllen
- Case &H136 ' WM_CTLCOLORDLG
- WindowProc = mhBrush: Exit Function ' Hintergrundfarbe der Dlg setzen lParam=Dlg-Handle
- Case &H138 ' WM_CTLCOLORSTATIC
- SetBkMode wParam, 1 ' 1 = Transparent ' wParam => Zeiger auf DC
- SetTextColor wParam, mtSCHRIFT.Textfarbe ' Schriftfarbe des Textfeldes setzen
- WindowProc = mhBrush: Exit Function ' Hintergrund des Textfeldes und Icon
- End Select
- WindowProc = CallWindowProcA(mlpOldProc, hwnd, uMsg, ByVal wParam, ByVal lParam)
- End Function
Für die DlgBox selbst und für die beiden Statics (Icon und Textfeld) werden die beiden WM_CTLCOLOR..-Messages versendet.
Die Textfarbe wird gesetzt und der Pinsel mhBrush zurückgegeben.
Funktioniert tadellos.
Jetzt meine Frage.
Das kann 10 mal gut gehen und plötzlich wird beim nächsten Aufruf keine Hintergrundfarbe gesetzt.
Ich habe festgestellt, dass in diesen Fällen auch keine WM_CTLCOLOR..-Message hier ankommt.
Irgendwann nach weiteren Aufrufen ist wieder alles ok.
Am Aufruf oder irgendwelchen Parametern hat sich nichts geändert. mhBrush ist ebenfalls gefüllt.
Zweite Frage:
Ich habe in einer anderen Prozedur noch weitere Statics (Textfelder) mit CreateWindowEx hier implementiert und das Originaltextfeld ausgeblendet oder auch destroyed.
Die funktionieren bzgl. der Hintergrundfarbe gar nicht, obwohl für diese Statics die WM_CTLCOLOR..-Messages und die passendenden Handle hier ankommen.
Manchmal wird ein Teilbereich hier eingefärbt, der aber nicht den Bereich der Statics färbt, sondern wie mir scheint nur der Bereich des Originaltextfeldes, auch wenn dieses ausgeblendet oder destroyed wurde.
Das ganze entzieht sich meiner Logik.
Hat jemand dazu eine Meinung?
Gruß
Karl-Heinz