如何解决单击子控件时如何将对话框置于顶部
使用 C++ 应用程序,使用 MFC。
我有一个辅助对话框,它是作为主应用程序对话框的辅助对话框创建的。这个辅助对话框有几个按钮等作为子控件。如果我单击辅助对话框背景或其非客户区域,它会按预期到达顶部。但是,如果我点击其中一个子按钮,按钮功能正常,但对话框不会出现在顶部。
当单击任何子控件时,是否应该在对话框中处理某些事件以将其置于顶部?或者在对话框中设置一些属性来确保发生这种情况?
我怀疑我需要处理一些我不需要的 activate 或 focus 事件。或者,一旦孩子处理了点击,它就需要传播?还是反过来?
编辑: 在评论中回答问题的其他详细信息:
主对话框类 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
解决方法
我的所有自定义控件都派生自自定义基类 CMyBase。我向这个基类添加了一个处理程序:
ON_WM_LBUTTONDOWN()
...
void CMyBase::OnLButtonDown(UINT nFlags,CPoint point)
{
CWnd::OnLButtonDown(nFlags,point);
GetParent()->SetActiveWindow();
}
并确保从 CMyBase 派生的处理 WM_LBUTTONDOWN 的类也调用基类的处理程序:
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() 是不够的。激活包含辅助对话框似乎是必要的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。