0

我在任务栏上方显示托盘菜单时遇到问题。我指定为 y 位置无关紧要,它最多只能针对任务栏。托盘菜单是一种资源。

这是我用于右键单击系统托盘图标的代码:

// The message loop
case WM_RBUTTONUP:
{
    CPoint point;
    ::GetCursorPos(&point);

    CMenu menu;
    menu.LoadMenu(IDR_MENU1);
    HMENU hMenu = menu.GetSubMenu(0)->Detach();

    CMFCPopupMenu* pMenu = theApp.GetContextMenuManager()->ShowPopupMenu(hMenu, point.x-5, point.y, this, TRUE);
    pMenu->SetForegroundWindow();
    break;
}
4

1 回答 1

0

事实上,RecalcLayout 确保在监视器的工作区域内显示一个弹出窗口(不遮挡任务栏。但是没有什么可以阻止您覆盖此行为。Windows 菜单和 CMFCPopupMenu 之间的区别在于菜单是由操作系统和 CMFCPopupMenu 是一个模仿菜单行为的框架窗口。你几乎在那里,但你错过了 SetForegroundWindow 不移动窗口的事实,它只是改变 Z 顺序。我个人认为这样做没有任何好处。然而,正如我所说,没有什么是不可能实现的。如果你真的想违背建议,请遵循:

    CMFCPopupMenu* pMFCMenu = pCntxtMgr->ShowPopupMenu(hMenu, ptClick.x, ptClick.y, AfxGetMainWnd());
    CRect rectMenu;
    pMFCMenu->GetWindowRect(rectMenu);

    pMFCMenu->SetWindowPos(&CWnd::wndTopMost, rectMenu.left, rectMenu.top + 25, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);

25 只是我用于演示目的的任意数字。您必须计算它以防止菜单底部出现在屏幕之外。

于 2013-06-11T05:21:11.883 回答