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

         

Нестандартные кнопки


Кнопкам управления, которые обычно размещаются в окне диалога, тоже можно придать нестандартный облик, пометив их bitmap-изображениями вместо традиционного текста. Для этой цели в библиотеке MFC имеется специальный класс CBitmapButton, объекту которого можно приписать до четырех изображений, соответствующих различным состояниям кнопки. Кнопка может быть в одном из следующих состояний:

  • нормальное (Up) — кнопка не нажата;

  • выбранное (Down) — кнопка не нажата;

  • в фокусе (Focused) — системный фокус расположен на кнопке;

  • недействующее (Disabled) — кнопка недоступна для пользователя.

    Достаточно создать одно изображение кнопки, соответствующее первому состоянию, чтобы она функционировала. Размеры bitmap-изображений могут быть любыми, но важно, чтобы они были одинаковы. Система задает такой размер кнопке, какой имеет ее изображение в нормальном (первом) состоянии. При создании bitmap-ресурсов им следует придать идентификаторы в соответствии со следующими правилами:

  • Кнопке с заголовком, например ОК, имеющей 4 состояния, должны соответствовать 4 изображения с идентификаторами: "OKU", "OKD", "OKF", "OKX". Окончания U, D, F, X кодируют состояния: Up, Down, Focused, Disabled соответственно.

  • Идентификаторы изображений обязательно должны быть "строкового" типа, поэтому при их задании не забывайте вводить двойные кавычки.

  • Чтобы ассоциировать обычную кнопку в ресурсе диалога с этими изображениями, ей следует присвоить заголовок (caption) OK и выбрать стиль Owner draw. Это заставляет Windows посылать сообщения WM_MEASUREITEM и WM_DRAWITEM, которые обрабатывает каркас приложения, управляя обликом кнопок.

  • В классе диалога следует завести объект класса CBitmapButton и при инициализации диалога послать ему сообщение Autoload.

    Заметьте, что выбор изображения происходит, опираясь на заголовок кнопки, а не на его идентификатор. Применим эту технологию для трех наших кнопок с заголовками TRI, PENT и STAR и придадим им нестандартный облик.
    Для этого:

  • В окне ResourceView вызовите контекстное меню на элементе Тгее.гс и выберите команду Add > Resource.

  • В появившемся диалоге выберите тип ресурса Bitmap и нажмите кнопку New.



  • В окне Properties или с помощью мыши задайте желаемый размер будущей кнопки (например, 40 на 25) и создайте изображение треугольника.

  • Присвойте новому ресурс идентификатор "TRIU".

  • Создайте копию изображения, временно заменив язык, и присвойте копии идентификатор "TRID", возвратив язык.

  • Повторите эти шаги для двух других кнопок, используя строковые идентификаторы: "PENTU", "PENTD", "STARU", "STARD".

  • С помощью Studio.Net введите (переопределите) в классе CPolyDlg виртуальную функцию OnlnitDialog и измените тело этой функции так, чтобы оно было:

    BOOL CPolyDlg::OnInitDialog()

    {

    //====== Загрузка из ресурсов изображений кнопок

    m_cTri.AutoLoad (IDCJTRI, this);

    m_cPent.Autoload (IDC_PENT, this);

    m_cStar.AutoLoad (IDC_STAR, this);

    CDialog::OnlnitDialog{);

    //====== Установка диапазона ползунков

    m_rSlider.SetRange (0, 255);

    m_gSlider.SetRange (0, 255);

    m_bSlider.SetRange (0, 255);

    //====== Установка цены деления ползунков

    m_rSlider.SetTicFreq (50);

    m_gSlider.SetTicFreq (50);

    m_bSlider.SetTicFreq (50);

    //=== Вызов обработчиков для начальной

    //=== закраски окон и установки ползунков OnChangeRedO ;

    OnChangeGreen();

    OnChangeBlue ();

    return TRUE;

    }

    В Visual Studio 6 эта функция создавалась как обработчик сообщения WM_INITDIALOG, здесь в Studio.Net 7.0 я не обнаружил сообщения с таким именем в списке сообщений диалогового класса. Однако в списке Overrides присутствует строка с именем OnlnitDialog. В принципе рассматриваемая функция и в Visual Studio 6 имеет прототип virtual BOOL OnlnitDialog, но classWizard 6-й версии причисляет ее к функциям-обработчикам сообщений. Характерным моментом является также то, что прототип функции в Studio.Net изменился и стал BOOL OnlnitDialog (void);. Возвращаясь к диалоговому классу, заметим, что обращение к методам класса CTreeDoc требует включить традиционную строку

    #include "TreeDoc.h"

    в список директив препроцессора файла PolyDlg.cpp.




    Содержание раздела