TrackPopupMenu:菜单消失后禁用窗口

时间:2011-01-30 21:29:00

标签: c++ windows menu

我在我的应用中添加了一个弹出菜单,并使用以下代码激活:

HMENU contextMenu;
int CALLBACK WinMain(...)
{
    HMENU hContext = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_CONTEXT_MENU));
    contextMenu = GetSubMenu(hContext, 0);
}

case WM_RBUTTONDOWN:
{
    POINT pt;
    pt.x = GET_X_LPARAM(lParam);
    pt.y = GET_Y_LPARAM(lParam);
    ClientToScreen(hWndSDL, &pt);
    SetForegroundWindow(hWndSDL);
    TrackPopupMenu(contextMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, 0, hWndSDL, NULL);
    break;
}

如果我弹出菜单,然后单击窗口的标题栏,菜单会消失,但窗口仍然不会响应窗口客户区域外的任何点击。

即使键盘上的字母调用了ReleaseCapture(),我也设置了KEYUP,并允许窗口的非客户区域再次开始响应。但是当菜单被解雇时,这种行为应该是自动的吗?

有人有什么想法吗?

感谢

2 个答案:

答案 0 :(得分:1)

请勿使用WM_RBUTTONDOWN消息,而是使用WM_CONTEXTMENU消息。当默认窗口过程看到WM_RBUTTONUP消息时,它会自动生成。注意UP,而不是DOWN。

答案 1 :(得分:1)

为什么要在WM_RBUTTONDOWN处理程序中显示菜单?

它应该是WM_CONTEXTMENU,你必须记住它可能是由键盘生成的,并且不包含坐标。

或者至少使用WM_RBUTTONUP。