【发布时间】:2020-04-04 20:20:46
【问题描述】:
我用win32 api做了一个小窗口,当我点击窗口时想打开一个弹出菜单。当我再次点击它时,如果它仍然打开,我想关闭它。
我在 WM_LBUTTONUP 上打开菜单,因为我想在 WM_LBUTTONDOWN 上拖动窗口。
我通过WM_ENTERMENULOOP和WM_EXITMENULOOP知道菜单何时出现或消失。
我知道如何以编程方式关闭菜单,但不幸的是我不知道如何确定菜单是在 WM_LBUTTONUP 上打开还是关闭。问题是菜单在 WM_LBUTTONDOWN 上自动关闭,这就是为什么我无法保存菜单的当前状态。
如果有人提示如何解决这个问题,那就太好了。
其他信息:
-
整个窗口是一个无边界的客户区,上面绘有位图
hWnd = CreateWindowExW(WS_EX_TOPMOST, L"MyWindow", 0, WS_POPUP, wndPosX, wndPosY, m_WndWidth, m_WndHeight, 0, 0, m_hInst, 0); -
位图在窗口的 WindowProcedure 中的 WM_CREATE 上加载,并在 WM_PAINT 上绘制
m_hBitmap = (HBITMAP)LoadImageA(NULL, "MyBitmap.bmp", IMAGE_BITMAP, m_WndWidth, m_WndHeight, LR_LOADFROMFILE); 窗口默认不可拖动,因为我没有非客户区,所以我根据当前光标位置在WM_MOUSEMOVE上手动移动窗口
-
在 WM_LBUTTONUP 我在窗口顶部创建弹出菜单
HMENU hPopupMenu = CreatePopupMenu(); InsertMenuW(hPopupMenu, 0, MF_BYPOSITION | MF_STRING, ID_ITEM_A, L"ItemA"); SetForegroundWindow(hWnd); RECT wndRect; GetWindowRect(hWnd, &wndRect); TrackPopupMenu(hPopupMenu, TPM_BOTTOMALIGN | TPM_LEFTALIGN, wndRect.left, wndRect.top, 0, hWnd, NULL);
【问题讨论】:
-
如果你想改变菜单的工作方式,最好的办法是在显示之前安装一个
WH_MSGFILTER钩子。然后您可以监视和修改它收到的消息(例如,如果您希望它忽略鼠标单击,请将WM_LBUTTONDOWN更改为WM_NULL)。 -
拖动窗口会影响菜单吗?您可以按照乔纳森的方式避免鼠标点击(
WM_LBUTTONDOWN)。一般WM_LBUTTONDOWN和WM_LBUTTONUP出现在鼠标的动作中。 -
感谢您的帮助。我对win api很陌生。如何安装挂钩?以及如何修改它收到的消息?
-
也许有另一种方法可以做到这一点。我可以通过单击某处来防止弹出菜单自行关闭吗?然后我可以自己处理。
-
小窗口属于主窗口?或者它是一个单独的窗口?也许您可以添加一些代码来说明您的问题
标签: c++ windows winapi popupmenu