이 영역을 누르면 첫 페이지로 이동
웬디의 기묘한 이야기 블로그의 첫 페이지로 이동

웬디의 기묘한 이야기

페이지 맨 위로 올라가기

웬디의 기묘한 이야기

C/C++ Windows Hooking 개발자의 블로그 입니다! 이곳은 개발 외에도 저의 취미들이 공유되는 기묘한 이야기가 펼쳐집니다.

[MFC] Dialog based - class name 지정하는 간단한 방법

  • 2019.09.08 12:23
  • ⌨ DEVELOPMENT/C++
반응형

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 중 한 가지만 호출해서는 정상 등록되지 않기 때문에 번거롭지만 두 가지 모두를 처리해주어야 합니다.

 

 

반응형

'⌨ DEVELOPMENT > C++' 카테고리의 다른 글

[C/C++] clock vs gettimeofday Linux와 Windows의 코드 실행 시간 측정 방법  (6) 2020.05.03
[C/C++] InternetReadFile Simple File Download.  (6) 2020.03.04
[Solved] Resolver error: The VS Code Server failed to start  (3) 2019.12.14
[C/C++] Get Process Name by Process Id 3가지 방법  (0) 2019.12.12
[C++] Boost ASIO를 이용한 안전한 TCP/IP 비동기 소켓 서버 예제  (5) 2019.08.07
[MFC] Dialog Load GIF image  (5) 2019.07.28
[C++] How to use GDIPlus Library in c++  (0) 2019.07.28
[MFC] 다이얼로그의 윈도우 소멸자 호출 순서  (1) 2019.07.28

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Solved] Resolver error: The VS Code Server failed to start

    [Solved] Resolver error: The VS Code Server failed to start

    2019.12.14
  • [C/C++] Get Process Name by Process Id 3가지 방법

    [C/C++] Get Process Name by Process Id 3가지 방법

    2019.12.12
  • [C++] Boost ASIO를 이용한 안전한 TCP/IP 비동기 소켓 서버 예제

    [C++] Boost ASIO를 이용한 안전한 TCP/IP 비동기 소켓 서버 예제

    2019.08.07
  • [MFC] Dialog Load GIF image

    [MFC] Dialog Load GIF image

    2019.07.28
다른 글 더 둘러보기

정보

웬디의 기묘한 이야기 블로그의 첫 페이지로 이동

웬디의 기묘한 이야기

  • 웬디의 기묘한 이야기의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록
  • 이야기

카테고리

  • 분류 전체보기 (204)
    • MY STORY (2)
    • 📸 WALKING WITH YOU (85)
      • 아이슬란드 신혼여행 이야기 (14)
      • 대한민국 구석구석 (62)
      • CONTAX N1 + T* 28-80mm (4)
      • SAMSUNG NX3000 (1)
      • 어느 멋진 날 (4)
    • ⌨ DEVELOPMENT (80)
      • BOOK:Review (1)
      • AI (13)
      • C++ (26)
      • Python (10)
      • WIndows Hooking (9)
      • Windows Kernel (3)
      • Design Pattern (3)
      • Debugging (9)
      • Tools (0)
      • Project (1)
      • Android (1)
      • 상업용 무료폰트 (4)
    • OS (4)
      • News (0)
      • Windows 일반 (4)
    • 모바일 (2)
      • 모바일 게임 (2)
    • 멘사 퍼즐 (9)
    • 생활 꿀 TIP (7)
      • 건강 (3)
      • 일상 (2)
    • 물생활 (8)
      • 골든볼 라미네지 롱핀 (8)
    • IT 기기 (2)
    • BLOG (4)
      • TISTORY BLOG TIP (3)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • c
  • c++
  • 카페
  • AI
  • 신혼여행
  • 해외여행
  • 아이슬란드
  • windbg

나의 외부 링크

  • kernel undocument api
  • 지구 관찰자의 일기
  • 지구와 지구곰

정보

WENDYS의 웬디의 기묘한 이야기

웬디의 기묘한 이야기

WENDYS

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © WENDYS. Designed by Fraccino.

티스토리툴바