如何在单击对话框上的子控件时将其置于顶部



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

我有一个辅助对话框,它被创建为主应用程序对话框的辅助对话框。这个辅助对话框有几个按钮等作为子控件。如果我点击辅助对话框背景或其非客户端区域,它会如预期的那样出现在顶部。但是,如果我在其中一个子按钮上单击,按钮将正常工作,但对话框不会显示在顶部。

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

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

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

主对话框类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());
...
}

在辅助对话框资源中,除以下属性外,所有属性均为FALSE

  • 边框:调整大小
  • 样式:弹出
  • 标题栏:true
  • 工具窗口:true
  • 使用系统字体:true

我的所有自定义控件都是从自定义基类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((是不够的。激活包含辅助对话框似乎是必要的。

相关内容

最新更新