Member 14561306 Ответов: 0

Как изменить представление 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 ().

Может быть, кто-нибудь сможет помочь...

0 Ответов