Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по программированию. Visual C++, MFC, VB, ActiveX


Служба Рассылок Subscribe.Ru

Visual C++. MFC. Уроки по программированию с сайта http://alexeev.nm.ru

Урок 14. Добавляем меню.
Урок 15. Добавляем обработчик меню.
Урок 16. Добавление диалогового окна.

Visual C++. MFC. Урок 14. Добавляем меню

В этом уроке мы с вами посмотрим, как добавить меню к нашему окну.

Для начала создадим меню для нашего окна. Заходим в меню Insert (в Visual Studio), далее выбираем Resource. Появляется окошко Insert Resource. В нем выделяем пункт menu и нажимаем на New:

Диалог Insert Resource

Появится редактор меню. Выделите в нем единственный пустой прямоугольник для меню и напечатайте заголовок меню (например, MyMenu):

Редактор меню

Появится окно Menu Item Properties. Для того, чтобы оно не пропадало при создании новых элементов меню, надмите в нем кнопку в левом верхнем углу:

Окно Menu Item Properties

Добавим теперь подменю ниже нашего меню верхнего уровня MyMenu. Для этого при необходимости выделите прямоугольник ниже меню MyMenu и напечатайте заголовок Dialog. В дальнейших уроках при выборе этого меню будет появляться диалоговое окно. Сейчас же наша задача заключается в том, что бы наше меню вообще появилось. Если вы сейчас запустите нашу программу (Ctrl+F5), то меню у окна все равно будет отсутствовать. Давайте исправлять это.

Нажмите на кнопочку "Save All". В появившемся окне Save As задайте имя для файла ресурсов (мы задали имя resource.rc (у неоткомпилированных файлов ресурсов именно такое расширение)) и нажмите на кнопку Save:

Сохранение меню

Обратите внимание, что на вкладке FileView у нас нет пока файлов с расширением *.rc:

Вкладка FileView

Добавим теперь к нашему проекту файл меню resource.rc. Для этого заходим в меню Project, далее Add to Project и затем выбираем Files:

Добавление файла к проекту

В появившемся диалоге выбираем наш файл ресурсов resource.rc и закрываем диалог. Теперь в нашем проекте произошло два изменения: во-первых, появилась вкладка ResourceView и во-вторых, на вкладке FileView появился наш файл resource.rc:

Вкладка FileView

Но это ещё не все: при запуске опять у нашего окна меню не будет! Последний шаг, который мы делаем - это изменяем текст программы. Найдите строку

    Create(NULL,"My title");

и замените ее на

CMyMainWnd(){ // конструктор
    LoadFrame(IDR_MENU1);
}

Кроме того, include'ом добавьте ещё один файл (в нем находится идентификатор нашего меню):

#include <afxwin.h>
#include "resource.h"

Обратите внимание - файл resource.h мы заключаем в двойные кавычки. Так мы делаем потому, что он находится не в стандартном месте (где находятся все стандартные заголовочные файлы). Поэтому мы должны использовать именно такие кавычки.

Запускаем программу. Ура, меню появилось!

Окно с меню
Наверх

Visual C++. MFC. Урок 15. Добавляем обработчик меню

Если вы запустите предыдущий проект, то меню Dialog будет серым:

Серое меню

Так получается потому, что у нашего окна нет обработчика. Добавим его. Для этого внесите с наш код следующие изменения:

CMyMainWnd(){ // конструктор
    LoadFrame(IDR_MENU1);
}
    void OnMyMenuDialog(); //вводим функцию для обработки щелчка по меню
    ...

Затем напишите реализацию этой функции в конце нашего файла:

...
void CMyMainWnd::OnMyMenuDialog(){
    AfxMessageBox("Menu!!!"); //Показ MessageBox'а
}

После этого нам надо связать идентификатор нашего меню с написанной выше функцией. Для выяснения, какой идентификатор имеет меню, перйдите на вкладку ResourceView, затем двойным щелчком на меню IDR_MENU1 откройте редактор меню и двойным щелчком на пункте меню Dialog откройте его свойства:

Свойства меню

Отсюда видно, что идентификатор для меню - это ID_MYMENU_DIALOG. Для связывания его с нашей функцией добавьте следующий код:

BEGIN_MESSAGE_MAP(CMyMainWnd, CFrameWnd)// начало карты сообщений
ON_COMMAND(ID_MYMENU_DIALOG, OnMyMenuDialog)//связывание идентификатора с функцией
END_MESSAGE_MAP()// конец карты сообщений

Этот фрагмент кода можно добавить, скажем, сразу после объявления класса CMyMainWnd (не добавьте его внутрь какого-нибудь класса. Эти строки надо поместить вне классов). Обратите внимание на параметры макроса BEGIN_MESSAGE_MAP. Первый (у нас это CMyMainWnd) показывает, для какого класса мы пишем нашу карту сообщений. Второй (CFrameWnd) указывает родительский класс для нашего класса, т. е. класс, который будет обрабатывать те сообщения, которые не может обработать наш класс CMyMainWnd. Разумеется, если строки

BEGIN_MESSAGE_MAP(CMyMainWnd, CFrameWnd)
 ...
END_MESSAGE_MAP()

уже есть, то их второй раз не пишем, а просто добавляем строку

ON_COMMAND(ID_MYMENU_DIALOG, OnMyMenuDialog)//связывание идентификатора с функцией

между ними.

Тем самым мы ввели карту сообщений для класса CMyMainWnd. Ее еще надо определить в самом классе. Для этого в конце класса CMyMainWnd добавьте строку (если, конечно, ее там уже нет с предыдущих уроков)

    ...
    DECLARE_MESSAGE_MAP();
};

Готово! Запускайте программу, выбирайте меню Dialog и любуйтесь на MessageBox:

MessageBox
Наверх

Visual C++. MFC. Урок 16. Добавление диалогового окна

В этом уроке мы добавим ещё один ресурс - диалоговое окно. Оно будет появляться при выборе нашего меню Dialog.

Зайдите в меню Insert, потом в подменю Resource и далее в появившемся диалоговом окне выберите пункт Dialog и нажмите на кнопку New. Появится диалоговое окно в режиме конструктора:

Конструктор диалогов

Теперь напишем код, по которому окно будет появляться. Добавьте следующие строки в обработчик нашего меню (строку AfxMessageBox("Menu!!!"); можно удалить):

void CMyMainWnd::OnMyMenuDialog(){
    CDialog dlg(IDD_DIALOG1);
    dlg.DoModal();
}

Запустите проект. Теперь при выборе меню у нас появится наше диалоговое окно.

Код можно слегка изменить. Так, чтобы программа знала, что мы нажали в нашем диалоге - кнопку OK или Cancel:

void CMyMainWnd::OnMyMenuDialog(){
    CDialog dlg(IDD_DIALOG1);
    if(dlg.DoModal()==IDOK)
        AfxMessageBox("Кнопка OK");
    else
        AfxMessageBox("Кнопка Cancel");
}
Наверх

© Алексеев Игорь, 2001


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное