MFC/Microsoft Foundation Class

SDI(Single Document Interface)에서 DialogBar와 FormView를 사용한 컨트롤

와앙노 2011. 1. 17. 16:54




[기본자료]

-       SDI스타일의 프로젝트

-       DialogBar

-       페이지 수 만큼의 Formview

[순서]

-       SDI 프로젝트를 생성하면 APP,Doc,View 3개의 클래스로 나누어지게 된다

-       1개의 DialogBar 5개의 버튼을 추가하고 이벤트를 연결(비활성화 해제방법은 블로그내에 검색)

-       5개의 Formview를 리소스에 추가하고 컨트롤을 배치한다.

-       처음 실행화면이 기본의 View가 아닌 사용자가 만든 Page로 하기위하여 APP클래스의

InitInstance 함수의 CSingleDocTemplate생성시 마지막 RUNTIME_CLASS의 뷰 부분을 사용자가 만들 Formview로 변경

이제 컴파일 후 실행하면 Formview의 첫번째 화면이 뜨고 다른 버튼은 아직 미구현이므로 먹통이다.

이제 버튼을 누르면 페이지가 전환되도록 코드를 수정한다.<다이얼로그 바 삽입은 앞의 포스팅에..>

 

 

void CTopMenu::OnButton1() 
{
	::PostMessage(AfxGetMainWnd()->m_hWnd,WM_ON_FORM_CHANGE,WM_PAGE1,0);
}

void CTopMenu::OnButton2() 
{
	::PostMessage(AfxGetMainWnd()->m_hWnd,WM_ON_FORM_CHANGE,WM_PAGE2,0);
}

void CTopMenu::OnButton3() 
{
	::PostMessage(AfxGetMainWnd()->m_hWnd,WM_ON_FORM_CHANGE,WM_PAGE3,0);
}


void CTopMenu::OnButton4() 
{
	::PostMessage(AfxGetMainWnd()->m_hWnd,WM_ON_FORM_CHANGE,WM_PAGE4,0);
}

void CTopMenu::OnButton5() 
{
	::PostMessage(AfxGetMainWnd()->m_hWnd,WM_ON_FORM_CHANGE,WM_PAGE5,0);
}
각 버튼을 누르면 MainFrame으로 메세지가 전송된다. 메세지를 받은 MainFrame에서는..
afx_msg void OnFormChange(WPARAM w,LPARAM l); // 메세지 함수를 추가하고
ON_MESSAGE(WM_ON_FORM_CHANGE,OnFormChange) //메세지 맵에 등록한다...

//호출되는 함수
void CMainFrame::OnFormChange(WPARAM w, LPARAM l)
{
	int p_index = (int)w;//페이지 번호를 WPARAM으로 받는다

	switch (p_index)//페이지 번호에 따라서 페이지를 생성
	{
	case WM_PAGE1:
		m_pageARR[p_index] = (CView*)new CPage1;
		break;
	case WM_PAGE2:
		m_pageARR[p_index] = (CView*)new CPage2;
		break;
	case WM_PAGE3:
		m_pageARR[p_index] = (CView*)new CPage3;
		break;
	case WM_PAGE4:
		m_pageARR[p_index] = (CView*)new CPage4;
		break;
	case WM_PAGE5:
		m_pageARR[p_index] = (CView*)new CPage5;
		break;
		break;
	}
	CView* m_nowview=GetActiveView();//현재 보여지고 있는 PAGE의 VIEW를 가져온다

	CCreateContext con;//CONTEXT만들기

	con.m_pCurrentDoc = m_nowview->GetDocument(); // 현재 보여지고 있는 화면의 Document를 Context에 저장

	m_pageARR[p_index]->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,2,&con);//Formview를 생성한다.

	m_pageARR[p_index]->OnInitialUpdate();//업데이느

	SetActiveView(m_pageARR[p_index]);//활성화시킨다
	
	BOOL re =	m_pageARR[p_index]->ShowWindow(SW_SHOW);//화면에 띄운다

	re = m_nowview->ShowWindow(SW_HIDE);	 //기존의 화면은 가린다.

	m_pageARR[p_index]->SetDlgCtrlID(AFX_IDW_PANE_FIRST); // 	첫번째 PANE으로 설정한다
	
	RecalcLayout();

}