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

166
05 апреля 2019, 21:30

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

 #include "stdafx.h"
#include <windows.h>
#include <CommCtrl.h>
#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;
}
Answer 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;
READ ALSO
Ошибка в сортировке массива чисел

Ошибка в сортировке массива чисел

код должен отсеивать все элементы массива не входящие в границы [a b], массив сжимается, все не вошедшие элементы к нулю и вправо, выдает неправильный...

171
Не получается прочитать через i2c eeprom память m24sr04

Не получается прочитать через i2c eeprom память m24sr04

Пытаюсь прочитать через i2c eeprom память m24sr04 (Dynamic NFC/RFID tag IC with 4-Kbit EEPROM)Предварительно записал в тэг с помощью NFC некоторую информацию

153
Различные типы функций

Различные типы функций

Не очень понимаю, почему следующий код выводит 0 1 0Какие типы у foo_1, foo_2 и foo_3?

342
Не меняются иконки C++

Не меняются иконки C++

Вообщем вот фрагмент кода, код себя ведет не очень понятно, все как бы хорошо, но иконка не меняется при наступлении 19 часов(а так должно быть)

198