解决TrackPopupMenu显示菜单不全的问题

经常使用菜单,但是如果直接加载菜单资源,调用TrackPopupMenu时 就会出现菜单显示不全的问题, 基本上解决方法就是先GetSubMenu,再TrackPopupMenu,

两种方法,一种就是在菜单资源里把所要加载的资源放到一个Popup属性的菜单下面,

另外就是程序创建一个Popup菜单,把菜单资源附加到这个Popup菜单上,再从Popup菜单中GetSubMenu(0)  取得需要的菜单

 

  case WM_CONTEXTMENU:
    {
      HWND hWnd = (HWND)wParam; //窗口句柄
      int xPos = GET_X_LPARAM(lParam);  //鼠标X屏幕坐标
      int yPos = GET_Y_LPARAM(lParam);  //鼠标Y屏幕坐标

      HMENU hMenu = CreatePopupMenu();  //创建弹出式菜单
      HMENU hSrcMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDC_TESTWIN32)); //加载菜单资源
      AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hSrcMenu, _T("Popup")); //附加到弹出菜单
      HMENU hTackMenu = GetSubMenu(hMenu, 0); //取出目标菜单
      TrackPopupMenuEx(hTackMenu, 0, xPos, yPos, hWnd, NULL); //弹出菜单
      DestroyMenu(hSrcMenu); //销毁加载的菜单
      DestroyMenu(hMenu); //销毁弹出菜单

      break;
    }


 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当使用 Windows API 中的 `TrackPopupMenu` 函数时,可以创建一个弹出菜单,并在指定的位置显示它。以下是一个示例代码,展示了如何使用 `TrackPopupMenu` 在窗口中响应右键菜单的点击事件: ```cpp #include <Windows.h> // 右键菜单的 ID #define IDM_EXIT 1001 // 窗口过程函数 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_EXIT: // 处理退出菜单项的点击事件 PostQuitMessage(0); break; } break; case WM_DESTROY: // 关闭窗口 PostQuitMessage(0); break; case WM_RBUTTONDOWN: { // 创建弹出菜单 HMENU hPopupMenu = CreatePopupMenu(); AppendMenu(hPopupMenu, MF_STRING, IDM_EXIT, "Exit"); // 获取鼠标点击位置 POINT pt; GetCursorPos(&pt); // 显示弹出菜单 TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, hwnd, NULL); // 销毁菜单 DestroyMenu(hPopupMenu); } break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 创建窗口类 WNDCLASS wc = {}; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.lpszClassName = "PopupMenuExample"; RegisterClass(&wc); // 创建窗口 HWND hwnd = CreateWindow(wc.lpszClassName, "PopupMenu Example", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL); // 显示窗口 ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 消息循环 MSG msg = {}; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } ``` 上述代码创建了一个简单的窗口,并在窗口的右键菜单中添加了一个 "Exit" 菜单项。当用户右击窗口时,会显示弹出菜单,点击 "Exit" 菜单项将退出程序。 请注意,此示例是基于 Windows 平台的,使用 C++ 编写。你可以根据自己的需要修改和扩展代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值