MessageBox Hintergrundfarbe ändern?
-
Hallo alle zusammen,
hat jemand vielleicht 'ne Ahnung, wie ich die Farbe von einer MessageBox ändern kann?
Mit folgendem Code klappt es leider nicht:HBRUSH CSECalibToolDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbrYellowColor = CreateSolidBrush(RGB(248,204,31)); if( nCtlColor == CTLCOLOR_MSGBOX ) { return hbrYellowColor; } }MfG
Daniel Just
-
Kannst du auch mal dazusagen, was "nicht klappt"?
Mir fällt an diesem Code nur auf, daß jeder OnCtlColor-Aufruf (und davon kommen im Lauf des Programms etliche) einen neuen Brush erzeugt und zurückgibt - irgendwann sind deine GDI-Handles aufgebraucht und das Programm schmiert ab.
-
Die Hintergrundfarbe ändert sich nicht!
Die MessageBox bleibt grau und wird nicht zu diesem RGB-Wert!Das Programm schmiert nicht ab, es läuft weiter..
-
Wird denn der handler an dieser Stelle überhaupt aufgerufen? Das würde mich doch sehr wundern!
WM_CTLCOLORMSGBOX ist ein Relikt aus 16bit Zeiten und wird in keiner der neuen Windows API mehr verwendet.
Dir muss auch klar sein dass es in dem Sinne WM_CTLCOLOR auch nicht gibt. Dies ist eine interne Nachricht der MFC, um auch hier einfach Rückwärtskompatibel zu bleiben und auch das Farbenhandling auf einen Handler zu beschränken.
Imho müsstest Du einen CBT Hook erzeugen der mitbekommt wenn die MsgBox aufpoppt. In diesem Hook einen Subclass durchführen und dann wie gewohnt aggieren.
-
So wie ich das sehe wird die Nachricht an dieser Stelle gar nicht abgegeben. Innerhalb einer Dialigfeldklasse kannst du z.B. auf CTLCOLOR_DLG reagieren, um den ganzen Dialoghintergrund einzufärben. Messageboxen funktionieren nicht aus dem View heraus, die haben ihren eigenen Messagehandler.
Edit: Martin war mal wieder schneller. Außerdem solltest du das beherzigen, was CStoll gesagt hat. Nicht bei jedem Aufruf einen Brush erzeugen, das kommt in die Klammer rein.
-
mach aus der messagebox einen neuen dialog. dann klappts auch mit der einfärbung

-
Erstmal, habe ich die Pinsel in die Klammern gepackt...ihr habt völlig recht!
Hab ja noch welche ausserhalb gehabt.Dann...folgender MSDN-Eintrag sagt doch aber aus, das es funktionieren müsste,
oder verstehe ich da was falsch.CWnd::OnCtlColor
This method is called by the framework when a child control is about to be drawn. Most controls send this message to their parent, usually a dialog box, to prepare the pDC for drawing the control using the correct colors.afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );Parameters
pDC
Contains a pointer to the display context for the child window.
May be temporary.pWnd
Contains a pointer to the control asking for the color.
May be temporary.nCtlColor
Contains one of the following values, specifying the type of control:CTLCOLOR_BTN Button control
CTLCOLOR_DLG Dialog box
CTLCOLOR_EDIT Edit control
CTLCOLOR_LISTBOX List-box control
CTLCOLOR_MSGBOX Message box
CTLCOLOR_SCROLLBAR Scroll-bar control
CTLCOLOR_STATIC Static controlReturn Value
OnCtlColor must return a handle to the brush that is to be used for
painting the control background.Hier wird CTLCOLOR_MSGBOX erwähnt und das ich mittels pDC ( pDC->SetBkColor() )
theoretisch die Farbe ändern müsste ( wurde im "posted code" nicht erwähnt ).
Weder pDC->SetBkColor() noch der Weg im "posted code" funktioniert.Hooks und Subclassing kenne ich nicht, kann also nichts dazu sagen.
Werde mich da mal schlau machen.Ansonsten würde ich gerne eure Meinung über diesen MSDN-Eintrag haben.
-
Firefighter...du bist ja ein Trickser
!
Wenn ich keinen anderen Weg finde, dann tue ich das auch, bevor ich mir noch einen Wolf suche! ( wo kommen bloß immer die seltsamen Sprüche her :-{) )Danke!
-
think simple

-
Ich habe dazu bereits alles geschrieben was es zu schreiben gibt:
CTLCOLOR_MSGBOX ist obsolet genauso wie WM_CTLCOLORMSGBOX
-
Eine eigene MessageBox Funktion/Klasse kann IMHO sowieso nicht schaden. Diese Standard-Messageboxen mit "Press Yes to Blubb, No to Blobber or Abort to Bluddel" Texten sind sowieso grauenhaft.