Windows API 函数创建 下拉菜单 右键菜单

效果

显示效果

代码

#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;
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值