将托盘菜单放在任务栏上方(上方)

时间:2013-06-07 08:12:56

标签: c++ mfc contextmenu tray

我在任务栏上方显示托盘菜单时遇到了麻烦。我指定为y-position并不重要,它最多只能反对任务栏。托盘菜单是一种资源。

这是我用于右键单击systrayicon的代码:

// 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;
}

1 个答案:

答案 0 :(得分:0)

确实,RecalcLayout确保在监视器的工作区域内显示一个弹出窗口(不会遮挡任务栏。 但没有什么可以阻止你覆盖这种行为。 Windows菜单和CMFCPopupMenu之间的区别在于菜单是由OS创建的窗口,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只是我用于演示目的的任意数字。您必须计算它以防止菜单底部出现在屏幕上。