Win32图形用户界面:对话框中的对话框

3
我刚开始使用对话框,我非常喜欢在资源文件中定义布局的可能性。但是是否可以设置一个对话框并将其嵌入到另一个对话框中(即没有浮动对话框)?
对于普通窗口,我创建了一个带有一个子窗口的主窗口。然后,我创建了更多的窗口(如“编辑”,“静态”等),并将它们添加到子窗口中。我这样做是为了将这些几个窗口分组到一个窗口中,以便我可以轻松地控制所有编辑和静态的可见性。有点像分组(但它没有GroupBox的边框)。
是否可以重写上述内容,但使用在.rc文件中编写的对话框?
我正在使用纯C和Win32。
我所做的示例:
main = CreateWindow(...);
container = CreateWindow(... hWndParent = main ...);
label = CreateWindow("static", ... container);
edit = CreateWindow("edit", ... container);

现在,如果我只控制容器,就可以隐藏或调整标签和编辑框。下面是我想要的示例:
MAIN_DIALOG DIALOG 10, 20, 30, 40 STYLE ...
BEGIN
CONTROL "container" ...
END

我该如何在“容器”控件中添加“标签”和“编辑”功能?

我不确定我理解你的问题,但是你可以使用CreateDialog()创建一个非模态对话框,并在资源文件中嵌入你的控件。 - anno
假设我有一个基于对话框的应用程序。如果我创建了你提到的非模态对话框,是否可以将其嵌入到我的应用程序中?我的意思是,是否可以创建一个具有另一个对话框作为父级的对话框? - Lars Kanto
3个回答

3
此外,在资源编辑器中将对话框样式设置为“子级”,边框设置为“无”。

2
您想要做的可能与选项卡对话框有些相似。在那里,一些控件从不同的资源中嵌入到外部对话框中。然后,您可以通过仅为子对话框调用ShowWindow来显示/隐藏选项卡内的所有控件:
在您的主对话框回调函数中添加以下内容:
HWND SubDlgHwnd; // Global or probably within a struct/array etc.

case WM_INITDIALOG:
{
    HRSRC       hrsrc;
    HGLOBAL     hglobal;
    hrsrc = FindResource(sghInstance, MAKEINTRESOURCE(SubDlgResId), RT_DIALOG);

    hglobal = ::LoadResource(sghInstance, hrsrc);

    SubDlgHwnd = CreateDialogIndirect(sghInstance, (LPCDLGTEMPLATE)hglobal, hDlg, ChildDialogCallback); 
    SetWindowPos(SubDlgHwnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE); 
    break;
}

case WM_COMMAND:
{
    ...
    if(UpdateVisibility)
        ShowWindow(SubDlgHwnd, showSubDialog ? SW_SHOW : SW_HIDE);
}

这里可能是微软文档的一个好起点。


只有一个问题:为什么你使用了CreateDialogIndirect(),而不是CreateDialog()?我的意思是,后者可以直接链接到.rc文件,并且根据文档它们具有相同的功能。 - Lars Kanto
没关系,我刚在某个地方读到,如果对话框在资源文件中定义,我可以使用CreateDialog()。 - Lars Kanto
您可能希望在内部对话框(在.rc模板中)上设置WS_EX_CONTROLPARENT扩展样式位,以确保您可以在内部和外部对话框之间无缝切换控件。 - BrendanMcK

2
您还需要在要嵌入的对话框中添加DS_CONTROL样式。如果没有它,嵌入的对话框窗口将显示窗口标题栏,这很难满足需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接