Guys, can someone give me a brief run through of how to change the background colour of a CEdit control at runtime? I want to be able to change the background to red if the field is zero length and the normal white otherwise.
1) Added "CBrush m_brush" to the header public. 2) Added "m_brush. CreateSolidBrush(RGB(255, 0, 0))" on init. 3) Added OnCtlColor in Dlg.
MFC provides a CWnd::OnCtlColor function for that. Actually this function handles the WM_CTLCOLOR messages of the window. The framework calls this member function when a child control is about to be drawn. If you want to do it in the Win32 application just handle the message WM_CTLCOLORSTATIC .
You cannot do it with a plain CEdit, you need to override a few bits.
Implement your own ON_WM_CTLCOLOR_REFLECT handler, then return your coloured CBrush in the handler:
(roughly, you'll need to put the usual resource management in there, rememebr to delete your brush in the destructor)
class CColorEdit : public CEdit
{
....
CBrush m_brBkgnd;
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor)
{
m_brBkgnd.DeleteObject();
m_brBkgnd.CreateSolidBrush(nCtlColor);
}
}
This can also be done without deriving from CEdit:
ON_WM_CTLCOLOR()
to your dialog's BEGIN_MESSAGE_MAP()
code block.Add OnCltColor()
to your dialog class:
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
Implement OnCtlColor()
like so:
HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if ((CTLCOLOR_EDIT == nCtlColor) &&
(IDC_MY_EDIT == pWnd->GetDlgCtrlID()))
{
return m_brMyEditBk; //Create this brush in OnInitDialog() and destroy in destructor
}
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With