【发布时间】:2012-12-30 17:19:41
【问题描述】:
我想创建 2 个对话框窗口,一个是另一个的子窗口。下面是部分代码。 当我单击菜单项“父”时,它创建了 2 个对话框并将一个设置为另一个的子项,如图所示:
问题是它们都是不可见的。它们的大小由 Spy++ 指示。 即使我使用 ShowWindow 和 UpdateWindow 也无济于事。
这是我的第一个问题:
How to fix this?
现在我要创建子对话框窗口的原因是:看下图,
它有一个包含子对话框的首选项对话框(黑线的有界矩形)。这些子对话窗口用于对相关选项进行分组。因此,如果用户在左侧 TreeView 中选择一个项目,它会隐藏一个子对话框窗口并显示另一个子对话框窗口以提供不同的选项。
现在是第二个问题:
Is my code is the correct way to achieve such work?
更新 2:
这是解决方案!
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644996%28v=vs.85%29.aspx
更新:
谢谢你们。
在使用CreateDialog(用于子对话框)而不是DialogBox(...),使用DS_CONTROL 而不是WS_CHILD,并从子对话框中删除OK 按钮(及其相应的wndproc)后,我得到了
我什至可以在父对话框中移动子对话框。删除资源脚本文件中的CAPTION "Child Dialog" 没有帮助。
如何(应使用哪些标志)使子对话框无缝适应父对话框?这意味着:没有标题栏,没有边框......等。 (在创建子对话框后使用
SetWindowLong和WS_BORDER?或者一些特别的对话框?)父对话框的确定按钮不再起作用。如何解决这个问题?我不明白在这个父子对话案例中如何管理对话过程。有什么参考吗?
这是我的代码:
1. Message handler for dialogs:
INT_PTR CALLBACK Child(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
{
hChild = hDlg;
return (INT_PTR)TRUE;
}
case WM_COMMAND:
if (LOWORD(wParam) == IDOK)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
INT_PTR CALLBACK Parent(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
{
hParent = hDlg;
DialogBox(hInst, MAKEINTRESOURCE(IDD_CHILD), hParent, Child);
SetParent(hChild, hParent);
return (INT_PTR)TRUE;
}
case WM_COMMAND:
if (LOWORD(wParam) == IDOK)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
2. Dialog Templates in resource file
IDD_CHILD DIALOGEX 0, 0, 70, 50
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU
CAPTION "Child Dialog"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Child Dialog",IDC_STATIC,10,5,35,8,SS_NOPREFIX
DEFPUSHBUTTON "OK",IDOK,10,25,50,14,WS_GROUP
END
IDD_DIALOG_PARENT DIALOGEX 0, 0, 250, 150
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Parent Dialog"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Parent",IDC_STATIC,42 - 20,14,35,8,SS_NOPREFIX
DEFPUSHBUTTON "OK",IDOK,188, 126,50,14,WS_GROUP
END
【问题讨论】:
-
您需要使用
CreateDialog,而不是DialogBox。DialogBox将运行自己的模态循环。 -
昨天有almost a duplicate,有源代码。
-
我明白了。但问题是我没有看到m_ChildDialog.Create是如何实现的,所以我无法弄清楚如何在纯winapi中做到这一点。似乎该源代码不会提示我必须使用 DS_CONTROL 和 CreateDialog 而不是 WS_CHILD 和 DialogBox。但我真的很感谢你的帮助。
标签: c++ c winapi dialog childwindow