Win32 GUI:对话框中的对话框

时间:2010-02-11 13:44:43

标签: user-interface winapi

我刚刚开始使用对话框,我真的很喜欢在资源文件中定义布局的可能性。但是可以设置一个对话框并将其嵌入另一个对话框(即没有浮动对话框)吗?

使用普通窗口,我创建了一个带有一个子窗口的主窗口。然后,我创建了更多的窗口(如“编辑”,“静态”,......)并将它们添加到孩子身上。我这样做是为了将这几个窗口组合到一个窗口中,这样我就可以轻松控制所有编辑和静态的可见性。有点像分组(但它没有GroupBox的边框)。

是否可以重写上述内容,但是在.rc文件中写下了对话框?

我正在使用普通的C和Win32。

我所做的例子:

main = CreateWindow(...);
container = CreateWindow(... hWndParent = main ...);
label = CreateWindow("static", ... container);
edit = CreateWindow("edit", ... container);

现在,如果我可以隐藏或调整标签和编辑,只是控制container

我想要的例子:

MAIN_DIALOG DIALOG 10, 20, 30, 40 STYLE ...
BEGIN
CONTROL "container" ...
END

如何将“标签”和“编辑”添加到“容器”控件?

3 个答案:

答案 0 :(得分:3)

此外,在资源编辑器中,将对话框样式设置为“child”,将border设置为“none”。

答案 1 :(得分:2)

您想要做的可能与选项卡式对话框有点类似。有一些控件是通过外部对话框从不同的资源嵌入的。然后,您可以通过仅为子对话框调用ShowWindow来显示/隐藏选项卡中的所有控件:

在主对话框Callback中添加类似

的内容
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);
}

This可能是一个很好的微软开源文档。

答案 2 :(得分:2)

您还必须将DS_CONTROL样式添加到要嵌入的对话框中。如果没有它,嵌入式对话框窗口将显示窗口标题,这是很难想要的。