Учебник по Visual C++ .Net

         

Диалог About При нажатии кнопки


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




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