폼뷰에 프로퍼티 시트 넣기 ver 2.0

 ver 2.0 수정사항 : 프로퍼티 시트의 오른쪽과 아래쪽 부분의 경계가 나오지 않는 부분 해결.

참고자료 : 서적 '따라해보세요 Visual C++ 6',
 www.codeguru.com의 Property Sheet 섹션 "Creating a Property Sheet Inside a Dialog" 의 Comments 부분 "Solution to minimum width problem"

 

 일반적으로 프로퍼티 시트는 대화 상자에서 구현되는데 여기서는 폼뷰에 프로퍼티 시트를 넣어볼 것이다.

1. 폼뷰를 가지는 프로젝트를 하나 만든다.

2. 자신의 폼뷰에 프로퍼티 시트를 넣을 위치를 표시하는 컨트롤을 만든다. 시트의 부모 위도우로 그림 컨트롤(picture 컨트롤)을 사용한다. 그림 컨트롤을 Visible로 타입을 Frame으로 하고, ID는 IDC_PLACEHOLDER로 하자.

3. CPropertySheet에서 파생된 CMyPropertySheet 클래스를 만든다.

 이 클래스에서 다음과 같은 생성자를 새로 만든다.

        CMyPropertySheet::CMyPropertySheet(CWnd *pParentWnd = NULL);

그리고 나머지는 모두 지운다.

(추가내용 : 파생클래스를 만들지 않고 CPropertySheet를 그냥 사용할 경우, 여러개의 페이지를 추가했을 때 처음 페이지만 표시되고, 다른 페이지가 나타나지 않더군요)

4. 폼뷰 클래스에 새로 만든 프로퍼티 시트의 포인터를 추가한다.

 물론 새로 만든 클래스를 쓰기 전에 폼뷰의 헤더파일에 새로 만든 프로퍼티 시트의 헤더파일을 인클루드 한다.

 

5. 폼뷰의 OnInitialUpdate() 함수에 다음을 추가한다.

void CFSView::OnInitialUpdate()
{
        CFormView::OnInitialUpdate();
        GetParentFrame()->RecalcLayout();
        ResizeParentToFit();

        // create and associated the property sheet with the "place holder" window
        CWnd *pPlaceHolder = GetDlgItem(IDC_PLACEHOLDER);
        m_pMyPropertySheet = new CMyPropertySheet(pPlaceHolder);

        if(!m_pMyPropertySheet->Create(pPlaceHolder, WS_CHILD | WS_VISIBLE, 0)) {
                delete m_pMyPropertySheet;
                m_pMyPropertySheet = NULL;
                return;
        }

        // fit the property sheet into the place holder window, and show it
        CRect rcSheet;

        pPlaceHolder->GetWindowRect(&rcSheet);
        ScreenToClient(&rcSheet);

        // 이 부분이 오른쪽과 아래쪽의 border부분을 해결한 부분
        CTabCtrl *TabCtrl = m_pMyPropertySheet->GetTabControl();
        TabCtrl->MoveWindow(0, 0, rcSheet.Width(), rcSheet.Height());
        
        m_pMyPropertySheet->SetWindowPos(NULL, 0, 0,
                rcSheet.Width(), rcSheet.Height(), SWP_NOZORDER | SWP_NOACTIVATE);

        m_pMyPropertySheet->ModifyStyleEx(0, WS_EX_CONTROLPARENT);
        m_pMyPropertySheet->ModifyStyle(0, WS_TABSTOP);
        m_pMyPropertySheet->SetActivePage(0); // Force the right & bottom borders to appear
}

6. 프로퍼티 시트 안에 넣을 프로퍼티 페이지를 위한 다이얼로그를 만든다.

 style : child , Border : thin, Title bar 만 체크되도록 한다.

7. 만들어진 다이얼로그에 연결되는 클래스들을 각각 만든다. 관리상의 편의를 위해 한 파일에 프로퍼티 페이지의 클래스들을 모아두는 것도 좋겠다. 여기서는 다이얼로그를 2개 만들고,그에 연결되는 클래스를 CPage1, CPage2 라고 이름을 지었다.

  베이스 클래스는 반드시 CPropertyPage 로 해야한다.

8. CMyPropertySheet 클래스에 각 페이지의 객체를 멤버변수로 선언한다. 그리고 헤더파일도 인클루드한다. (MyPropertySheet.h)

9. CPropertySheet 의 생성자에 AddPage() 함수를 써서 각각의 페이지를 추가한다.

CMyPropertySheet::CMyPropertySheet(CWnd *pParentWnd)
{
        AddPage(&m_Page1);
        AddPage(&m_Page2);

}

 

- the end of this article -