繁体   English   中英

如何以编程方式显示窗口的系统(标题栏)菜单

[英]How can I programatically display the window's system (titlebar) menu

我的对话框没有任何非客户区,因为我想绘制自定义标题栏。 但这意味着当用户单击标题栏时不会显示系统菜单。

我已更改 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...");
    }
}

它显示系统菜单,但效果不佳。 它不会响应用户可以执行的所有命令 select(例如,单击“关于...”菜单条目不会执行任何操作,并且某些应该禁用并变灰的操作,例如最大化和恢复,直到您使用标题栏上的左按钮至少单击一次。

但这意味着当用户单击标题栏时不会显示系统菜单。

当用户单击标题栏时,它永远不会显示在任何“普通”应用程序中,对吧?

我想知道您是否正在尝试解决一个不存在的问题。 为什么你甚至想正确显示系统菜单? 我只是展示我自己的自定义菜单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM