MFC에서 프로젝트를 FormView를 쓰면 화면 전환시에 사용하는 법은 다음과 같이 난 작성한다...

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

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

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

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


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

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

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

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

-2006.06.29 -

 

  1. 두개의 다른 윈도우를 생성해 SDI처럼 보여줄때.. 사용한 방식...

    void __fastcall Tfrm_Menu::FormChange()
    {
    TRect rect = Rect(0,60, 1024, 708);

    FormDelete(); // 이전 폼 삭제

    if(Menu_Val == 0)
    {
    //TfrmMain *frmMain = new TfrmMain(this);
    frm_Main = new Tfrm_Main(this); // 현재 폼을 오너로 해서 생성
    frm_Main->Show();

    String temp="..\\img\\mnu01_b.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_Main->Canvas->Draw(0,0, BrushBmp);
    }
    else if(Menu_Val == 1){
    frm_Device = new Tfrm_Device(this);
    frm_Device->Show();

    String temp="..\\img\\mnu02_b.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_Device->Canvas->Draw(0,0, BrushBmp);
    }
    /* else if(Menu_Val == 2)
    {
    frm_Manual = new Tfrm_Manual(this); // 현재 폼을 오너로 해서 생성
    frm_Manual->Show();
    } */
    else if(Menu_Val == 2)
    {
    frm_Setting = new Tfrm_Setting(this); // 현재 폼을 오너로 해서 생성
    frm_Setting->Show();

    String temp="..\\img\\mnu03_b.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_Setup->Canvas->Draw(0,0, BrushBmp);
    }
    else if(Menu_Val == 3)
    {
    frm_IOMap = new Tfrm_IOMap(this); // 현재 폼을 오너로 해서 생성
    frm_IOMap->Show();

    String temp="..\\img\\mnu04_b.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_IOMap->Canvas->Draw(0,0, BrushBmp);
    }
    /* else if(Menu_Val == 99)
    {
    frm_Test = new Tfrm_Test(this); // 현재 폼을 오너로 해서 생성
    frm_Test->Show();
    }
    */
    }

    void __fastcall Tfrm_Menu::FormDelete()
    {

    // 다이얼로그가 살아있다면 없애고...

    if(frm_Keypad)
    {
    delete frm_Keypad;
    frm_Keypad = NULL;
    }

    // 이전 폼 삭제../
    if(frm_Main)
    {
    delete frm_Main;
    frm_Main = NULL;

    String temp="..\\img\\mnu01_a.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_Main->Canvas->Draw(0,0, BrushBmp);
    }
    else if(frm_Device)
    {
    delete frm_Device;
    frm_Device = NULL;

    String temp="..\\img\\mnu02_a.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_Device->Canvas->Draw(0,0, BrushBmp);
    }
    /* else if(frm_Manual)
    {
    delete frm_Manual;
    frm_Manual = NULL;
    }
    */
    else if(frm_Setting)
    {
    delete frm_Setting;
    frm_Setting = NULL;

    String temp="..\\img\\mnu03_a.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_Setup->Canvas->Draw(0,0, BrushBmp);
    }
    else if(frm_IOMap)
    {
    delete frm_IOMap;
    frm_IOMap = NULL;

    String temp="..\\img\\mnu04_a.bmp";
    Graphics::TBitmap *BrushBmp=new Graphics::TBitmap();
    BrushBmp->LoadFromFile(temp);
    btn_IOMap->Canvas->Draw(0,0, BrushBmp);
    }
    /*
    else if(frm_Test)
    {
    delete frm_Test;
    frm_Test = NULL;
    }
    */

    }

  2. 위의 MFC 방법에서 조금 더 손본 것...
    LRESULT CMainFrame::OnFormChange(WPARAM wParam, LPARAM lParam)
    {
    // Form Change
    CCreateContext context;
    CView* pOldActiveView = /*(CView *)*/GetActiveView(); // 현재 뷰를 기록한다
    CView* pNewActiveView = (CView *)GetDlgItem(wParam); // 새 뷰를 지정 Form으로 생성한다..
    context.m_pCurrentDoc = pOldActiveView->GetDocument() ; // 이전 뷰의 도큐먼트를 가져오고..

    if((pNewActiveView == NULL))// && (pOldActiveView != pNewActiveView))
    {
    switch (wParam)
    {
    case IDD_FORMVIEW_MAIN :
    pNewActiveView = (CView*)new CFrmMain();
    break;

    case IDD_FORMVIEW_SETUP :
    pNewActiveView = (CView*)new CFrmSetup();
    break;

    case IDD_FORMVIEW_MANUAL :
    pNewActiveView = (CView*)new CFrmManual();
    break;

    case IDD_FORMVIEW_MONITOR :
    pNewActiveView = (CView*)new CFrmMonitor();
    break;

    case IDD_FORMVIEW_INFO :
    pNewActiveView = (CView*)new CFrmInfo();
    break;

    default:
    pNewActiveView = (CView*)new CFrmMain();
    break;
    }
    pNewActiveView->Create(NULL,
    NULL,
    0L,
    CFrameWnd::rectDefault,
    this, wParam, &context) ; // 새로운 뷰틀 만들고

    pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
    pNewActiveView->ModifyStyleEx(WS_EX_CLIENTEDGE, 0); // 오목 없애기..
    pNewActiveView->ModifyStyleEx(WS_EX_TRANSPARENT, 0); // 투명

    pNewActiveView->OnInitialUpdate(); // 뷰의 내용을 초기화 하고
    pNewActiveView->ShowWindow(SW_SHOW); // 새로운 View를 보인다.
    SetActiveView(pNewActiveView, TRUE); // 새로운 뷰를 활성하고.. // 쓰기 에러 발생부분

    // 디버그일때는 숨김으로 표시하도록 하고 .. Release일때는 폼을 삭제하도록 하자..

    #ifdef _DEBUG
    pOldActiveView->ShowWindow(SW_HIDE); // 숨김이 아니라 종료로 바꿔야 되는데... ㅠㅠ
    // pOldActiveView->DestroyWindow();
    // delete pOldActiveView; // 종료 시키고 메모리에서도 제거하자..(메모리릭 방지)
    #else
    pOldActiveView->ShowWindow(SW_HIDE); // 숨김이 아니라 종료로 바꿔야 되는데... ㅠㅠ
    pOldActiveView->DestroyWindow();
    // delete pOldActiveView; // 종료 시키고 메모리에서도 제거하자..(메모리릭 방지)
    #endif //_DEBUG
    ((CMainFrame *)AfxGetMainWnd())->RecalcLayout(); // 윈도우를 새로 갱신하자
    }
    return 0;
    }

    // DEBUG에서 이전 폼을 삭제하려고 하면 에러가 난다..
    // 원인 찾으면 다시 댓글로 처리..

+ Recent posts