2010-02-11 3 views
2

Я только начал использовать диалоги, и мне очень нравится определять макет в файле ресурсов. Но возможно ли установить один диалог и вставить его в другой (т. Е. Нет плавающих диалогов)?Win32 GUI: диалог в диалоговом окне

С помощью простых окон я создал главное окно с одним дочерним окном. Затем я создал еще больше окон (например, «edit», «static», ...) и добавил их к ребенку. Я сделал это, чтобы сгруппировать эти несколько окон в одном окне, чтобы я мог легко контролировать видимость всех изменений и статики. Тип подобной группировки (но у нее нет границы 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

+0

Предположим, у меня есть диалоговое приложение. Если бы я создал этот немодальный диалог, о котором вы говорили, можно ли вставить его в мое приложение? Я имею в виду, можно ли создать диалог, который имеет для родительского другого диалога? –

ответ

2

Что вы хотите сделать, вероятно, немного похоже на диалоговые окна с вкладками. Там некоторые элементы управления встроены из отдельных ресурсов с внешним диалогом. Вы можете показать/скрыть все элементы управления в закладке путем вызова ShowWindow только для subdialog:

В вас главном диалоговом 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 может быть хорошим для StartPoint Microsofts документации.

+0

Только один вопрос: почему вы использовали CreateDialogIndirect() вместо CreateDialog()? Я имею в виду, что с более поздним вы могли бы напрямую ссылаться на файл .rc, и в соответствии с документами они имеют одинаковую функциональность. –

+0

Ничего, я просто где-то читал, что если диалог задан в файле ресурсов, я могу использовать CreateDialog(). –

+0

Возможно, вы захотите установить [WS_EX_CONTROLPARENT] (http://msdn.microsoft.com/en-us/library/windows/desktop/ff700543 (v = vs.85) .aspx) бит стиля EX во внутреннем диалоговом окне (в шаблоне .rc), чтобы обеспечить плавное переключение между элементами управления во внутреннем и внешнем диалогах. – BrendanMcK

3

Кроме того, в редакторе ресурсов установите стиль диалога «child» и установите границу «none».

2

Вы также должны добавить стиль DS_CONTROL к диалоговым окнам, которые вы хотите внедрить. Без него встроенное диалоговое окно будет отображаться с заголовком окна, которого вряд ли кто хочет.

Смежные вопросы