在分层窗口的子对话框中未单击 CMFCButton

Posted

技术标签:

【中文标题】在分层窗口的子对话框中未单击 CMFCButton【英文标题】:CMFCButton not clicked when in a child dialog of a layered window 【发布时间】:2019-06-18 11:11:37 【问题描述】:

背景:

创建一个以 WS_EX_LAYERED 和 GetDesktopWindow() 作为父级的 CWnd 创建一个以分层窗口为父级的 CDialogEx 在对话框中添加一个按钮并使用 DDX_Control 使其成为 CMFCButton

问题:

在分层窗口区域内单击,使对话框没有焦点,然后尝试单击对话框上的按钮。按钮不会响应事件。

备注:

如果按钮只是 CButton,那么它可以正常工作。有人可能会说对话框需要有焦点才能工作,但在任何其他情况下都不是这种情况。通常,当我单击对话框上的按钮时,即使我之前的焦点位于完全不同的程序中,它也始终有效。

代码:

分层窗口的创建函数:

bool CLayerWnd::Create()

    if (!__super::CreateEx(WS_EX_LAYERED, DEMOLAYEREDCLASS, _T("Layered Window"), WS_POPUP, 200, 200, 500, 500, ::GetDesktopWindow(), NULL))
        return false;

    m_childDlg.Create(this);
    m_childDlg.ShowWindow(SW_SHOW);
    ShowWindow(SW_SHOW);

    DrawWindow();

    return true;

对话框的创建函数:

bool CChildDlg::Create(CWnd *pParentWnd)

    if(!__super::Create(CChildDlg::IDD, pParentWnd))
        return false;

    return true;

演示 VS2015 项目:

https://www.dropbox.com/s/ha8o13hfz2kfn97/LayerDemo.zip?dl=0

【问题讨论】:

【参考方案1】:

添加以下代码即可。

BOOL CChildDlg::OnInitDialog()

    __super::OnInitDialog();

    m_btnMFCButton.m_bDontUseWinXPTheme = TRUE; //<-This line specifically

    return TRUE;

【讨论】:

以上是关于在分层窗口的子对话框中未单击 CMFCButton的主要内容,如果未能解决你的问题,请参考以下文章

winapi查找网页对话框的子窗口标题(属性)

如何在WPF中单击菜单项时在父窗口下打开子窗口?

MDI 窗口的创建

如何在 CRM 的子网格形式中单击按钮时显示查找窗口?

字符映射表中没有的,无字符的Unicode码怎么才能打出来?如下

如何从父关闭按钮单击事件打开的子对话框中关闭父对话框?