Как изменить представление MFC, нажав кнопку внутри мэйнфрейма?
Всем привет,
Я хочу изменить представленный вид, нажав кнопку внутри окна... Так что не с меню мэйнфрейма. Сначала у меня было много проблем только с изменением вида, я нашел здесь учебник, как это сделать без архитектуры Doc/View Эффективное использование представлений без накладных расходов doc/view[^] это было очень полезно!
Я использую visual Studio community для своих проектов MFC.
Что я уже пробовал:
Я сделал проект MFC (SDI) без поддержки Doc/View.
Я сделал еще два представления в конструкторе и добавил к ним классы. Новый вид занятия, производного от cformview.
Я изменил конструктор и деструктор новых классов представлений на public.
Добавил их в качестве указателей на MainFrm.h:
CMainView* m_pMainView; CSecondView* m_pSecondView;
Я изменил метод OnCreate(),OnSetFocus() и OnCmdMsg() MainFrm.cpp вот так:
(Это позволяет представить вид формы, который я сделал вместе с дизайнером)
... int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // First, build the view context structure CCreateContext ccx; // Designate the class from which to build the view ccx.m_pNewViewClass = RUNTIME_CLASS(CMainView); // Using the structure, create a view m_pMainView = DYNAMIC_DOWNCAST(CMainView, this->CreateView(&ccx)); if (!m_pMainView) { TRACE0("creation of view failed"); } // Do layout recalc RecalcLayout(); // Show the view and do an initial update m_pMainView->ShowWindow(SW_SHOW); m_pMainView->OnInitialUpdate(); // Set this view active SetActiveView(m_pMainView); // Order it to resize the parent window to fit m_pMainView->ResizeParentToFit(FALSE); return 0; } ... void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/) { m_pMainView->SetFocus(); } BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { if (m_pMainView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)) return TRUE; return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); }
А вот и моя проблема! У меня есть кнопка на Первом представленном виде, и если вы нажмете на нее, вид должен измениться. Я сделал следующую функцию с обработчиком событий в конструкторе:
void CMainView::OnBnClickedButton1() { // What to do here? I want to change the current view to another View by clicking the button }
Если я справлюсь с этим в MainFrm.cpp класс, например, с кнопками МЕНЮ это не проблема... это прекрасно работает:
void CMainFrame::OnViewNextview() { CCreateContext ccx2; ccx2.m_pNewViewClass = RUNTIME_CLASS(CSecondView); m_pSecondView = DYNAMIC_DOWNCAST(CSecondView, this->CreateView(&ccx2)); RecalcLayout(); m_pMainView->ShowWindow(SW_SHOW); m_pMainView->OnInitialUpdate(); SetActiveView(m_pMainView); m_pMainView->ResizeParentToFit(FALSE); }
Я попытался написать функцию в CMainFrame и вызвать эту функцию в CMainView::OnBnClickedButton1 (), но я не знаю, как получить текущий объект MainFrm. Указатель на MainFrm или его член в CMainView не работал.
Я искал и красные учебники в течение нескольких дней, чтобы решить свою проблему. Я также попробовал его с поддержкой Doc/View, как показано здесь: https://docs.microsoft.com/en-us/cpp/mfc/adding-multiple-views-to-a-single-document?view=vs-2019 но я не знаю, где правильно вызвать switchView ().
Может быть, кто-нибудь сможет помочь...