Шаг 196 - Цвета элементов в диалоговом окне

Давайте разберемся как изменить цвета элементов в диалоговом окне. Вот такую цветовую раскраску я хочу получить. Этот шаг является некоторым развитием шага 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 передается тип элемента, к которому требуется тип закраски. И в зависимости от него мы возврашаем кисть.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.