У меня есть два класса 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
Я застрял о том, как разместить его в 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 для таких функций, как стандартная навигация с помощью клавиатуры. Ты будешь работать с система, а не против этого.
Больше читать:
Других решений пока нет …