我在任务栏上方显示托盘菜单时遇到了麻烦。我指定为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;
}
答案 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只是我用于演示目的的任意数字。您必须计算它以防止菜单底部出现在屏幕上。