Диалог
About
При нажатии
кнопки в области картинок мы вызываем диалог About, от которого отказались при
создании проекта. Цель такого поступка — самостоятельно создать диалог, поместить
в него растровое изображение и ввести команду для его запуска в меню управления
(Control menu) главного окна.
Создайте новый
диалог (Project > Add Resource > Dialog > New), удалите из его
окна кнопку Cancel, разместите в нем Static Control, Group Box и Picture Control.
Для картинки
установите свойства: Type: Icon, ID: IDC_EYE, Image: IDI_EYELEFT. Обратите внимание
на то, что свойство Image недоступно, пока вы не установите тип изображения
Icon. Для окна диалога свойство ID задайте равным IDD_ABOUTBOX. В класс CLookDlg
введите обработчик сообщения WM_SYSCOMMAND. Каркас приложения вызывает обработчик
этого сообщения в те моменты, когда пользователь выбирает команды из меню управления
или когда он пользуется кнопками свора-чивания окна:
void
CLookDlg::OnSysCommand(UINT
nID, LPARAM IParam)
{
if
((nID & OxFFFO) == IDM_ABOUTBOX)
CDialog(IDD_ABOUTBOX).DoModal();
else
CDialog::OnSysCommand(nID,
IParam);
}
Здесь, как
видно из кода, мы проверяем идентификатор команды, и если он соответствует команде
About, то запускаем диалог в модальном режиме. Теперь необходимо вставить в
меню управления окном команду About. Отметьте, что это меню создает каркас приложения
и оно не имеет соответствующего ресурса в нашем приложении. Поэтому управление
меню производится методами класса смени. Обычно это делают в функции OnlnitDialog.
В этой же функции производят инициализацию элементов управления. Внесите в нее
следующие изменения:
BOOL
CLookDlg::OnlnitDialog()
{
//=======
Добываем адрес меню управления окном
CMenu*
pSysMenu = GetSystemMenu(FALSE) ;
if
(pSysMenu)
{
//======
Добавляем команду About
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,
IDM_ABOUTBOX, "About...");
}
//======
Загружаем свой (нестандартный) значок
HICON
hMylcon = ::Loadlcon(GetModuleHandle(0),(char*)(IDI_EYELEFT)); Setlcon(hMylcon,
TRUE);
//
Set big icon Setlcon(hMylcon, FALSE);
//
Set small icon
//======
Если не удалось найти файл,
if
(IReadErrors () }
{
PostMessage(WM_QUIT);
// уходим
return
FALSE;
}
//======
Количество элементов в контейнере
//=====преобразуем
в строку
m_Total.Format("%d",m_nltems);
//======
Ищем и расшифровываем первый код ошибки
Getlnfo(0);
//======
Вызов родительской версии диалога
CDialog::OnlnitDialog
();
//======
Устанавливаем окно-двойник для счетчика
m_Spin.SetBuddy(GetDlgItem(IDC_CURRENT));
//======
Диапазон изменения показаний счетчика
m_Spin.SetRange(0,
m_nlterns-1);
//=====
Диапазон изменения позиции ползунка
m_Slider.SetRange(0,
m_nlteras-l);
//=====
Устанавливаем цену делений для шкалы ползунка m_Slider.SetTicFreq(m_nltems/10);
return
TRUE;
}
Здесь показаны
методы начальной установки показаний счетчика и позиции ползунка. Кроме того,
мы сменили значок для окна приложения. Теперь это не IDI_WINLOGO, а наш глаз.
Команда About добавляется в меню управления окном с помощью метода AppendMenu.
Чтобы проверить правильность некоторых изменений, надо запустить приложение,
но сначала надо ввести в состав ресурсов приложения идентификатор команды меню
IDM_ABOUTBOX и временно исключить те фрагменты кода, которые еще не могут работать.
Для задания нового идентификатора:
- Вызовите контекстное
меню в окне Resource View и выберите команду Resource Symbols.
- В окне появившегося диалога
нажмите кнопку New.
- В окне Name: следующего
диалога введите IDM_ABOUTBOX и нажмите ОК.
Полезным упражнением
будет временное исключение (с помощью комментариев) того кода, который пока
не может функционировать. Добейтесь того, чтобы код компилировался без ошибок.
Затем можно запустить приложение и проверить работу меню и диалога About. Он
должен вызываться как из меню, так и с помощью щелчка по картинкам. Скорее всего,
он работать не будет. Я намеренно завел вас в эту ловушку, так как сам в нее
попадался. Объяснение отказа можно найти в справке по функции OnSysCommand.
Там сказано, что четыре младших бита параметра nio, который определяет идентификатор
команды меню, используются Windows, поэтому в командах пользователя их следует
обнулять. Мы это делаем путем побитового логического умножения на константу
0xFFF0:
if
((nID & 0xFFF0) == IDM_ABOUTBOX) CDialog(IDD_ABOUTBOX).DoModaK);
Но числовое
значение идентификатора IDM_ABOUTBOX, которое было определено студией в диалоге
Resource Symbols, скорее всего, не удовлетворяет этому условию и запуск диалога
не производится. Чтобы изменить значение идентификатора, надо вновь открыть
диалог Resource Symbols, найти IDM_ABOUTBOX в списке идентификаторов и изменить
его значение, например на 112. Число должно быть больше того, которое предлагает
студия, и делиться на 16, так как 4 младших бита должны быть нулями. После изменений
такого рода полезно дать команду Build > Rebuild Solution и вновь запустить
приложение. Если вы во всем разобрались, то диалог About должен работать.
Примечание
Если вы не знаете, что
такое разделитель команд меню (Menu Separator), то закомментируйте строку,
вставляющую его и, запустив приложение, сравните облик меню с тем, который
был до этого.