Как я могу отобразить вложенный CDialog в другом CDialog?

У меня есть два класса CDialog, которые я создал. Давайте назовем их MainDialog и ExtraDialog. Я хочу, чтобы ExtraDialog мог отображаться как через doModal, так и как вложенный диалог в MainDialog.

Я уже могу поднять его отдельно через Button и doModal. Тем не менее, я застрял о том, как разместить его в MainDialog.

CWnd* m_pWndStatic = new CWnd;
m_pWndStatic->Create(_T("Something"), _T("Title"), WS_CHILD | WS_VISIBLE, CRect(x, y, xEnd, yEnd), this, idWnd);

CExtraDialog* dlg = new CExtraDialog;
dlg->Create(IDD_NEW_DIALOG, this); //Or second variable can be m_pWndStatic?
//dlg->SetWindowPos(m_pWndStatic, x, y, xEnd, yEnd, SWP_NOZORDER | SWP_NOACTIVATE);
//dlg->Invalidate();
//dlg->ShowWindow(SW_SHOW);
//m_pWndStatic->ShowWindow(SW_SHOW);

Выше я поделился некоторыми из попыток, которые я пробовал. Я надеялся создать CWnd и поместить диалог внутри CWnd, но я чувствую, что что-то упустил, и я не мог найти что-то полезное в Интернете.

Редактировать: я в основном пытаюсь поместить несколько CWnd в один CDialog, и CWnd запускает различные функции из разных классов. Вроде как собирать блоки лего вместе.

Edit2: я нашел вопрос, который вроде как? Я надеюсь сделать его похожим, но мне просто не нужны кнопки, и я хочу, чтобы две из них отображались одновременно. Встраивание диалогов в главный диалог и переключение их нажатием кнопки в MFC

2

Решение

Я застрял о том, как разместить его в MainDialog.

Как минимум, удалить WS_POPUP, WS_CAPTION а также WS_SYSMENU стили. Добавить WS_CHILD стиль.

Настоятельно рекомендуется добавить WS_EX_CONTROLPARENT расширенный стиль для включения навигации по клавиатуре во встроенный диалог и из него.

Например, в OnInitDialog() родительского диалога вы можете добавить:

// Note: Create member variable CExtraDialog, so there is no need for dynamic allocation!
m_extraDlg.Create( IDD_NEW_DIALOG, this );

// Adjust styles. 1st parameter removes, 2nd adds.
m_extraDlg.ModifyStyle( WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME, WS_CHILD );

// Adjust extended styles. 1st parameter removes, 2nd adds.
m_extraDlg.ModifyStyleEx( WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE, WS_EX_CONTROLPARENT );

// As we have changed the frame, we let Windows recalculate the non-client area
// by passing the SWP_FRAMECHANGED flag to SetWindowPos().
m_extraDlg.SetWindowPos( nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED |
SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE );

Я надеялся создать CWnd и поместить диалог внутри CWnd

Я рекомендую всегда использовать CDialog-приобретенный класс как родительский элемент встроенного диалога. Это обеспечивает наилучшую совместимость с диспетчером диалогов Windows для таких функций, как стандартная навигация с помощью клавиатуры. Ты будешь работать с система, а не против этого.

Больше читать:

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector