Диалог About



Диалог 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 и временно исключить те фрагменты кода, которые еще не могут работать. Для задания нового идентификатора:

  1. Вызовите контекстное меню в окне Resource View и выберите команду Resource Symbols.
  2. В окне появившегося диалога нажмите кнопку New.
  3. В окне 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 должен работать.

Примечание 1
Примечание 1

Если вы не знаете, что такое разделитель команд меню (Menu Separator), то закомментируйте строку, вставляющую его и, запустив приложение, сравните облик меню с тем, который был до этого.





- Начало - - Назад -