반응형

MFC의 CDialogEx는 CDialog에서 파생된 클래스로 기능은 거의 비슷하며, 배경을 지정하는 기능이 추가되었다.

참고로, 상속관계는 아래와 같고...

CObject
  CCmdTarget
    CWnd
      CDialog
        CDialogEx

 

CDialogEx에 추가된 메소드들은 아래와 같다.

void SetBackgroundColor(
    COLORREF color,
    BOOL bRepaint=TRUE);

void SetBackgroundImage(
    HBITMAP hBitmap,
    BackgroundLocation location=BACKGR_TILE,
    BOOL bAutoDestroy=TRUE,
    BOOL bRepaint=TRUE);

BOOL SetBackgroundImage(
    UINT uiBmpResId,
    BackgroundLocation location=BACKGR_TILE,
    BOOL bRepaint=TRUE);

 

여기까진 대체로 알려진 얘기들이고, 특별할 건 없다.

문제는 CDialogEx를 사용하면 프로젝트가 제대로 컴파일이 안 되는 상황이 발생할 수도 있다는 점이다.

 

AfxRegisterMFCCtrlClasses(), CMFCControlContainer::SubclassDlgControls() 등등이 이미 정의되어 있다니...

 

정적 라이브러리에서 MFC를 사용[각주:1]하도록 설정을 하면 위 화면과 비슷한 컴파일 오류를 뿜어낸다.

찾아보니 라이브러리 링크 순서를 바꾸라는 식의 해결책이 꽤 보이던데, 훨씬 간단한 해결책이 있다.

 

pch.h(예전에는 stdafx.h 였음)의 내용 일부를 수정하는 것이다.

 

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 일부 CString 생성자는 명시적으로 선언됩니다.
#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS         // 대화 상자에서 MFC 컨트롤에 대한 지원을 제거합니다.

// MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다.
#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC 핵심 및 표준 구성 요소입니다.
#include <afxext.h>         // MFC 확장입니다.

 

위 내용에서 표시한 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS 행을 주석처리하면 문제 없이 컴파일된다.

 

그런데, 이게 끝이 아니다.

이렇게 컴파일하고 나면 실행파일의 크기가 심각하게 커지는 문제가 발생한다.

 

테스트에 사용한 프로젝트는 CDialogEx를 하나도 사용하지 않았는데, 컴파일 결과는 아래와 같았다.

d:\_develop\VS2019\Projects\iTrans\x64\Release>dir
 D 드라이브의 볼륨: All The Data
 볼륨 일련 번호: xxxx-xxxx

 d:\_develop\VS2019\Projects\iTrans\x64\Release 디렉터리

2020-10-11  오전 09:49    <DIR>          .
2020-10-11  오전 09:49    <DIR>          ..
2020-10-11  오전 09:42         1,820,672 iTrans.exe
2020-09-19  오후 07:31    <DIR>          tools
               1개 파일           1,820,672 바이트
               3개 디렉터리  2,267,515,940,864 바이트 남음

d:\_develop\VS2019\Projects\iTrans\x64\Release>

 

그런데, 이를 CDialogEx로 교체한 결과는 아래와 같다.

 

d:\_develop\VS2019\Projects\iTrans Test\x64\Release>dir
 D 드라이브의 볼륨: All The Data
 볼륨 일련 번호: xxxx-xxxx

 d:\_develop\VS2019\Projects\iTrans Test\x64\Release 디렉터리

2020-10-11  오전 09:49    <DIR>          .
2020-10-11  오전 09:49    <DIR>          ..
2020-10-11  오전 09:48         3,892,736 iTrans.exe
2020-09-19  오후 07:31    <DIR>          tools
               1개 파일           3,892,736 바이트
               3개 디렉터리  2,267,515,940,864 바이트 남음

d:\_develop\VS2019\Projects\iTrans Test\x64\Release>

 

배경색이나 배경 이미지를 지정하는 함수를 하나도 사용하지 않았음에도 크기가 2배 이상 늘어난 것이다.

 

두 줄 요약
1. 배경을 반드시 지정해야 되는 경우가 아니라면 CDialog만 사용하는 게 합리적
2. CDialogEx를 사용할 수 밖에 없으면 pch.h를 수정해야 함

 

 

  1. VC 런타임 라이브러리가 없어도 실행되게 하려면 이 설정이 필요함 [본문으로]
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band