Нестандартные
кнопки
Кнопкам управления,
которые обычно размещаются в окне диалога, тоже можно придать нестандартный
облик, пометив их 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.