TN001: 창 클래스 등록

이 참고에서는 Microsoft Windows에 필요한 특수 WNDCLASS를 등록하는 MFC 루틴에 대해 설명합니다. MFC 및 Windows에서 사용하는 특정 WNDCLASS 특성에 대해 설명합니다.

문제

Windows의 핸들과 같은 HWND CWnd 개체의 특성은 창 개체와 WNDCLASS창 개체의 두 위치에 저장됩니다. WNDCLASS 이름은 lpszClassName 매개 변수에서 CWnd::Create 및 CFrameWnd::Create같은 일반 창 만들기 함수에 전달됩니다.

다음 WNDCLASS 네 가지 수단 중 하나를 통해 등록해야 합니다.

  • 제공된 WNDCLASSMFC를 사용하여 암시적으로 .

  • Windows 컨트롤(또는 다른 컨트롤)을 서브클래싱하여 암시적으로 사용합니다.

  • 명시적으로 MFC AfxRegisterWndClass 또는 AfxRegisterClass를 호출합니다.

  • 명시적으로 Windows 루틴 RegisterClass를 호출합니다.

WNDCLASS 필드

구조체는 WNDCLASS 창 클래스를 설명하는 다양한 필드로 구성됩니다. 다음 표에서는 필드를 보여 하며 MFC 애플리케이션에서 필드를 사용하는 방법을 지정합니다.

필드 설명
lpfnWndProc window proc, must be an AfxWndProc
cbClsExtra 사용되지 않음(0이어야 합니다).
cbWndExtra 사용되지 않음(0이어야 합니다).
hInstance AfxGetInstanceHandle로 자동으로 채워짐
hIcon 프레임 창 아이콘은 아래를 참조하세요.
hCursor 마우스가 창 위에 있는 경우 커서는 아래를 참조하세요.
hbrBackground 배경색, 아래 참조
lpszMenuName 사용되지 않음(NULL이어야 합니다).
lpszClassName 클래스 이름, 아래 참조

제공된 WNDCLASSes

이전 버전의 MFC(MFC 4.0 이전)에는 미리 정의된 여러 Window 클래스가 제공되었습니다. 이러한 Window 클래스는 기본적으로 더 이상 제공되지 않습니다. 애플리케이션은 적절한 매개 변수와 함께 사용해야 AfxRegisterWndClass 합니다.

애플리케이션이 지정된 리소스 ID(예: AFX_IDI_STD_FRAME)를 사용하여 리소스를 제공하는 경우 MFC는 해당 리소스를 사용합니다. 그렇지 않으면 기본 리소스를 사용합니다. 아이콘의 경우 표준 애플리케이션 아이콘이 사용되며 커서의 경우 표준 화살표 커서가 사용됩니다.

두 개의 아이콘은 단일 문서 형식의 MDI 애플리케이션을 지원합니다. 즉, 기본 응용 프로그램의 아이콘 하나, 상징적인 문서/MDIChild 창의 아이콘입니다. 아이콘이 다른 여러 문서 형식의 경우 추가 WNDCLASSes를 등록하거나 CFrameWnd::LoadFrame 함수를 사용해야 합니다.

CFrameWnd::LoadFrame 는 첫 번째 매개 변수로 지정한 아이콘 ID와 다음 표준 특성을 사용하여 등록 WNDCLASS 합니다.

  • 클래스 스타일: CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;

  • 아이콘 AFX_IDI_STD_FRAME

  • 화살표 커서

  • COLOR_WINDOW 배경색

CMDIFrameWnd의 배경색 및 커서 값은 MDICLIENT 창에서 완전히 적용되므로 사용되지 CMDIFrameWnd 않습니다. Microsoft는 MDICLIENT 창을 서브클래싱하지 않으므로 가능한 경우 표준 색 및 커서 형식을 사용합니다.

서브클래싱 및 슈퍼클래싱 컨트롤

Windows 컨트롤(예 : CButton)을 서브클래스하거나 슈퍼클래스하는 경우 클래스는 해당 컨트롤의 Windows 구현에 제공된 특성을 자동으로 가져옵니다 WNDCLASS .

AfxRegisterWndClass 함수

MFC는 창 클래스를 등록하기 위한 도우미 함수를 제공합니다. 특성 집합(창 클래스 스타일, 커서, 배경 브러시 및 아이콘)이 지정되면 가상 이름이 생성되고 결과 창 클래스가 등록됩니다. 예를 들면 다음과 같습니다.

const char* AfxRegisterWndClass(UINT nClassStyle,
    HCURSOR hCursor,
    HBRUSH hbrBackground,
    HICON hIcon);

이 함수는 생성된 등록된 창 클래스 이름의 임시 문자열을 반환합니다. 이 함수에 대한 자세한 내용은 AfxRegisterWndClass를 참조 하세요.

반환된 문자열은 정적 문자열 버퍼에 대한 임시 포인터입니다. 다음 호출까지 유효합니다 AfxRegisterWndClass. 이 문자열을 유지하려면 다음 예제와 같이 CString 변수에 저장합니다.

CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);

...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);

...

AfxRegisterWndClass는 창 클래스를 등록하지 못한 경우(잘못된 매개 변수 또는 Windows 메모리 부족) CResourceException을 throw합니다.

RegisterClass 및 AfxRegisterClass 함수

제공하는 것보다 AfxRegisterWndClass 더 정교한 작업을 수행하려면 Windows API RegisterClass 또는 MFC 함수 AfxRegisterClass를 호출할 수 있습니다. CFrameWnd 및 CMDIChildWndCreate 함수CWnd창 클래스에 대한 lpszClassName 문자열 이름을 첫 번째 매개 변수로 사용합니다. 등록하는 데 사용한 방법에 관계없이 등록된 창 클래스 이름을 사용할 수 있습니다.

Win32의 DLL에서 사용 AfxRegisterClass (또는 AfxRegisterWndClass)하는 것이 중요합니다. Win32는 DLL에 의해 등록된 클래스의 등록을 자동으로 취소하지 않으므로 DLL이 종료될 때 클래스의 등록을 명시적으로 취소해야 합니다. 이 대신 RegisterClass 사용하면 AfxRegisterClass 자동으로 처리됩니다. AfxRegisterClass기본 DLL에 의해 등록된 고유 클래스 목록을 확인하고 DLL이 종료될 때 자동으로 등록을 취소합니다. DLL에서 사용하는 RegisterClass 경우 DLL이 종료될 때(DllMain 함수에서) 모든 클래스의 등록이 취소되었는지 확인해야 합니다. 이렇게 하지 않으면 다른 클라이언트 애플리케이션이 DLL을 사용하려고 할 때 예기치 않게 실패할 수 RegisterClass 있습니다.

참고 항목

번호별 기술 참고 사항
범주별 기술 참고 사항