效果
代码
#include <windows.h>
#pragma comment(linker, "/subsystem:windows /entry:WinMainCRTStartup")
HMENU g_menu;
void OnCreate(HWND hWnd)
{
HMENU hMenu = CreateMenu();
HMENU hMenu1 = CreatePopupMenu();
HMENU hMenu2 = CreatePopupMenu();
HMENU hSubi = CreatePopupMenu();
g_menu = hMenu1;
AppendMenu(hMenu, MF_POPUP, (UINT)hMenu1, "菜单1");
AppendMenu(hMenu1, MF_STRING | MF_CHECKED, 1001, "勾选");
AppendMenu(hMenu1, MF_POPUP, (UINT)hSubi, "子菜单");
AppendMenu(hSubi, MF_STRING , 1002, "信息2");
AppendMenu(hSubi, MF_SEPARATOR, 0, "");
AppendMenu(hSubi, MF_STRING, 1003, "信息3");
AppendMenu(hMenu, MF_POPUP, (UINT)hMenu2, "菜单2");
AppendMenu(hMenu2, MF_STRING, 1004, "信息4");
AppendMenu(hMenu2, MF_SEPARATOR, 0, "");
AppendMenu(hMenu2, MF_STRING, 1005, "信息5");
SetMenu(hWnd, hMenu);
}
void OnCommand(HWND hWnd, WPARAM wParam)
{
static int g_state = 0;
switch(LOWORD(wParam))
{
case 1001:
if(g_state)
{
CheckMenuItem(g_menu, 1001, MF_BYCOMMAND | MF_CHECKED);
}
else
{
CheckMenuItem(g_menu, 1001, MF_BYCOMMAND | MF_UNCHECKED);
}
g_state = !g_state;
break;
case 1002:
MessageBox(hWnd, "信息2", "信息", MB_OK);
break;
case 1003:
MessageBox(hWnd, "信息3", "信息", MB_OK);
break;
case 1004:
MessageBox(hWnd, "信息4", "信息", MB_OK);
break;
case 1005:
MessageBox(hWnd, "信息5", "信息", MB_OK);
break;
}
}
void OnContextMenu(HWND hWnd, LPARAM lParam)
{
HMENU hPopup = CreatePopupMenu();
static int flag = 0;
AppendMenu(hPopup, MF_STRING | (flag ? MF_CHECKED : 0), 1001, "选择");
AppendMenu(hPopup, MF_SEPARATOR, 0, "");
AppendMenu(hPopup, MF_STRING, 1002, "右键2");
switch(TrackPopupMenu(hPopup, TPM_RETURNCMD, LOWORD(lParam), HIWORD(lParam), 0, hWnd, NULL))
{
case 1001:
flag = !flag;
break;
case 1002:
MessageBox(hWnd, "右键2", "信息", MB_OK);
break;
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
{
switch (msgID)
{
case WM_CONTEXTMENU:
OnContextMenu(hWnd, lParam);
break;
case WM_COMMAND:
OnCommand(hWnd, wParam);
break;
case WM_CREATE:
OnCreate(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, msgID, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLince, int iCmdShow)
{
HWND hWnd;
MSG nMsg = { 0 };
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof(wc);
wc.hIconSm = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.hCursor = NULL;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = "QodeCls";
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClassEx(&wc);
hWnd = CreateWindow("QodeCls", "Qode", WS_OVERLAPPEDWINDOW, 100, 100, 270, 270, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
while (GetMessage(&nMsg, NULL, 0, 0))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
return 0;
}