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;
}
//...//
}
메인폼에 사용자 메시지를 받을 수 있는 함수를 다음과 같이 작성한다..
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 방식으로 처리하는게 더 좋다.. 왜... 간단하니까....
'MFC' 카테고리의 다른 글
SDI 단일 문서에 다중 뷰 추가 - MSDN 표준방식 (0) | 2008.09.04 |
---|---|
Multi_View 사용하는 방법 - 소스 참조 (1) | 2008.09.04 |
스플릿트 윈도우 외국 소스 - 참조 (0) | 2008.09.04 |
여러개의 뷰를 만들고 뷰 전환하기 - 참조.... (1) | 2008.09.04 |
Managing the State Data of MFC Modules (0) | 2008.09.04 |
How To Debug MFC Module and Thread State Problems (1) | 2008.09.04 |
TN058: MFC Module State Implementation (0) | 2008.09.04 |