在任务栏上方放置托盘菜单

Placing a Tray menu over (above) taskbar

本文关键字:菜单 方放置 任务栏      更新时间:2023-10-16

我在任务栏上方显示托盘菜单时遇到问题。我指定的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;
}

确实,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只是我用于演示目的的一个任意数字。你必须计算它,以防止菜单底部出现在屏幕上。