mfc - 单击子控件时如何将对话框置于顶部
问题描述
使用 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,除了:
- 边框:调整大小
- 风格:弹出式
- 标题栏:真
- 工具窗口:真
- 使用系统字体: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() 是不够的。激活包含辅助对话框似乎是必要的。
推荐阅读
- python - 气流将时间戳声明为变量,但为每个任务获得了不同的时间戳
- c++ - C++ 可以实现类型数组吗?
- python - 'ipython' 不是内部或外部命令、可运行程序或批处理文件
- python - Flask Python 身份验证错误:identity = getattr(identity, 'id') 或 identity['id']
- angular - 如何创建响应式导航栏,如 clickup.com
- php - 在多维数组中查找具有空值的元素
- c# - 检索和反序列化大型 Redis 缓存项列表
- powerbi - 如何计算power bi中的平均库存?
- java - android.support.design.widget.TabLayout - 无法解析符号“设计”
- python-3.x - 如何在评估python列表中的每个项目时减少执行时间