#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;
Комментариев нет:
Отправить комментарий