首页 > 解决方案 > 单击子控件时如何将对话框置于顶部

问题描述

使用 C++ 应用程序,使用 MFC。

我有一个辅助对话框,它是作为主应用程序对话框的辅助对话框创建的。这个辅助对话框有几个按钮等作为子控件。如果我单击辅助对话框背景或其非客户区,它会按预期到达顶部。但是,如果我单击其中一个子按钮,则该按钮可以正常工作,但对话框不会出现在顶部。

当单击任何子控件时,我应该在对话框中处理一些事件以将其置于顶部吗?或者也许在对话框中设置一些属性来确保发生这种情况?

我怀疑我需要处理一些我不需要的激活或焦点事件。或者,一旦孩子们处理了点击,就需要向上传播?还是反过来?

编辑: 在评论中回答问题的其他详细信息:

主对话框类 CMyDlg 和辅助对话框类 CAuxDlg 都是从 CDialog 派生的。

每个都有一个空白对话资源;所有子控件等都是以编程方式创建的。

class CMyDlg : public CDialog
{
public:
    CAuxDlg *aux;
    ...
protected:
    virtual BOOL OnInitDialog()
    ...
    DECLARE_MESSAGE_MAP()
}

class CAuxDlg : public CDialog
{
    ...
protected:
    ...
    DECLARE_MESSAGE_MAP()
}

辅助对话框在主对话框的 OnInitDialog() 方法中创建:

BOOL CMyDlg::OnInitDialog()
{
...
    aux = new CAuxDlg(this);
    aux->Create(IDD_AUX_DIALOG, GetDesktopWindow());
...
}

在 aux 对话框资源中,所有属性都是 FALSE,除了:

标签: mfcdialog

解决方案


我所有的自定义控件都派生自自定义基类 CMyBase。我向这个基类添加了一个处理程序:

ON_WM_LBUTTONDOWN()
...
void CMyBase::OnLButtonDown(UINT nFlags, CPoint point)
{
    CWnd::OnLButtonDown(nFlags, point);
    GetParent()->SetActiveWindow();
}

并确保从处理 WM_LBUTTONDOWN 的 CMyBase 派生的类也调用基类的处理程序:

class CMyCtrl : public CMyBase
...
void CMyCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
    // do stuff here
    CMyBase::OnLButtonDown(nFlags, point);
}

这似乎已经成功了。

注意 1:如问题评论中所述,如果我将标准 CButton 或 CStatic 甚至 CWnd 添加到辅助对话框中,单击该标准控件确实会将辅助对话框带到顶部。我不知道标准控件在做什么而我的不是(除了精心处理的鼠标处理),但它一定是这样的。

注 2:仅调用 CWnd::OnLButtonDown() 是不够的。激活包含辅助对话框似乎是必要的。


推荐阅读