Hintergrundfarbe von CDialog setzen



  • Hallo,

    so nach und nach kämpf ich mich voran in MFC... 🙂

    Was ist denn die einfachste Möglichkeit, die Hintergrundfarbe eines CDialog-Objekts zu setzen? Geht das evtl. über die Ressourcen-Eigenschaften (wobei ich da bisher nichts passend Klingendes gefunden habe) oder welche Methode (MFC) überschreibt man da ansonsten am Einfachsten oder kann man die Hintergrundfarbe bei CDialog gar nicht ändern?

    Gruß Maik



  • Schreibe in deiner InitInstance Funktion die Funktion

    SetDialogBkColor(RGB(255, 255, 213));
    

    rein...
    Die Colorwerte musst du natürlich noch anpassen.



  • guenni81 schrieb:

    Schreibe in deiner InitInstance Funktion die Funktion

    SetDialogBkColor(RGB(255, 255, 213));
    

    rein...
    Die Colorwerte musst du natürlich noch anpassen.

    In die InitInstance vom Objekt, das von CWinApp oder CDialog abgeleitet wird?

    Hab beides grad mal probiert.

    Im Fall:

    CWinApp: Lässt sich zwar kompilieren, aber kein Unterschied erkennbar.

    CDialog: Kennt die Methode SetDialogBkColor (...) nicht und zwar überhaupt nicht, wie der Compiler meint - liegt also nicht an schiefen Parametern.

    Hm. Was mach ich da falsch?



  • Versuch es mal mit SetBkColor(...) in der OnInitDialog() - Funktion.
    -- mein Fehler, funktioniert nicht. --



  • Du musst die Funktion aufrufen bevor du den Dialog öffnest aufrufst.
    Ich meinte die InitInstance Methode deiner von CWinApp abgeleiteten Klasse
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cwinapp.3a3a.setdialogbkcolor.asp



  • Sonst kannst du auch auf die WM_CTLCOLOR message reagieren.

    //in der Headerdatei eine Membervariable vom Typ CBrush erstellen
    CBrush m_brDialog;
    
    // im Konstruktor
    m_brDialog.CreateSolidBrush(RGB(255,0,0));
    
    // in der OnCtlColor()
    HBRUSH CTMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    	if (nCtlColor == CTLCOLOR_DLG)
    	{		
    		return (HBRUSH)m_brDialog.GetSafeHandle();
    	}
    	else return hbr;
    }
    


  • Hab jetzt der Reihe nach mal alle Vorschläge durchprobiert, aber in keinem Fall erfolgreich... Das Fenster bleibt stur hellgrau. :p



  • Wirklich. Den Vorschlag, den ich vorhing gepostet habe, habe ich extra ausprobiert. Zeig mal den Quellcode deiner WM_CTLCOLOR - Methode.



  • Du kannst auch OnClear() überschreiben und dort mit dem Hintergrund machen, was du willst. Z.B. ein Bild zeichnen, Farbverlauf usw.



  • Paul_C. schrieb:

    Wirklich. Den Vorschlag, den ich vorhing gepostet habe, habe ich extra ausprobiert. Zeig mal den Quellcode deiner WM_CTLCOLOR - Methode.

    Bei mir bin ich ebenfalls sicher das dies bei einer Dialoganwendung funktioniert, da ich dies selbst verwendet habe.

    Zeig mal dein Code wie du es versucht hast 😉

    Alternativ kannst du hier noch vorbeischaun...
    http://www.coding-help.de/dialoge_allg.html#Farbiger_Dialog



  • Na endlich, der Eintrag von "ON_WM_CTLCOLOR()" in der richtigen Message-Map hat noch gefehlt... 😉

    BEGIN_MESSAGE_MAP(CJSI_INI_FrontendDlg, CDialog)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_CTLCOLOR()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    	ON_COMMAND(ID_Settings, OnSettings)
    	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnLvnItemchangedList1)
    	ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
    	ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
    END_MESSAGE_MAP()
    

    ( Den Klassenassistenten, so wie er in div. Literatur erklärt wird, finde ich im Visual C++ .NET (2003), in dem ich hier praktiziere, nicht mehr. Über den sollte es ja laut meinem Schmöker hier recht einfach sein, den Nachrichtenverkehr von Klassen zu regeln. Ist der rausgeflogen? Werden diese Nachrichten-Geschichten inkl. Message-Maps heutzutage ausschließlich manuell geführt oder gibts da andere Techniken? Wobei ich das nächste Mal, wenn auf eine Nachricht nicht reagiert wird, da natürlich zuerst mal nachschauen würde, aber vielleicht lässt sich da ja was Eleganteres angewöhnen, sodass man gar nicht erst nachschauen muss. 😉 )



  • Jein, der ist/ ist nicht rausgeflogen.
    Wenn du deine ...dlg.cpp geöffnet hast, dann kannst du unter Einstellung (F4) auf das Symbol rechts vom Blitz klicken und erhältst eine Liste aller Nachrichten.
    Dann kannst du anhand der DropDown-List <Hinzufügen> auswählen.
    🙂



  • Macht mal eher eine Bitabfrage rein:

    HBRUSH Cxxx::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    	if(nCtlColor & CTLCOLOR_STATIC)
    	{
               // Set the static text to white on blue.
               pDC->SetTextColor(RGB(0, 0, 0));
               pDC->SetBkColor(0xFFFFF0);
               // Drop through to return the background brush.
    	}
    	if(nCtlColor & CTLCOLOR_DLG){return m_BackBrush;}
    
        return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
    }
    

    der Brush in der Init sollte auch auf dieselbe Farbe z.B. hier 0xFFFFF0
    gesetzt werden.


Anmelden zum Antworten