Иллюстрированный самоучитель по Visual Studio.Net


Немодальный диалог - часть 4


  • В оставшейся части списка Reflected найдите сообщение =WM_CTLCOLOR и создайте функцию для его обработки, выбрав <Add> в ячейке справа.

  • Найдите заготовку тела функции ctlColor в файле PolyDlg.cpp и вставьте в нее следующие коды:

    HBRUSH CClrEdit::CtlColor(CDC* pDC, UINT nCtlColor)

    {

    pDC->SetTextColor (m_clrText); // Цвет текста

    pDC->SetBkColor (m_clrBk); // Цвет подложки текста

    return m_brBk; // Возвращаем кисть

    }

    Создайте тело вспомогательной функции ChangeColor, которую мы будем вызывать в те моменты существования диалога, когда пользователь изменяет значения элементов управления цветом:

    void CClrEdit::ChangeColor(COLORREF clr)

    {

    //====== Цвет текста - инвертирований цвет фона

    m_clrText = ~clr & Oxffffff;

    m_clrBk = clr;

    //====== Создаем кисть цвета фона

    m_brBk.DeleteObject();

    m_brBk.CreateSolidBrush (clr);

    Invalidate ();

    }

    Главным управляемым параметром является кисть (m_brBk), которую в ответ на отраженное сообщение =WM_CTLCOLOR надо возвратить каркасу приложения. Попутно мы изменяем цвет текста (setTextColor) и его подложки (setBkColor). Чтобы понять, что такое подложка текста, при отладке временно закомментируйте строку

    pDC->SetBkColor (m_clrBk);

    При изменении (инвертировании) цвета текста мы вынуждены обнулять четвертый байт переменной m_clrText. В более старых версиях Windows это действие было лишним. Теперь четвертый байт используется для задания степени прозрачности при воспризведении растровых изображений. Если он не равен нулю, то инвертирование цвета не проходит. Первые три байта, как вы помните, задают три компонента (red, green, blue).

    Изменение цвета пользователем с помощью элементов управления будет мгновенно отслеживаться в четырех полях диалога (три компонента цвета и суммарный цвет в окне Color). Так как мы хотим отследить изменение цвета и в окне представления, управляемого классом CDrawView, то мы добываем адрес родительского oкna.(GetParent) и вызываем вспомогательную функцию UpdateDrawView.




    Начало  Назад  Вперед