본문 바로가기
개발

MFC의 CPropertySheet, CPropertyPage에서 디자인 깨지는 문제

by 솜씨제이 2007. 2. 28.

MFC의 CPropertySheet와 CPropertyPage는 탭 컨트롤 기반의 환경설정이나 위자드 다이얼로그를 만들 때 많이 사용하는 클래스들이다. 그런데 리소스 에디터에서 디자인한 다이얼로그를 CPropertyPage로 만들어서 사용하다 보면 디자인이 변경되어서 깨지는 문제가 발생하곤 한다. 특히 한글 윈도우에서 디자인한 다이얼로그를 영문 윈도우(물론 랭귀지팩이 깔린)에서 보면 거의 깨져 보인다.
 
원인은 CPropertySheet에서 다이얼로그 템플릿을 초기화할 때 CPropertyPage의 폰트를 CPropertySheet의 폰트와 같은 폰트로 변경하면서 디자인이 바뀌기 때문이다. 이것을 막으려면 CPropertySheet를 상속 받아서 BuildPropPageArray()를 오버라이딩한 다음 폰트를 변경하는 부분을 제거하면 된다. 아래는 예제 코드이다.

void CPropertySheetEx::BuildPropPageArray()
{
    // delete existing prop page array
    delete[] (PROPSHEETPAGE*)m_psh.ppsp;
    m_psh.ppsp = NULL;

    // build new prop page array
    AFX_OLDPROPSHEETPAGE* ppsp = new AFX_OLDPROPSHEETPAGE[m_pages.GetSize()];
    m_psh.ppsp = (LPPROPSHEETPAGE)ppsp;
    BOOL bWizard = (m_psh.dwFlags & (PSH_WIZARD | PSH_WIZARD97));
    for (int i = 0; i < m_pages.GetSize(); i++)
    {
        CPropertyPage* pPage = GetPage(i);
        memcpy(&ppsp[i], &pPage->m_psp, sizeof(pPage->m_psp));
        // 폰트 변경 안함
        //pPage->PreProcessPageTemplate((PROPSHEETPAGE&)ppsp[i], bWizard);
    }
    m_psh.nPages = m_pages.GetSize();
}

원래 MFC 코드에서 폰트 변경 부분을 제외하는 것으로 문제가 해결되었다.

댓글