【发布时间】: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 顺序