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 코드에서 폰트 변경 부분을 제외하는 것으로 문제가 해결되었다.
'개발' 카테고리의 다른 글
COM 인터페이스 포인터를 서로 다른 Apartment로 전달하기 (0) | 2007.06.27 |
---|---|
Windows NT 계열에서 프로세스 강제 종료하기 (0) | 2007.06.01 |
투명 이미지 그리기(MaskBlt, TransparentBlt) (1) | 2007.04.03 |
메모리 DC를 이용한 더블 버퍼링 (0) | 2007.03.31 |
Windos Vista에서 IE7 실행 및 IWebBrowser2 인터페이스 얻기 (0) | 2007.02.23 |
댓글