У меня проблемы с отображением меню в трее над панелью задач. Неважно, что я указываю в качестве y-позиции, это в лучшем случае только против панели задач. Меню в трее является ресурсом.
Вот код, который я использую для щелчка правой кнопкой мыши по 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;
}
Действительно, 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 — это произвольное число, которое я использовал для демонстрации. Вам нужно будет рассчитать его, чтобы нижняя часть меню не появлялась на экране.
Других решений пока нет …