Я хочу создать 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, 50STYLE 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
Это не совсем правильный подход. Вам нужно установить стиль DS_CONTROL в дочернем диалоге (вместо WS_CHILD). Это говорит диспетчеру окон, что вы создаете диалог как дочернее окно, а не как настоящий всплывающий диалог. Вы также должны использовать CreateDialog или один из его вариантов вместо DialogBox для создания дочернего элемента (согласно комментарию Раймонда).
Больше информации здесь: http://blogs.msdn.com/b/oldnewthing/archive/2004/07/30/201988.aspx
Я не могу действительно помочь вам с первым вопросом. Неясно, что вы делаете неправильно из предоставленных вами фрагментов.
Других решений пока нет …