MFC

뷰간 화면전환 - 참조해봐~~~

디버그정 2008. 9. 4. 17:14
MFC에서 프로젝트를 FormView를 쓰면 화면 전환시에 사용하는 법은 다음과 같이 난 작성한다...

메인폼에 사용자 메시지를 받을 수 있는 함수를 다음과 같이 작성한다..

LRESULT CMainFrame::OnFormChange(WPARAM wParam, LPARAM lParam)
{
// TRACE0(" User Message!!");

// Form Change
CView* pOldActiveView = GetActiveView();
CView* pNewActiveView = (CView*)GetDlgItem(wParam);
if(pNewActiveView==NULL) 
{
switch (wParam)  {
case IDD_LDP_CAL_FORM :
pNewActiveView = (CView*)new CLDPSetupCalView; 
TRACE0(" Menu Cal Form Change!!");
break;
case IDD_LDP_MAIN_FORM :
pNewActiveView = (CView*)new CLDPSetupMainView;
TRACE0(" Menu Cal MainChange!!");
break;
}
CCreateContext context;  
context.m_pCurrentDoc=pOldActiveView->GetDocument() ;
pNewActiveView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,wParam,&context) ;
pNewActiveView->OnInitialUpdate() ;
}
SetActiveView(pNewActiveView) ;
pNewActiveView->ShowWindow(SW_SHOW) ;
if    (pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CLDPSetupCalView))      
pOldActiveView->SetDlgCtrlID(IDD_LDP_CAL_FORM);
else if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CLDPSetupMainView)) 
pOldActiveView->SetDlgCtrlID(IDD_LDP_MAIN_FORM);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST) ;
RecalcLayout();
delete pOldActiveView;
CurrentForm = wParam;

return 0;
}

이런식의 함수를 사용하고자 하는 곳에서...

::SendMessage(AfxGetMainWnd()->m_hWnd, UM_MENUCHANGE, IDD_LDP_CAL_FORM, NULL);

이런식으로 호출해서 폼이 바뀌는방식을 주로 쓴다..

-------------------------------------------------------------------------------------------------


그리고 C++ 빌더에서는 다음과 같이 사용한다...
1. 이전 화면이 있으면 삭제..
2. 화면 호출 및 생성
3. 화면 크기를 메인폼에 맞게 수정..(Resize 함수 이용)

// 그려질 폼이 메인폼에 맞게 사이즈를 맞추어 준다...
void __fastcall TMainForm::FormResize(TObject *Sender)
{
if(Frame_User){
Frame_User->Width = ClientWidth;
Frame_User->Height = ClientHeight;
return;
}
else if(Frame_Group)
{
Frame_Group->Width = ClientWidth;
Frame_Group->Height = ClientHeight;
}
}

// 기존의 폼을 제거한다..

int __fastcall TMainForm::DeleteFrame()
{
// 사용자 등록 화면 삭제.
if(Frame_User){
delete Frame_User;
Frame_User = NULL;
}
//...//
}


// 그리고 호출 및 생성은...
void __fastcall TMainForm::N2Click(TObject *Sender)
{ // 사용자 등록
DeleteFrame();  // 호출되어 있는 폼 삭제
Frame_User = new TFrame_User(this); // 현재 폼을 오너로 해서 생성
TRect rect = Rect(0,0, ClientWidth, ClientHeight); // 현재 폼을 전체 덮는 크기로 설정
Frame_User->Dock(this, rect); // 현재 폼을 도킹 시켜 보이게 한다..
}

다음과 같이 처리한다... 어떤 방식이 더 낫다고 볼 수 없다..

어차피, 결과는 똑같으니까..

그런데.. 난 VCL 방식으로 처리하는게 더 좋다.. 왜... 간단하니까....