单击win32 api中的窗口时如何打开和关闭弹出菜单?

问题描述 投票:0回答:1

我用win32 api制作了一个小窗口,当我单击窗口时想打开一个弹出菜单。当我再次单击它时,如果菜单仍然打开,我想关闭它。

我打开WM_LBUTTONUP上的菜单,因为我想拖动WM_LBUTTONDOWN上的窗口。

我知道菜单何时显示或通过WM_ENTERMENULOOPWM_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);
    
c++ .net windows winapi popupmenu
1个回答
0
投票

只需使用一个变量来指示是否显示菜单。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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.