Изменение цвета окна, цвета шрифта класса CEdit

Изменение цветовой гаммы окна редактирования CEdit ( цвета шрифта, цвета фона окна и другое) быстро и с "малыми потерями" (времени естественно) нам предоставляет MFC - серьезная и надежная поддержка Window-программистов и конечно же великий и могучий С++. Скорость работы приложения написанного с применением MFC выше, чем приложения написанные на управляемом С++. Еще много приложений будет сделано на MFC, а наиболее удобные функции можно использовать и в управляемом С++. Управлять цветовым характером окна редактирования можно двумя способами, а точнее из двух мест. Способ первый позволяет сделать это из функции
HBRUSH CWnd::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor).Эта функция вызывается тогда когда от дочернего окна управления ( CEdit, CStatic и др.) приходит уведомление о намерении перерисовать фон своего окна, что позволяет родителю выбрать кисть (brush) для фона окна управления.  Из этой функции можно управлять цветовой гаммой дочерних окон управления. Параметр CWnd* pWnd  позволяет нам определить от какого окна управления пришло уведомление, поскольку таких окон может быть несколько, и позволяет работать через указатель pWnd с данным дочерним окном.
HBRUSH CTestCMyEditDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
 
	// управляем цветовым характером окна редактирования
	// если уведомление о подготовке к перерисовке
	// пришло от окна редактирования
	// с индефикатором IDC_EDIT1 перерисуем
	// его по нашему усмотрению
	if( pWnd->GetDlgCtrlID() == IDC_EDIT1)
	{
    	// внутри этого блока pDC принадлежит окну
       //редактирования с идентификатором IDC_EDIT1
		pDC->SetBkMode(TRANSPARENT);
		pDC->SetTextColor(RGB(255,0,0));
 
		return m_Brush;
	}
 
	// TODO: Return a different brush
	// if the default is not desired
	return hbr;
}
 
Способ описанный выше более пригоден для небольшого количества дочерних окон управления иначе функция
HBRUSH CWnd::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
разрастется до больших и неудобных размеров. Более удобный второй способ предоставляет нам объектно-ориентированный С++ и конечно же MFC. Суть его в том, что управление цветом фона окна управления из "самого себя", а точнее создаем собственный класс производный от класса окна управления ( в данном случае CEdit) и творим в нем что хотим и как хотим. Благодаря инкапсуляции мы можем красиво и элегантно изменять цвет фона созданного нами окна редактирования и не только цвет фона, например:
m_MyEdit.SetColorBG( RGB(255, 0, 0) ).
Цвет фона будет красным без всяких if, else и тому подобное. И даже если таких объектов мы создадим большое количество это не намного увеличит размер кода родительского окна. А управлять мы будем из функции дочернего окна:
HBRUSH CtlColor(CDC* pDC, UINT nCtlColor)
Очень похожа на родительскую функцию, но параметра CWnd* pWnd здесь нет поскольку мы и находимся в этом же окне и опять же благодаря MFC  мы не работаем с "лишними" элементами кода.
HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
	// установка параметров отображения текста
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(m_ColorText);
 
	// TODO: Return a non-NULL brush if the parent's
	// handler should not be called
	// возвращение не нулевого объекта кисти если родительский
	// обработчик не должен быть вызван
	// измените код возвращения на (return NULL) и никаких 
	// цветовых изменений вы здесь  произвести не сможете
	return m_Brush;
}
Кроме того здесь нет приставки On. Особенность в том, что эта функция отлавливает собственное отраженное уведомление WM_CTLCOLOR о чем и свидетельствует название добавленного в карту сообщений макроса ON_WM_CTLCOLOR_REFLECT(). Если задержать курсор надназванием этого макроса в строке подсказки мы увидим, что за определением этого макроса скрывается "уйма" кода который благодаря MFC скрыт от нас и не вызывает головную боль.
В конце приведем практический пример класса CMyEdit, который с минимальными доработками может использоваться в ваших приложениях.CMyEdit позволяет нам легко изменять в окне редактирования вид, размер, цвет шрифта и цвет фона окна. загрузить исходный код с тестовым примером 160Кб
Файл исходника Размер Количество загрузок
cmyedit.rar 161 КБайт 4813

Книги по тематике

Язык программирования C++. Базовый курс. Руководство Липпман Стенли Б., 2017 Вы держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования... Узнать больше »
Алгоритмы. Справочник с примерами на C, C++, Java и Python. Руководство Хайнеман Джордж, 2017 Для создания надежного программного обеспечения необходимы эффективные алгоритмы, но программисты... Узнать больше »
Программирование на C++ в примерах и задачах Васильев Алексей Николаевич, 2017 Книга включает в себя полный набор сведений о языке С++, необходимых для успешного анализа... Узнать больше »
Стандартная библиотека C++. Справочное руководство Джосаттис Николаи М., 2014 Стандартная библиотека C++ содержит набор универсальных классов и интерфейсов, значительно... Узнать больше »
Яндекс цитирования Rambler's Top100 Яндекс.Метрика