Давайте разберемся как изменить цвета элементов в диалоговом окне. Вот такую цветовую раскраску я хочу получить. Этот шаг является некоторым развитием шага 48, в котором мы просто меняли стиль закраски окна. Теперь мы можем менять цвет отдельных элементов.
Создаем приложение MFC AppWizard на базе диалогового окна с именем TestDlg. Для управления цветами нам надо перехватить сообщение WM_CTRCOLOR. Это можно сделать через Add Windows Message Handler. В таблице откликов должна появиться следующая запись.
BEGIN_MESSAGE_MAP(CTestDlgDlg, CDialog) ........ ON_WM_CTLCOLOR() ........ END_MESSAGE_MAP()
Общая мысль заключается в том, что есть возможность создать кисть для каждого отдельного типа элементов управления и сохранив ее использовать для закраски этих элементов вот и объявим ее в классе диалогового окна.
class CTestDlgDlg : public CDialog { ...... //}}AFX_DATA CBrush* m_pEditBkBrush; ...... };
В конструкторе ее надо записать:
CTestDlgDlg::CTestDlgDlg(CWnd* pParent /*=NULL*/) : CDialog(CTestDlgDlg::IDD, pParent) { ...... m_pEditBkBrush = new CBrush(RGB(0, 0, 0)); }
И удалить при разрушении окна:
BOOL CTestDlgDlg::DestroyWindow() { // TODO: Add your specialized code here and/or call the base class delete m_pEditBkBrush; return CDialog::DestroyWindow(); }
Ну, а теперь сама функция обработки цветов.
HBRUSH CTestDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { switch (nCtlColor) { case CTLCOLOR_EDIT: { pDC->SetTextColor(RGB(0, 255, 0)); pDC->SetBkColor(RGB(0, 0, 0)); return (HBRUSH)(m_pEditBkBrush->GetSafeHandle()); } default: return (HBRUSH) CDialog::OnCtlColor(pDC, pWnd, nCtlColor); } }
В параметре nCtlColor передается тип элемента, к которому требуется тип закраски. И в зависимости от него мы возврашаем кисть.