728x90
    반응형

    클래스 포인터 변수로 선언하여 영역에 할당하여 showwindow함수로 호출하는 형식과

    (비모드형 대화상자)

     

    클래스 변수로 선언해서 바로 .domodal함수로 호출하는 방식이 있다.

    (모드형 대화상자)

     

    두가지의 차이가 뭘까?


    2018.08.10 정차장님께서 설명해주셨다.
    Modal / Modeless 방식의 차이라고 하신다.
    모드형 / 비모드형 대화상자

    Modal은 다이얼로그가 생성될 때마다 새로운 다이얼로그를 보여주는 것이다.
    다이얼로그 자체의 형식은 같지만, 윈도우에서 새 폴더를 만드는 것처럼
    매번 새로운 객체를 생성 후 띄우는 것이다.

    +다이얼로그를 닫거나 취소시키기 전까지는 다른 작업이 불가능하다.
    +이 말은 즉 modal 다이얼로그가 화면에 띄어져 있으면 다른 곳 터치가 불가능 하다는 말이다.
    + domodal / enomodal 으로 사용, 반환값으로 IDOK / IDCANCEL 사용
    +스택에 저장 (생성과 소멸 쉽게)


    Ex) 


    *이런 식으로 이벤트 처리기에 클래스 객채 생성 + 불러오기의 과정을 매번 거친다.
    한번 꺼진 객체는 사라진다는 점, 그리고 다시 나타나는 객체는 이전과 다른 새로운 객체인 점을
    고려하여 데이터 저장이 매우 중요하다. 
    A클래스에서 CGetNumDlg를 불러올 때, 다이얼로그 생성시에 A클래스에 저장된 값을 불러와 OnCreate, PreCreate, Initialize…등 생성할 때 보여주는 방식으로 사용할 수도 있다.

    Modeless은 다이얼로그를 껐다가 켜도 해당 다이얼로그가 유지되는 형식이다.
    창을 꺼도 잠깐 숨겨져 있다 다시 불러오면 나타난다고 생각하면 편하다.
    당연히 창을 꺼도 꺼진게 아니므로 그 안의 데이터는 유지된다.

    +힙 영역에 생성된다.
    +Create로 생성하고 ShowWindow / DestroyWindow로 제어
    +Modal형식과는 다르게 다이얼로그가 켜져 있어도 다른 영역 터치가 가능하다.
    +대표적으로 Top, Bottom View들, 그리고 여러 pages등이 이 형식을 사용한다

    Ex)


    *특징이 있다면 다이얼로그가 사라졌다 나타나도 데이터는 유지된다는 점이다.
    유의해야할 점이 있다. Teach Page에서 티칭을 하다 5라는 잘못된 값을 넣고 저장하지 않은다음에 다른 페이지로 넘어갔다. 그러고 나서 다른 사람이 티칭값을 확인하기 위헤 Teach Page를 가면 사라지지 않은 5라는 데이터가 그대로 나타나게 될 것이며 이 사람은 그 5라는 데이터를 티칭값이라고 잘못 인식할 수 있는 상황이 올 수 있다. 이 처럼 페이지가 바뀜에도 데이터는 분명 바뀌지 않는다, 하지만 우리는 저장되있는 정확한 데이터를 사용자에게 보여줄 필요성이 있으므로 페이지가 전환될 때마다 값을 새로고침하는 기능을 넣어주는 편이 더욱 좋다는 것이다.


     

    1. Main Dialog 헤더파에 생성할 다이얼로그 클래스 헤더파일 include 

    #include "ModelManager.h"

     

    2. 포인터 객체 선언

    CModelManager *m_pModelManager;

     

    3. Main Dialog의 생성 시점 (OnInitDialog)에서 Create 해주기

    m_pModelManager = new CModelManager();
    m_pModelManager->Create(IDD_MODEL_MANAGER, NULL);
    m_pModelManager->ShowWindow(SW_HIDE);

     

    4. 소멸 시점 (OnDestroy)에서 delete 해주기

    if (m_pModelManager != NULL)
    {
    	delete m_pModelManager;
    	m_pModelManager = NULL;
    }

     

    5. 사용하기 (SHOW)

    void CDefectClassifierDlg::OnBnClickedButtonSetModelManage()
    {
    	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    	m_pModelManager->ShowWindow(SW_SHOW);
    }

     

    5. 사용하기 (HIDE)

    void CModelAddDialog::OnBnClickedButtonCancel()
    {
    	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
        
    	ShowWindow(SW_HIDE);
    }

     

    728x90
    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기