가나소프트 이야기

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); // 현재 폼을 도킹 시켜 보이게 한다..


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


김용유닷컴(kimyongyu.com) 예전글에서 발췌 수정

사업자 정보 표시
가나소프트 | 김용유 | 충남 천안시 동남구 목천읍 서리2길 42-1 | 사업자 등록번호 : 312-33-14797 | TEL : 070-8659-0316 | Mail : contact@gana-soft.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기