Win32 GUI:对话框中的对话框
我刚开始使用对话框,我非常喜欢在资源文件中定义布局的可能性。但是,是否可以设置一个对话框并将其嵌入到另一个对话框中(即没有浮动对话框)?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
如何添加“标签”和“编辑”,以“集装箱”控制?
你想要做的可能与选项卡式对话有点相似。有一些控件是通过外部对话框从不同的资源中嵌入的。然后,您可以显示/隐藏选项卡中的所有控件调用的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东西可能是微软的文档良好的起始点之。
只有一个问题:为什么你使用CreateDialogIndirect()而不是CreateDialog()?我的意思是,可以直接链接到.rc文件,根据文档,它们具有相同的功能。 – 2010-02-12 14:50:00
没关系,我只是在某处看过,如果在资源文件中定义了对话框,我可以使用CreateDialog()。 – 2010-02-12 15:23:53
您可能需要在内部对话框中设置[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
此外,在资源编辑器中将对话框样式设置为'child'并将边框设置为'none'。
您还必须将DS_CONTROL
样式添加到要嵌入的对话框中。没有它,嵌入式对话窗口将显示窗口标题,这是几乎不可能的。
我不确定我是否理解你的问题,但可以使用CreateDialog()创建一个无模式对话框,并将此控件嵌入到资源文件中。 – anno 2010-02-11 15:22:56
假设我有基于对话框的应用程序。如果我创建了您提到的无模式对话框,可以将其嵌入到我的应用程序中?我的意思是,是否有可能创建一个对话框,让父母的另一个对话框? – 2010-02-12 03:48:27