5 votes

changer la couleur de fond d'une boîte de dialogue mfc

J'essaie de changer la couleur de fond d'une boîte de dialogue (win 7, vs2010,c++). J'ai essayé d'attraper WM_CTLCOLOR ,WM_ERASEBKGND et de changer la couleur. J'ai réussi à changer la couleur de fond de cette façon, mais quand la fenêtre finit de se télécharger, la couleur est revenue à la valeur par défaut mais j'ai remarqué que le cadre est dans la bonne couleur. Je pense que je change la fenêtre et non la boîte de dialogue ou quelque chose comme ça. Je fais cela avec WTL (pas AFX).

Que dois-je faire ?

9voto

Michael Walz Points 3346

Essayez ça :

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    //{{AFX_DATA(CAboutDlg)
    enum { IDD = IDD_ABOUTBOX };
    //}}AFX_DATA

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CAboutDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:
    //{{AFX_MSG(CAboutDlg)
    //}}AFX_MSG
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
    //{{AFX_DATA_INIT(CAboutDlg)
    //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //{{AFX_MSG_MAP(CAboutDlg)
    ON_WM_ERASEBKGND()
    //}}AFX_MSG_MAP

END_MESSAGE_MAP()

BOOL CAboutDlg::OnEraseBkgnd(CDC* pDC)
{
    CRect rect;
    GetClientRect(&rect);
    CBrush myBrush(RGB(255, 255, 255));    // dialog background color
    CBrush *pOld = pDC->SelectObject(&myBrush);
    BOOL bRes  = pDC->PatBlt(0, 0, rect.Width(), rect.Height(), PATCOPY);
    pDC->SelectObject(pOld);    // restore old brush
    return bRes;                       // CDialog::OnEraseBkgnd(pDC);
}

Et jetez un coup d'œil aquí

4voto

0x000f Points 770

La meilleure solution est de remplacer WM_CTLCOLOR, l'arrière-plan des contrôles tels que STATIC sera rempli avec votre couleur également.

BEGIN_MESSAGE_MAP(YourDlg, CDialogEx)
    ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
...
HBRUSH YourDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    return (HBRUSH)GetStockObject(WHITE_BRUSH);
}

1voto

Akash das Points 300

La réponse ci-dessus ne fonctionnera que si vous n'avez pas d'onglet dans la boîte de dialogue. Elle colorera l'arrière-plan de la boîte de dialogue en dehors de la partie onglet. Pour la partie onglet, vous devez créer une nouvelle classe dérivée de la classe de base CTabCtrl.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X