【问题标题】:TrackPopupMenu : Window disabled after menu dissapearsTrackPopupMenu : 菜单消失后窗口被禁用
【发布时间】:2011-01-30 21:28:59
【问题描述】:

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

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;
}

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

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

有人有什么想法吗?

谢谢

【问题讨论】:

  • 听起来像是错误的菜单或没有父窗口
  • 不可能,因为一旦菜单弹出,应该是父窗口的窗口在客户区之外停止响应。

标签: c++ windows menu


【解决方案1】:

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

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

或者至少使用 WM_RBUTTONUP inetead。

【讨论】:

  • 太棒了!不太清楚为什么,但是在 RBUTTONUP 事件中处理它而不是修复它。谢谢=D
【解决方案2】:

不要使用 WM_RBUTTONDOWN 消息,而是使用 WM_CONTEXTMENU 消息。它是在默认窗口过程看到 WM_RBUTTONUP 消息时自动生成的。注意向上,而不是向下。

【讨论】:

  • 由于某种原因,使用它实际上导致弹出菜单仅在我单击标题栏时才显示=/右键单击客户区不会弹出
  • 尼克,你是在应该调用 DefWindowProc 的地方吗?
  • 在窗口过程的末尾,我称之为: return CallWindowProc(sdlWndProc, hWnd, Msg, wParam, lParam);我想将菜单添加到 SDL(外部图形库)窗口,所以我必须将其挂钩以获取 WM_COMMAND 等..我希望这不是问题 =-/
  • 您还应该使用 TPM_RIGHTBUTTON。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多