Win32 GUI: диалог в диалоге - PullRequest
       26

Win32 GUI: диалог в диалоге

2 голосов
/ 11 февраля 2010

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

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

Как мне добавить 'label' и 'edit' к элементу управления 'container'?

Ответы [ 3 ]

3 голосов
/ 12 февраля 2010

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

2 голосов
/ 19 января 2012

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

2 голосов
/ 12 февраля 2010

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

В главном диалоге 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);
}

Это может быть хорошей отправной точкой для документации Microsoft.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...