Шаг 165 - Диалог - добавим меню

Использование диалогового окна в качестве главного окна программы иногда бывает очень удобно, особенно в случаях, когда программа имеет простой интерфейс и выполняет узкий круг задач, например, утилиты конвертации файлов - ну что там сложного: спроси юзера где входной файл, пару вопросов о типе конвертации и можно формировать выходной файл. Но иногда и в таких программах хочется иметь привычные элементы интерфейса: меню, акселераторы, изменяемый размер окна...Ладно, хватит болтать, лучше жева... то-есть, писать.

Итак, быстренько делаем заготовку для творчества: запускаем Visual Studio, File/New.../MFC AppWizard. Project Name: AdvDlg, OK. Dialog based, Finish, OK. Теперь можно поизменять размеры будущего диалога, потаскать кнопочки, добавить что-нибудь от себя. Я подредактировал поле "static" с текстом "Todo..." (заменил текст на "File:") и добавил строку редактирования IDC_EDIT и кнопку IDC_BROWSE, потаскать кнопки тоже не забыл, в итоге получилась такая симпатяжка:

165_1.gif (5701 b)

Можно откомпилировать и запустить. Работает? Продолжим. Задача: добавить меню, пока что с единственным пунктом - "Help/About..." Я не буду рассказывать, как создать меню - пора бы уже научиться, скажу лишь, что само меню у меня имеет идентификатор IDR_MENU, пункт "About..." - ID_ABOUT. Теперь будем приклеивать меню к диалогу: на закладке с ресурсами проекта находим ресурс нашего главного диалога (у меня - IDD_ADVDLG) и двойным кликом вновь открываем редактор диалога. Один левый тычок мыши в заголовок диалога, чтобы выбрать именно диалог, теперь правый тык и пункт контекстного меню "Properties". В открывшемся окне "Dialog properties", на закладке "General" нужно найти указать ресурс меню для нашего диалога - IDR_MENU. Компиляция, контрольный запуск:

165_2.gif (5971 b)

Неплохо, но, во-первых, в нашем случае меню выглядит не слишком красиво из-за отсутствия подчеркивающей его линии (чтобы было понятнее, посмотрите на меню Visual Studio), а во-вторых, отсутствует какая-либо реакция на выбор пункта About. Для решения первой проблемы я просто вставил в наш диалог еще один "контрол" - статическая картинка, изменил ее размеры до горизонтальной линии и оттащил на самый верх окна. Затем немного поигрался со свойствами созданной разделительной линии и получил во такой результат:

165_3.gif (5781 b)

Ну, справиться со вторым уже гораздо проще, особенно если учесть, что само окно "About" для нас уже давно создал Волшебник (как еще можно назвать AppWizard). Итак, ClassWizard(Ctrl+W), для объекта с идентификатором ID_ABOUT назначаем обработчик сообщения "COMMAND". После чего добавляем в обработчик пару строк.

void CAdvDlgDlg::OnAbout() 
{
// TODO: Add your command handler code here
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}

Собственно, все. Ну, а чтобы Вам не казалось, что диалоги имеют слишком много ограничений, в одном из следующих шагов мы научимся использовать в диалоге акселераторы...

Шаг прислал Галицкий Игорь (ig@ntvplus.ru)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 12.04.2000