我正在尝试嵌套对话框,它可以毫不费力地使用单级嵌套,但第二级“中断” - 最内层的对话框不会获得事件。
[IDD_NESTEDDLG_DIALOG]
|
+--- [IDD_CHILD1]
|
+--- [IDD_CHILD2]
两个子对话框都设置为“Child”样式。对于这个测试,我只是使用一个直接的MFC向导:创建了一个基于对话框的应用程序,添加了两个子对话框(都来自CDialogEx
),添加了成员变量来保存那些子对话框的实例。除了创建子对话框并在OnInitDialog()
中显示它们外,没有自定义:
BOOL CnestedDlgDlg::OnInitDialog()
{
// ... MFC-generated bootstrap
m_child1.Create(IDD_CHILD1);
m_child1.ShowWindow(SW_SHOW);
return TRUE;
}
和
BOOL CChild1::OnInitDialog()
{
// ... MFC-generated bootstrap
m_child2.Create(IDD_CHILD2);
m_child2.ShowWindow(SW_SHOW);
return TRUE;
}
当我运行此代码时,两个嵌套的对话框都正确显示,但只有顶级和第一级对话框才能获得事件。单击IDD_CHILD1
的“确定”或“取消”按钮会立即关闭该中间对话框,只有然后最内层子对话框才会开始获取事件。
我觉得这里有一些非常微不足道的东西我在这里缺少了几个小时玩各种设置(“控制”,“控制父”,“没有空闲消息”,“没有父母通知”)和搜索网络没有产生到目前为止的进展。
如何正确嵌套对话框,以便第二级子控件在顶级和第一级对话框控件也处于活动状态时获取事件?
更新
一旦我让两个孩子的盒子都有“正常”边框,我就可以在顶级对话框中移动它们,并注意到第二级孩子感觉更像是第一级对话框的兄弟而不是它的孩子。问题可能就在那里,但我仍然不知道如何妥善处理。除了应用程序被最小化/恢复或移出屏幕外,似乎两个儿童盒都不会被重新绘制,这也是重新绘制的问题。
答案 0 :(得分:1)
从我可以从你的帖子收集到的内容,你创建了两个对话框作为主对话框的子对象,对话框的位置是另一个的顶部。 除了设置WS_CHILD和DS_CONTROL之外,还必须将指针传递给父级。 因此,第一个对话框是main的子节点,第二个是第一个嵌套的子节点。 可能WS_CLIPCHILDREN消除了你提到的重新绘制问题,但这是无关紧要的,因为你不会移动对话框。 我写了一个样本,您可以下载HERE
它有鼠标和按钮处理程序,用于显示您正在接收的消息