我用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);
只需使用一个变量来指示是否显示菜单。TrackPopupMenu将阻塞,直到关闭菜单。在全球范围内
static int in_menu = 0;
在WndProc中
case WM_LBUTTONUP: {
if (in_menu == 0) { // menu not shown before
in_menu = 1;
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);
in_menu = 0;
}
}