Страницы

Поиск по вопросам

понедельник, 30 марта 2020 г.

Как оживить кнопки? Win32

#cpp #winapi


Создал окно программы с пунктами и подпунктами. Каким образом можно оживить Кнопки?
Например как сделать чтобы по нажатию на "Файл">"Выход" программа закрывалась? Я в
этом очень плохо что понимаю, скорее даже ничего...

 #include "stdafx.h"
#include 
#include 
#define IDM_SHOW      1001
#define IDM_ERASE     1002
#define IDM_EXIT      1003
#pragma comment(lib, "ComCtl32.lib")

TCHAR czClassName[] = L"myClass";
TCHAR czFormName[] = L"Это мое окно";
HWND hwndA;
const WCHAR wString[] = L"Hello";
#define countof(a) (sizeof(a)/sizeof(*(a)))
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hDeviceContext;
    PAINTSTRUCT paintStruct;
    RECT rectPlace;
    HFONT hFont;
    static char text[2] = { ' ','\0' };
    switch (message)
    {
    case WM_COMMAND:
        if (HIWORD(wParam) == 0 && lParam == 0) {    // If a menu item has been selected
            switch (LOWORD(wParam)) {
            case IDM_SHOW:
                MessageBox(NULL,
                    L"Покулитый Руслан",
                    L"121-18ск-1", MB_ICONASTERISK | MB_OK);
                break;


            case IDM_ERASE:
                ::SendMessage(hwnd, WM_CLOSE, 0, 0);

                    break;


            case IDM_EXIT:
                PostQuitMessage(0);
                break;
            }
            break;

    default: return DefWindowProc(hwnd, message, wParam, lParam); break;
        }
    }
}

ATOM myRegistryClass(HINSTANCE hInst, int cmdMode)
{
    WNDCLASS cw;

    cw.style = CS_VREDRAW | CS_HREDRAW;
    cw.cbClsExtra = 0;
    cw.cbWndExtra = 0;
    cw.hbrBackground = (HBRUSH)(COLOR_WINDOW + 2);
    cw.hCursor = LoadCursor(NULL, IDC_ARROW);
    cw.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    cw.hInstance = hInst;
    cw.lpfnWndProc = WndProc;
    cw.lpszClassName = czClassName;
    cw.lpszMenuName = NULL;

    RegisterClass(&cw);

    return 0;
}


BOOL InitInstance(HINSTANCE hInst, int Mode)
{


    hwndA = CreateWindow(
        czClassName,
        czFormName,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInst,
        NULL);

    ShowWindow(hwndA, Mode);
    UpdateWindow(hwndA);

    return TRUE;
}


/*Главная функция*/
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR IpszCmdParam,
int cmdShow)
{
    MSG msg;

    myRegistryClass(hInst, cmdShow);
    InitInstance(hInst, cmdShow);

    InitCommonControls();

    /*Создание строки состояния*/
    HWND hStatusWindow = CreateStatusWindow(WS_CHILD | WS_VISIBLE, L"", hwndA, 5000);

    HMENU hmenu1;
    hmenu1 = CreateMenu();

    HMENU hMainMenu = CreateMenu();
    HMENU hPopMenuFile = CreatePopupMenu();
    HMENU hPopMenuPravka = CreatePopupMenu();
    HMENU hPopMenuPomosh = CreatePopupMenu();

    AppendMenu(hMainMenu, MF_STRING | MF_POPUP, (UINT)hPopMenuFile, L"Файл");
    AppendMenu(hMainMenu, MF_STRING | MF_POPUP, (UINT)hPopMenuPravka, L"Правка");
    AppendMenu(hMainMenu, MF_STRING | MF_POPUP, (UINT)hPopMenuPomosh, L"Помощь");


    AppendMenu(hPopMenuFile, MF_STRING, 1001, L"Показать");
    AppendMenu(hPopMenuFile, MF_STRING, 1003, L"Выход");
    AppendMenu(hPopMenuPravka, MF_STRING, 1002, L"Стереть");

    SetMenu(hwndA, hMainMenu);
    SetMenu(hwndA, hPopMenuFile);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

    


Ответы

Ответ 1



Во-первых, у вас ошибка в AppendMenu - две разные команды имеют один и тот же идентификатор 1001. Во-вторых, меню, акселераторы, кнопки, и прочие экранные элементы при активации генерируют сообщение WM_COMMAND. Для обработки команд меню в вашу оконную процедуру надо добавить примерно такой код (я добавил символьные идентификаторы для ваших команд): #define IDM_SHOW 1001 #define IDM_ERASE 1002 #define IDM_EXIT 1003 switch (message) { . . . case WM_COMMAND: if (HIWORD(wParam) == 0 && lParam == 0) { // If a menu item has been selected switch (LOWORD(wParam)) { case IDM_SHOW: . . . break; case IDM_ERASE: . . . break; case IDM_EXIT: ::SendMessage(hwnd, WM_CLOSE, 0, 0); break; } } break;

Комментариев нет:

Отправить комментарий