【问题标题】:Creating context menu for win32 API为 win32 API 创建上下文菜单
【发布时间】:2025-12-29 06:25:12
【问题描述】:

我正在尝试使用

为 win32 应用程序创建上下文菜单
case WM_RBUTTONDOWN:
{
    HMENU hPopupMenu = CreatePopupMenu();
    InsertMenu(hPopupMenu, 0, MF_BYPOSITION | MF_STRING, ID_CLOSE, (LPCWSTR)"Exit");
    InsertMenu(hPopupMenu, 0, MF_BYPOSITION | MF_STRING, ID_EXIT, (LPCWSTR)"Play");
    SetForegroundWindow(hWnd);
    TrackPopupMenu(hPopupMenu, TPM_BOTTOMALIGN | TPM_LEFTALIGN, 0, 0, 0, hWnd, NULL);
}

但我总是得到如下所示的上下文菜单

alt text http://img191.imageshack.us/img191/866/70219076.png

我希望文本 exitplay 显示在菜单中

【问题讨论】:

  • 我猜图像现在完全丢失了。很高兴 SO 现在允许粘贴图像。

标签: winapi contextmenu


【解决方案1】:

您不能通过强制转换将字符串文字转换为宽字符,您必须将其声明为宽字符字符串。强制转换只是破坏了编译器警告,它不会改变字符串的内容。

改变这个

(LPCWSTR)"Exit"
(LPCWSTR)"Play"

到这里

_T("Exit")
_T("Play")

或者这个

L"Exit"
L"Play"

【讨论】:

    【解决方案2】:

    您是否在 API 函数定义中指定编码?我最近遇到了这个问题,删除规范解决了这个问题。

    【讨论】:

      【解决方案3】:

      以下对我有用

      case WM_RBUTTONDOWN:
                {
                  HMENU hPopupMenu = CreatePopupMenu();
                  InsertMenu(hPopupMenu, 0, MF_BYPOSITION | MF_STRING, ID_CLOSE, L"Exit");
                  InsertMenu(hPopupMenu, 0, MF_BYPOSITION | MF_STRING, ID_EXIT, L"Play");
                  SetForegroundWindow(hWnd);
                  TrackPopupMenu(hPopupMenu, TPM_BOTTOMALIGN | TPM_LEFTALIGN, 0, 0, 0, hWnd, NULL);
                }
      

      【讨论】: