Чтение онлайн

ЖАНРЫ

Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2

Фролов Григорий Вячеславович

Шрифт:
Комбинация клавиш Соответствующая строка меню
<Ctrl+D> Строка Disable из меню Menu
<Ctrl+P> Строка Process из меню Mission или из меню File (для сокращенного варианта меню)
<Ctrl+E> Строка Exit из меню File
Как работает приложение MultiMenu

В приложении MultiMenu определены два класса – главный класс

приложения CStateApp и класс главного окна приложения CStateWindow.

Главный класс приложения CMultiMenuApp

Главный класс приложения CMultiMenuApp наследуется от базового класса CWinApp. Объект MultiMenuApp класса CMultiMenuApp объявлен как глобальный и создается сразу после запуска приложения.

В класс CMultiMenuApp входит только метод InitInstance. Он создает главное окно приложения, представленное классом CMultiMenuWindow, наследованным от класса CFrameWnd .

Класс главного окна приложения CMultiMenuWindow

Класс CMultiMenuWindow управляет главным окном приложения, создает меню, загружает панель управления а также обрабатывает сообщения, в том числе командные сообщения и команды обновления от меню.

Фактически все методы, определенные в классе CMultiMenuWindow, можно условно разделить на три группы. В первую группу попал только один метод OnCreate. Он обрабатывает сообщение WM_CREATE, поступающее в момент создания окна приложения. Вторая группа состоит из шести методов — OnDisable, OnCommand, OnExit, OnConstruct, OnRestrictMenu и OnFullMenu. Эти методы используются для обработки командных сообщений от меню приложения. И, наконец, третья группа методов включает три метода - OnUpdateProcess, OnUpdateConstruct и OnUpdateDisable, которые обрабатывают команды обновления от трех различных строк меню приложения.

В состав класса также входит несколько элементов данных. Это флаги bEnable, bRadio и nCheck, управляющие характеристиками трех строк меню, а также объект m_wndStatusBar класса CStatusBar, представляющий панель состояния нашего приложения.

Рассмотрим отдельные методы класса CMultiMenuWindow более подробно.

Конструктор класса CMultiMenuWindow

Конструктор класса CMultiMenuWindow используется для создания главного окна приложения, подключения меню, загрузки таблицы акселераторов и инициализации флагов.

Для создания окна приложения вызывается метод Create класса CFrameWnd. Обратите внимание, что метод Create создает окно с меню, которое имеет идентификатор IDR_MENU:

Create(NULL, "Status Bar Sample", WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MENU));

Затем выполняется загрузка таблицы акселераторов IDR_ACCELERATOR с помощью метода LoadAccelTable класса CFrameWnd:

LoadAccelTable(MAKEINTRESOURCE(IDR_ACCELERATOR));

И, в конце, конструктор устанавливает значение флагов bEnable, bRadio и nCheck. Флагам bEnable и bRadio присваивается значение TRUE, а флагу nCheck – нулевое значение.

Таблица сообщений класса CMultiMenuWindow

Таблица сообщений класса CMultiMenuWindow обрабатывает командные сообщения и команды обновления от меню приложения, а также содержит макрокоманду ON_WM_CREATE.

Макрокоманда ON_WM_CREATE вызывает метод OnCreate во время создания окна:

ON_WM_CREATE

Для обработки командных сообщений от меню приложения в таблицу сообщений класса CMultiMenuWindow включены шесть макрокоманд ON_COMMAND.

Они вызывают обработчики OnDisable, OnConstruct, OnCommand, OnFullMenu, OnRestrictMenu и OnMenuExit:

ON_COMMAND(ID_MENU_DISABLE, OnDisable)

ON_COMMAND(ID_MISSION_CONSTRUCT, OnConstruct)

ON_COMMAND(ID_FILE_EXIT, OnExit)

ON_COMMAND(ID_MISSION_PROCESS, OnCommand)

ON_COMMAND(ID_MENU_RESTRICT, OnRestrictMenu)

ON_COMMAND(ID_MENU_FULL, OnFullMenu)

Для обработки команд обновления в таблицу сообщений класса включены три макрокоманды ON_UPDATE_COMMAND_UI. Они вызывают методы OnUpdateProcess, OnUpdateConstruct и OnUpdateDisable:

ON_UPDATE_COMMAND_UI(ID_MISSION_PROCESS, OnUpdateProcess)

ON_UPDATE_COMMAND_UI(ID_MISSION_CONSTRUCT, OnUpdateConstruct)

ON_UPDATE_COMMAND_UI(ID_MENU_DISABLE, OnUpdateDisable)

Соответствие методов, вызываемых макрокомандами ON_COMMAND и ON_UPDATE_COMMAND_UI, строкам меню приложения вы можете посмотреть в файле ресурсов приложения, представленном в листинге 3.3.

Метод OnCreate класса CMultiMenuWindow

Метод OnCreate класса CMultiMenuWindow сначала вызывает метод OnCreate базового класса CFrameWnd , чтобы создать главное окно приложения:

if (CFrameWnd::OnCreate(lpCreateStruct) == –1) return –1;

Затем мы создаем панель состояния, указывая в качестве ее родительского окна главное окно приложения. Для этого мы вызываем метод Create объекта m_wndStatusBar, представляющего панель состояния, передавая ему в качестве параметра значение this. В данном случае это означает, что окно приложения является родительским окном для панели состояния:

if (!m_wndStatusBar.Create(this)) {

 // Ошибка при создании панели состояния

 TRACE0("Failed to create status bar\n");

 return -1;

}

После того, как панель состояния создана, отображаем на ней единственный индикатор, вызывая метод SetIndicators. В качестве первого параметра передаем методу SetIndicators идентификатор этого единственного индикатора панели состояния, записанный в переменной indicator. Второй параметр метода SetIndicators, равен единице. Он определяет, что индикатор в панели состояния будет только один:

if (!m_wndStatusBar.SetIndicators(&indicator,1)) {

 // Ошибка при установке индикатора

 TRACE0("Failed to set indicators\n");

 return -1;

}

Более подробно о принципах устройства панелей состояния мы расскажем в отдельном разделе, который носит название “Панель состояния”.

Метод OnDisable класса CMultiMenuWindow

Когда пользователь выбирает из меню Menu строку Disable или нажимает комбинацию клавиш <Ctrl+D>, приложению поступает командное сообщение, которое имеет идентификатор ID_MENU_DISABLE. Для обработки этого сообщения вызывается метод OnDisable класса CMultiMenuWindow. Этот метод изменяет состояние флагов bEnable и nCheck.

Поделиться с друзьями: