Исходные коды программ и игр

Программирование - работа и хобби

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

Язык программирования C++

На чём построено управление цветом и шрифтом CEdit

Класс CMyEditИзменение цветовой гаммы окна редактирования CEdit ( цвета шрифта, цвета фона окна и другое) быстро и с "малыми потерями" (времени естественно) нам предоставляет MFC (Microsoft Foundation Classes) - серьезная и надежная поддержка Window-программистов и конечно же великий и могучий С++. Скорость работы приложения написанного с применением MFC выше, чем приложения написанные на управляемом С++. Еще много приложений будет сделано на MFC, а наиболее удобные функции можно использовать и в управляемом С++. Управлять цветовым характером окна редактирования можно двумя способами.

Первый способ управления графикой CEdit

Способ первый позволяет сделать это из функции 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;
}

 

Второй способ управления цветом и шрифтом CEdit

Способ описанный выше более пригоден для небольшого количества дочерних окон управления иначе функция 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(). Если задержать курсор над названием этого макроса в строке подсказки мы увидим, что за определением этого макроса скрывается "уйма" кода. Благодаря объектно-ориентированному программированию и Microsoft Foundation Classes огромное количество кода скрыто от нас и не вызывает головную боль.

Исходник класса на С++ для управления цветом и шрифтом CEdit

Класс CMyEdit с минимальными доработками может использоваться в ваших приложениях. CMyEdit позволяет нам легко изменять в окне редактирования вид, размер, цвет шрифта и цвет фона окна. Класс CMyEdit был использован при написании исходного кода карточных игр NineK, BuraK.

Среда программирования Visual Studio 7, Visual Studio .NET 2003. Исходные коды можно преобразовать под более поздние среды программирования.

Файл загрузки Размер Кол-во загрузок
cmyedit_vs7.zip 💾 178Кбайт 4948