Создание меню класса


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

Ниже следует важная часть заголовочного файла прикладной программы:

// Идентификатор ресурса шаблона меню
 
#define IDM_MYMENURESOURCE   3

Ниже следуют необходимые части самого приложения:

HINSTANCE hinst; 
 
int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow) 
{ 
    MSG msg;        // сообщение 
    WNDCLASS wc;    // данные для класса окна 
    HWND hwnd;      // дескриптор главного окна
 
    // Создаем класс окна дя главного окна. Задаем
    // идентификатор ресурса шаблона меню как
    // член lpszMenuName структуры WNDCLASS, которая создает
    // класс меню. 
 
    wc.style = 0; 
    wc.lpfnWndProc = (WNDPROC) MainWndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hinstance; 
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = GetStockObject(WHITE_BRUSH); 
    wc.lpszMenuName =  MAKEINTRESOURCE(IDM_MYMENURESOURCE); 
    wc.lpszClassName = "MainWClass"; 
 
    if (!RegisterClass(&wc)) 
        return FALSE; 
 
    hinst = hinstance; 
 
    // Создаем главное окно. Устанавливаем параметр hmenu в ПУСТО (NULL)
    // для того, чтобы система использовала меню класса для окна. 
 
    hwnd = CreateWindow("MainWClass", "Sample Application", 
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 
        CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, 
        NULL); 
 
    if (hwnd == NULL) 
        return FALSE; 
 
    // Сделаем окно видимым и отправим сообщение WM_PAINT
    // в оконную процедуру. 
 
    ShowWindow(hwnd, nCmdShow); 
    UpdateWindow(hwnd); 
 
    // Запустим главный цикл сообщений. 
 
    while (GetMessage(&msg, NULL, 0, 0) != 0 && GetMessage(&msg,
          (HWND) NULL, 0, 0) != -1) 
    { 
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
    return msg.wParam; 
        UNREFERENCED_PARAMETER(hPrevInstance); 
} 
 
 
LRESULT APIENTRY MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                             LPARAM lParam) 
{ 
 
    switch (uMsg) 
    { 
        // Обработаем другие сообщения окна. 
 
        case WM_COMMAND: 
 
            // Проверим идентификатор командного пункта. 
 
            switch(LOWORD(wParam)) 
            { 
                case IDM_FI_OPEN: 
                    DoFileOpen();   // определяется программой 
                    break; 
 
                case IDM_FI_CLOSE: 
                    DoFileClose();  // определяется программой 
                    break; 
                // Обработаем другие команды меню. 
 
                default: 
                    break; 
 
            } 
            return 0; 
 
        // Обработаем другие сообщения окна. 
 
        default: 
            return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    } 
    return NULL; 
} 

 

Назад в оглавление
На главную страницу

Hosted by uCoz