반응형

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

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

1
2
3
4
5
CObject
  CCmdTarget
    CWnd
      CDialog
        CDialogEx

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 였음)의 내용 일부를 수정하는 것이다.

 

1
2
3
4
5
6
7
8
#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를 하나도 사용하지 않았는데, 컴파일 결과는 아래와 같았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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로 교체한 결과는 아래와 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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