TN001: 창 클래스 등록
이 부분에서는 Microsoft Windows를 필요로 하는 특수한 WNDCLASS 레지스터에 대한 MFC 루틴을 설명합니다. MFC와 Windows에 의해 사용되는 특정 WNDCLASS 특성을 설명합니다.
문제
Windows에서 HWND 처리기처럼, CWnd 개체의 특성은 두 위치에 저정됩니다: window 개체와 WNDCLASS. CWnd::Create 와 lpszClassName 에서 CFrameWnd::Create 처럼 WNDCLASS 의 이름이 windows생성함수들로 전달됩니다.
이 WNDCLASS 는 네 가지 방법 중 하나를 통해 등록되어야 합니다:
암시적으로 MFC를 사용하여 WNDCLASS를 제공합니다.
암시적으로 Windows 컨트롤 (또는 다른 컨트롤)을 서브클래싱합니다.
명시적으로 MFC AfxRegisterWndClass 또는 AfxRegisterClass 을 호출합니다.
명시적으로 Windows RegisterClass 루틴을 호출합니다.
WNDCLASS 필드
WNDCLASS 구조체는 window 클래스를 설명하는 다양한 필드로 구성됩니다. 다음 표는 필드를 보여주고 MFC 응용프로그램에서 어떻게 그들을 사용하는지를 지정합니다.
필드 |
설명 |
---|---|
lpfnWndProc |
창 프로시져는 AfxWndProc 이 되어야만 합니다. |
cbClsExtra |
사용되지 않습니다(0 이되어야합니다.). |
cbWndExtra |
사용되지 않습니다(0 이되어야합니다.). |
hInstance |
자동으로 AfxGetInstanceHandle 을 사용하여 채워집니다. |
hIcon |
프레임 창에 대한 아이콘은, 아래를 참고하세요. |
hCursor |
마우스가 창 위에 있을 때, 커서에 대해서는 아래를 참고하세요. |
hbrBackground |
배경색은 아래를 참고하세요. |
lpszMenuName |
사용되지 않습니다(NULL이 되어야합니다.) |
lpszClassName |
클래스 이름은 아래를 참고하세요. |
WNDCLASSes를 제공합니다.
이전 버전의 MFC (MFC 4.0 이전)에, 미리 정의된 몇몇 Windows를 제공합니다. 이러한 창 클래스는 더 이상 기본적으로 제공되지 않습니다. 응용 프로그램은 적절한 매개변수와 함께 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 창의 서브클래싱을 권장 하지 않기 때문에 표준 색상을 사용하고, 가능하다면 커서 형식들을 사용합니다.
서브클래싱과 컨트롤 슈퍼클래싱.
만일 창 컨트롤을 슈퍼클래스 또는 서브클래스 한다음,(예를 들어, CButton) 클래스는 자동적으로 컨트롤의 Windows 구현에서 제공되는 WNDCLASS 특성을 얻습니다.
AfxRegisterWndClass 함수
MFC 창 클래스를 등록하기 위한 helper함수를 제공합니다. 특성의 집합(창 클래스 스타일, 커서, 배경 브러쉬, 아이콘)을 제공하고 종합적인 이름을 생성되고, 결과 창 클래스가 등록됩니다. 예를 들면 다음과 같습니다.
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, ...);
...
만일 창 클래스의 등록이 실패한다면,(잘못된 매개변수 또는 Windows 메모리를 벗어나기때문에) AfxRegisterWndClass 는 CResourceException 를 발생시킵니다.
RegisterClass 및 AfxRegisterClass 함수들
만일 AfxRegisterWndClass 이 제공하는 것보다 정교한 것을 원한다면, Windows API RegisterClass 또는 MFC 함수 AfxRegisterClass 을 호출할 수 있습니다. CWnd, CFrameWnd 와 CMDIChildWnd Create 함수들은 첫 번째 매개변수로써 창 클래스에 대한 lpszClassName 문자열 이름을 사용합니다. 등록에 사용되는 방법에 관계 없이, 등록된 창 클래스 이름을 사용할 수 있습니다.
Win32에서 DLL에 AfxRegisterClass(또는 AfxRegisterWndClass) 을 사용하는 것은 중요합니다. Win32는 DLL에 의해 등록된 클래스들이 자동적으로 등록이 해제되지 않으므로, DLL이 종료될때 명시적으로 등록을 해제해야합니다. RegisterClass 대신 AfxRegisterClass 을 사용함으로써 이것은 자동적으로 처리됩니다. AfxRegisterClass DLL에 의해 등록된 유일한 클래스들의 목록을 유지하고 DLL이 종료될때 자동적으로 등록을 해제합니다. DLL에서 RegisterClass 을 사용하는 경우, DLL이 종료될 때(DllMain 함수에서) 모든 클래스들의 등록이 해제되는지 확인해야 합니다. DLL을 사용하기 위해 다른 클라이언트 어플리케이션을 사용할 때, 예기치않은 실패에 대한 RegisterClass 을 야기할 수 있습니다.