2

我在系统托盘中有我的应用程序的弹出菜单。我遇到的问题是我无法在不选择项目的情况下让菜单消失。

当我单击窗口中的其他位置时,如何使弹出菜单消失?

这是使弹出菜单出现的代码:

LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    if( message == WM_MYMESSAGE && lParam == WM_RBUTTONDOWN)
    {
        m_menu.CreatePopupMenu();        
        POINT point;

        GetCursorPos(&point);
        m_menu.AppendMenu(MF_POPUP, WM_MAXIMIZE, _T("Maximize"));
        m_menu.AppendMenu(MF_POPUP, WM_EXIT, _T("Exit"));
        m_menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);

    }
    return CDialog::WindowProc(message, wParam, lParam);
}

我试过使用CMenu::DestroyMenu没有运气。

4

2 回答 2

4

对我有用的解决方案是SetForegroundWindow();在调用TrackPopupMenu.

我在功能描述的备注中找到了解决方案。TrackPopupMenu

于 2012-11-02T21:02:58.543 回答
0

添加 TPM_RETURNCMD 标志。使用此标志,如果选择了菜单项或用户在外部单击,则 TrackPopupMenu 函数将返回。

CMenu menu;
CMenu *pSub = NULL;

// popup a menu to get the number of pages to display
VERIFY(menu.LoadMenu(IDR_MY_MENU));
pSub = menu.GetSubMenu(0);

int command = pSub->TrackPopupMenu(
        TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD, 
        point.x, 
        point.y, 
        this);

这对我有用。

于 2012-11-02T18:06:26.563 回答