Post

MFC 에서 윈도우 클래스명 변경

모처럼 강좌로 인해 MSDN 을 뒤적이다가 이런 것을 발견했습니다.
음…이건 어떤 회사들한테는 유용한 팁이라는 군요…
보통 win api 는 쉽게 클래스명을 바꿀수 있지만 MFC 는 좀 숨겨져 있군요…이걸 좀 알았습니다…
Spy++로 다이얼로그 기반의 프로그램을 찍어보면 클래스의 기본값이 “#32770”으로 적혀져 있는데
이걸 바꾸는 팁입니다…음…엠에스디엔을 뒤적이다 적은 거라서….뒷북일 것이냐 아니면 큰 볼거리는 안되겠네요

하여간 적어 본다면 우선 주의할 점은 다이얼로그 기반의 클래스 명 바꾸는 것이 SDI 나 MDI 에서는 통하지 않습니다…
이건 또 찾아보아야…긁적…

app 분야에 요걸 적어 주시구…

1
2
3
4
5
6
7
8
9
10
11
12
BOOL CLimitDlgInstanceApp::InitInstance()
{
    WNDCLASS wc;

    // 바꾸고자 하는 클래스명임돠...
    wc.lpszClassName = "MyPrivateClassName";

    // Register this class so that MFC can use it.
    AfxRegisterClass(&wc);    

      생략.....
}  

그리고 rc 파일을 텍스트 기반으로 읽으셔서
코딩함돠…

1
2
3
4
5
6
7
8
9
10
11
IDD_LIMITDLGINSTANCE_DIALOG DIALOGEX 0, 0, 195, 44
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "LimitDlgInstance"
CLASS "MyPrivateClassName" // 여기를 추가....
FONT 8, "MS Sans Serif"
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,138,7,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,138,23,50,14
    PUSHBUTTON      "&Test!",IDC_BUTTON1,48,14,49,15
END 

spy로 검사해 보시면 값이 바뀌어 있슴을 알수 있습니다….
그럼…


안녕하세요….

좋은 글 적어주신 것 감사합니다..

적으신 내용중에 빠진 부분이 있어서 추가합니다….

위의 글처럼 하시면 프로그램이 그냥 종료해 버릴 것입니다…

이유는 wc.cbWndExtra 에 값이 없기 때문입니다… 그렇다고 이 값과 클래스명만 입력한다고 되는 것은 아닙니다..

나머지 필요한 것들도 입력을 해 주셔야만 합니다…

간편하게는 다음과 같이 하시면 됩니다… (MSDN에 나오는 내용입니다)

1
2
3
4
5
6
7
8
9
    // Change the name of the class.

    ::GetClassInfo(AfxGetInstanceHandle(), "#32770", &wndClass);

    // Register this class so that MFC can use it.

    wndClass.lpszClassName = _T("ComicsViewerByMirjini");

    AfxRegisterClass(&wndClass);

또는 직접 WNDCLASS 의 인자값들을 넣어주시면 됩니다…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    // 윈도우 클래스명 지정
    WNDCLASS    wndClass;

    ::ZeroMemory(&wndClass, sizeof(WNDCLASS));
    wndClass.lpfnWndProc   = ::DefDlgProc;
    wndClass.hInstance     = AfxGetInstanceHandle();
    wndClass.hCursor       = LoadCursor(IDC_ARROW);
    wndClass.lpszMenuName  = NULL;
    wndClass.style         = 2056;
//    wndClass.style         = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
    wndClass.cbWndExtra    = DLGWINDOWEXTRA;
    wndClass.lpszClassName = _T("ComicsViewerByMirjini");
    BOOL bRet = AfxRegisterClass(&wndClass);

    if(!bRet)
    {
        AfxMessageBox("윈도우 클래스 등록에 실패하였습니다. 프로그램을 종료합니다.");
        return FALSE;
    }

아래는 MSDN에 있는 것이니 직접 찾아서 보시기 바랍니다… 몇 가지 사항이 더 있으니까요…

참고로 WNDCLASS에 대해서도 찾아보시면 좋겠네요….

HOWTO: Provide Your Own Window Class Name for an MFC Dialog Box(Q251059)
** MDI, SDI는 메인프레임의 PreCreateWindow 에서 기반 함수 호출전에 cs 의 클래스명을 입력하신 후 호출하시면 됩니다…

[출처] MFC 에서 윈도우 클래스명 변경작성자 solaris1