【问题标题】:How to bring dialog to top when child control on it is clicked单击子控件时如何将对话框置于顶部
【发布时间】:2021-03-22 15:13:59
【问题描述】:

使用 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());
...
}

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

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

【问题讨论】:

  • 如何创建对话框?这是一个模态对话框吗?
  • @TomTom :查看添加到原始问题的编辑。它不是模式对话框。它可以通过在主对话框中单击按钮来显示/隐藏。它可以在任何其他对话框的前面或后面,包括主对话框。它实际上有一个子按钮,如果用户愿意,可以将其置于最顶层,但这不是默认状态。
  • 你为什么要用GetDesktopWindow()作为参数?正常在此处给出指向父对话框的指针(= this)。这就是您的控件不知道与主对话框的关系的原因。
  • @TomTom :因为如果我通过“this”,对话框将被限制为始终位于父对话框的顶部。我想知道是否可以设置一个属性来防止这种行为,同时仍然传递“this”?
  • 我不明白你的问题,对我来说点击对话框或控件都没有关系。但如果需要,在控制时钟后仍可以使用SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW) 管理对话框的 Z 顺序

标签: mfc dialog


【解决方案1】:

我所有的自定义控件都派生自自定义基类 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: 如问题的 cmets 中所述,如果我在辅助对话框中添加标准 CButton 或 CStatic 甚至 CWnd,单击该标准控件 将辅助对话框置于顶部。我不知道标准控件在做什么而我的不是(除了复杂的鼠标处理),但它一定是这样的。

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

【讨论】:

  • 提示:(VS2019) Spy++ 工具会告诉您所有关于发送/接收哪些消息以及任何窗口(控件)具有哪种样式的信息。有了它,你就会找到答案。
  • @TomTom :是的,事实上我今天早上把它拿出来想看看有什么不同。谢谢,为你 +1!
猜你喜欢
  • 2020-07-20
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
相关资源
最近更新 更多