Farbiger Hintergrund bei Dialogboxen

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Farbiger Hintergrund bei Dialogboxen

    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)

    VB.NET-Quellcode

    1. Private Function WindowProc(ByVal hwnd As LongPtr, ByVal uMsg As Long, _
    2. ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    3. Dim tPS As PAINTSTRUCT
    4. Select Case uMsg
    5. Case &HF ' WM_PAINT
    6. BeginPaint hwnd, tPS: EndPaint hwnd, tPS ' Gesamte Dlgbox mit Farbe füllen
    7. Case &H136 ' WM_CTLCOLORDLG
    8. WindowProc = mhBrush: Exit Function ' Hintergrundfarbe der Dlg setzen lParam=Dlg-Handle
    9. Case &H138 ' WM_CTLCOLORSTATIC
    10. SetBkMode wParam, 1 ' 1 = Transparent ' wParam => Zeiger auf DC
    11. SetTextColor wParam, mtSCHRIFT.Textfarbe ' Schriftfarbe des Textfeldes setzen
    12. WindowProc = mhBrush: Exit Function ' Hintergrund des Textfeldes und Icon
    13. End Select
    14. WindowProc = CallWindowProcA(mlpOldProc, hwnd, uMsg, ByVal wParam, ByVal lParam)
    15. 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