我的对话框没有任何非客户区域,因为我想绘制一个自定义标题栏。但这意味着当用户点击标题栏时,系统菜单不会显示。
我已经更改了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...");
}
}
显示系统菜单,但效果不佳。它不响应用户可以选择的所有命令(例如,单击“关于...”菜单条目不执行任何操作,以及一些应禁用和灰显的操作,如最大化和恢复,直到你用标题栏上的左键点击至少一次。
答案 0 :(得分:-2)
但这意味着当用户点击标题栏时,系统菜单不会显示。
当用户点击标题栏时,它从未在任何“普通”应用中显示,对吧?
我想知道你是否在尝试解决一个不存在的问题。为什么你甚至想要正确显示系统菜单?我只是展示自己的自定义菜单。