3.06 上下文菜单

显示上下文菜单

  1. BOOL TrackPopupMenu(
  2. HMENU hMenu, //菜单句柄UINT
  3. uFlags, //显示方式intX, //水平位置,屏幕坐标系
  4. inty, //垂直位置,屏幕坐标系
  5. int nReserved, //保留,必须0
  6. HWND hWnd, //处理菜单消息的窗口句柄
  7. CONST RECT*prcRect //NULL,忽略
  8. ); TrackPopupMenu是阻塞函数

在 WM_RBUTTONUP 构建

  1. void OnRButtonUp(HWND hWnd, LPARAM lParam) {
  2. HMENU hMain = LoadMenu(GetModuleHandle(NULL), (char*)IDR_MENU1); // 获取菜单句柄
  3. HMENU hPopup = GetSubMenu(hMain,0); // 获取第一个子菜单
  4. // 获取屏幕坐标
  5. POINT pt;
  6. pt.x = LOWORD(lParam);
  7. pt.y = HIWORD(lParam);
  8. ClientToScreen(hWnd, &pt);
  9. // 构建菜单
  10. TrackPopupMenu(
  11. hPopup,
  12. TPM_CENTERALIGN | TPM_VCENTERALIGN,
  13. pt.x, pt.y,
  14. 0,
  15. hWnd,
  16. NULL
  17. );
  18. }

在 WM_CONTEXTMENU 构建

  • WParam:右键点击的窗口句柄
  • lParam:
    • LOWORD X 坐标,屏幕坐标系
    • HIWORD Y 坐标,屏幕坐标系

WM_CONTEXTMENU 消息是在 WM_RBUTTONUP 消息之后产生。

  1. void OnContextMenu(HWND hWnd, LPARAM lParam) {
  2. HMENU hMain = LoadMenu(GetModuleHandle(NULL), (char*)IDR_MENU1); // 获取菜单句柄
  3. HMENU hPopup = GetSubMenu(hMain,0); // 获取第一个子菜单
  4. TrackPopupMenu(
  5. hPopup,
  6. TPM_CENTERALIGN | TPM_VCENTERALIGN,
  7. LOWORD(lParam), HIWORD(lParam),
  8. 0,
  9. hWnd,
  10. NULL
  11. );
  12. }