Предыдущие два рассматриваемых приложения, фактически никак не могли взаимодействовать с пользователем. Они не имели ни меню, ни панели управления. И, самое главное, они не содержали обработчиков сообщений.
Рассмотрим теперь приложение, которое имеет меню и содержит обработчики сообщений, передаваемых приложению, когда пользователь открывает меню и выбирает из него строки. Пусть меню приложения состоит из одного пункта Test. Можно выбрать одну из следующих команд - Beep или Exit.
Файл ресурсов, в который включается описание меню, можно построить либо непосредственным созданием нового файла ресурсов, либо при помощи средств AppWizard. В любом случае при создании меню нужно определить название меню или строки меню. Каждый элемент меню должен иметь уникальный идентификатор, однозначно его определяющий:
Файл resource.h #define IDR_MENU 101 #define ID_TEST_BEEP 40001 #define ID_TEST_EXIT 40002 Файл resource.rc #include "resource.h" IDR_MENU MENU DISCARDABLE BEGIN POPUP "Test" BEGIN MENUITEM "Beep", ID_TEST_BEEP MENUITEM SEPARATOR MENUITEM "Exit", ID_TEST_EXIT END END
Файлы, в которых находятся определение классов приложения и главного окна, представлены ниже:
Файл menu.h #include <afxwin.h> class CMenuApp: public CWinApp { public: virtual BOOL InitInstance(); }; Файл menu.cpp #include <afxwin.h> #include "menu.h" #include "menum.h" BOOL CMenuApp::InitInstance() { m_pMainWnd= new CMainWindow(); m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } CMenuApp theApp; Файл menum.h #include <afxwin.h> class CMainWindow : public CFrameWnd { public: CMainWindow(); afx_msg void TestBeep(); afx_msg void TestExit(); // макрокоманда необходима, так как класс обрабатывает сообщения DECLARE_MESSAGE_MAP() }; Файл menum.cpp #include <afxwin.h> #include "menum.h" #include "resource.h" // Таблица сообщений класса BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd) ON_COMMAND(ID_TEST_BEEP,TestBeep) ON_COMMAND(ID_TEST_EXIT,TestExit) END_MESSAGE_MAP() CMainWindow::CMainWindow() { Create(NULL,"Hello",WS_OVERLAPPEDWINDOW,rectDefault, NULL,MAKEINTRESOURCE(IDR_MENU)); } void CMainWindow::TestBeep()// Метод TestBeep - обрабатывает команду меню { MessageBeep(0); } void CMainWindow::TestExit()// Метод TestExit - обрабатывает команду меню { DestroyWindow(); }