웬디의 기묘한 이야기

글 작성자: WENDYS
반응형

MFC Dialog - FindWIndow를 위한 Class Name 지정하는 방법

요즘에도 MFC를 개발하는 사람이 있는지 모르겠네요...

이번에 MFC Project 중 FindWindow를 사용해야 하는데, Window Title을 바탕으로 하게 되면 오탐이 생길 수 있기 때문에 Class Name을 지정하여 정확한 윈도우를 찾아내기로 했습니다.

먼저 MFC Dialog based 로 프로젝트를 생성하게 되면 기본 Class Name은 #32770입니다.

 

Dialog를 생성하면 기본 Class Name은 #32770 이다.

 

그렇다면 Class Name을 어떻게 변경해야 할까요?

기본적으로 project.rc 파일이 생성되고, 그 안에 Dialog의 Properties를 보게 되면 Class Name이라는 항목이 존재합니다.

그런데 보면 알 수 있듯이 비활성화가 되어있습니다.

 

resource 속성에 class name이 비활성화 되어있다.

 

그렇다면 먼저 저 Class Name을 지정할 수 있도록 변경부터 해야 합니다.

 

 

1. resource 항목에서 project.rc 파일의 Properties를 선택합니다.

 

 

2. MFC Mode를 False로 변경합니다. (기본값은 True입니다.)

 

 

3. Class Name을 입력합니다.

 

Dialog의 Properties를 확인해보면 Class Name을 입력할 수 있도록 활성화가 되어있는 것을 볼 수 있습니다.

MFC Mode를 다시 False 처리하여도 상관없습니다. Class Name은 비활성화 상태로 보이겠지만 resource 에는 적용되기 때문이죠.

 

 

 

resource 파일을 View Code(F7)를 통해 확인해보면 다음과 같이 해당 Dialog 정보에 CLASS "" 값이 추가된 것을 확인할 수 있습니다.

이 말은 즉, Properties를 통해서 변경하지 않고 resource 파일만 변경해도 상관없다는 얘기입니다.

 

여기서 끝이면 참 좋겠지만 MFC는 그렇게 만들지 않았습니다.

만들다 말았다는 생각이 드네요...

 

위와 같이 설정한 후 실행하게 되면 실행 즉시 에러를 맞이하게 됩니다.

 

 

 

바로 MFC 기본 코드는 #32770의 Dialog를 초기화하려고 하는데, 그와 다른 Class Name을 설정했기 때문에 InitInstance()에 실패하게 됩니다. 한 가지 예로 Class Name에 #32770을 입력하고 실행하면 정상 동작합니다.

 

그렇기 때문에 Dialog의 Instance가 실행되기 전 Class Name이 변경되었다고 등록을 해주어야 합니다.

MFC Dialog는 WinAPI와 다르게 Window Create Code가 노출되어있지 않기 때문에 사용자가 사전에 변경할 수 없어요.

그렇기에 Instance가 생성되기 전 생성자에서 Class Name을 등록해주면 Main Dialog가 아닌 새로 생성하는 모든 다이얼로그에 Class Name을 적용할 수 있습니다.

CclassnameDlg::CclassnameDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_CLASS_NAME_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

    //
    // resource와 동일한 Class Name을 지정합니다.
    //
    
    WNDCLASS wc = {};
    ::GetClassInfo(AfxGetInstanceHandle(), _T("#32770"), &wc);
    wc.lpszClassName = _T("WENDYS_CLASS_NAME");
    AfxRegisterClass(&wc);
}

 

 

최종적으로 다이얼로그의 Class Name이 변경된 것을 확인할 수 있습니다.

 

Class Name 변경 시 주의사항

1. resource에만 Class Name을 등록하면 에러가 발생한다.

2. RegisterClass만 호출하게 되면 아무런 변경이 되지 않는다.

즉, resource에 Class Name만 등록하거나 코드 상의 RegisterClass 중 한 가지만 호출해서는 정상 등록되지 않기 때문에 번거롭지만 두 가지 모두를 처리해주어야 합니다.

 

 

반응형