В моем диалоге нет какой-либо неклиентской области, потому что я хочу нарисовать пользовательский заголовок. Но это означает, что системное меню не отображается, когда пользователь нажимает на заголовок.Как я могу программно отображать меню системы окна (заголовок)
Я изменил WM_NCHITTEST, чтобы ответить HTCLIENT на мой заголовок, и я могу записать сообщение WM_NCRBUTTONUP, но мне нужна помощь в демонстрации системного меню, я не могу понять, как это сделать должным образом.
До сих пор у меня есть это:
void CSkinnedDialog::OnNcRButtonUp(UINT nHitTest, CPoint point)
{
CMenu* pMenu = GetSystemMenu(FALSE);
if (int cmd = pMenu->TrackPopupMenu(TPM_RETURNCMD, point.x, point.y, this))
SendMessage(WM_SYSCOMMAND, cmd, MAKELPARAM(point.x, point.y));
}
void CSkinnedDialog::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
LRESULT CSkinnedDialog::OnNcHitTest(CPoint point)
{
LRESULT res = CDialog::OnNcHitTest(point);
ScreenToClient(&point);
if (res == HTCLIENT && point.y < m_nFrameHeight)
{
res = HTCAPTION;
}
return res;
}
void CSkinnedDialog::SysMenuAddAboutEntry()
{
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, "About...");
}
}
Это показывает системное меню, но это не очень хорошо работает. Он не отвечает на все команды, которые пользователь может выбрать (например, нажатие на пункт меню «О ...» ничего не делает, и некоторые действия, которые должны быть отключены и выделены серым цветом, такие как максимизация и восстановления, не до тех пор, пока вы щелкнули по крайней мере один раз левой кнопкой на заголовке окна.
Вы хотите иметь панель заголовка и системное меню. Я предлагаю вам включить стили окон, которые заставляют систему рисовать его. Зачем вам нужно изобретать колесо? –
Мой диалог с кожей. Все, включая заголовок, должно быть окрашено растровыми изображениями, поэтому я не могу позволить системе рисовать заголовок. – sashoalm
Вы должны установить стиль WS_SYSMENU, а затем написать собственный класс рисованного меню. используйте GetSystemMenu для подкласса системного меню, а затем у вас будет сшитое системное меню! Очевидно, вы можете использовать TrackPopupMenu, чтобы отображать его там, где хотите. – user965369