2010-02-11 145 views
2

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

使用普通窗口,我创建了带有一个子窗口的主窗口。然后,我创建了更多的窗口(如“编辑”,“静态”等),并将它们添加到孩子身上。我这样做是为了将这几个窗口分组到一个窗口,以便我可以轻松控制所有编辑和静态的可见性。有点像分组(但它没有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 

如何添加“标签”和“编辑”,以“集装箱”控制?

+0

我不确定我是否理解你的问题,但可以使用CreateDialog()创建一个无模式对话框,并将此控件嵌入到资源文件中。 – anno 2010-02-11 15:22:56

+0

假设我有基于对话框的应用程序。如果我创建了您提到的无模式对话框,可以将其嵌入到我的应用程序中?我的意思是,是否有可能创建一个对话框,让父母的另一个对话框? – 2010-02-12 03:48:27

回答

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); 
} 

This东西可能是微软的文档良好的起始点之。

+0

只有一个问题:为什么你使用CreateDialogIndirect()而不是CreateDialog()?我的意思是,可以直接链接到.rc文件,根据文档,它们具有相同的功能。 – 2010-02-12 14:50:00

+0

没关系,我只是在某处看过,如果在资源文件中定义了对话框,我可以使用CreateDialog()。 – 2010-02-12 15:23:53

+0

您可能需要在内部对话框中设置[WS_EX_CONTROLPARENT](http://msdn.microsoft.com/en-us/library/windows/desktop/ff700543(v = vs.85).aspx)EX样式位在.rc模板中),以确保您可以在内部和外部对话框上的控件之间无缝切换。 – BrendanMcK 2012-01-20 04:21:21

3

此外,在资源编辑器中将对话框样式设置为'child'并将边框设置为'none'。

2

您还必须将DS_CONTROL样式添加到要嵌入的对话框中。没有它,嵌入式对话窗口将显示窗口标题,这是几乎不可能的。