이 참고에서는 Microsoft Windows에 필요한 특수 WNDCLASS를 등록하는 MFC 루틴에 대해 설명합니다. MFC 및 Windows에서 사용하는 특정 WNDCLASS 특성에 대해 설명합니다.
문제
Windows의 핸들과 같은 HWND 개체의 특성은 창 개체와 WNDCLASS의 두 위치에 저장됩니다.
WNDCLASS 이름은 lpszClassName 매개 변수에서 CWnd::Create 및 CFrameWnd::Create와 같은 일반 창 만들기 함수에 전달됩니다.
다음 WNDCLASS 네 가지 수단 중 하나를 통해 등록해야 합니다.
제공된
WNDCLASSMFC로 암시적으로 사용하여.Windows 컨트롤(또는 다른 컨트롤)을 서브클래싱하여 암시적으로 사용합니다.
명시적으로 MFC AfxRegisterWndClass 또는 AfxRegisterClass를 호출합니다.
명시적으로 Windows 루틴 RegisterClass를 호출합니다.
WNDCLASS 필드
구조체는 WNDCLASS 창 클래스를 설명하는 다양한 필드로 구성됩니다. 다음 표에서는 필드를 보여 하며 MFC 애플리케이션에서 필드를 사용하는 방법을 지정합니다.
| 분야 | 설명 |
|---|---|
| lpfnWndProc | window proc, 반드시 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의 배경색 및 커서 값은 CMDIFrameWnd의 클라이언트 영역이 MDICLIENT 창에 의해 완전히 덮이기 때문에 사용되지 않습니다. 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를 호출할 수 있습니다.
CWnd 및 CMDIChildWnd 함수는 Create창 클래스에 대한 lpszClassName 문자열 이름을 첫 번째 매개 변수로 사용합니다. 등록하는 데 사용한 방법에 관계없이 등록된 창 클래스 이름을 사용할 수 있습니다.
Win32의 DLL에서 사용 AfxRegisterClass (또는 AfxRegisterWndClass)하는 것이 중요합니다. Win32는 DLL에 의해 등록된 클래스의 등록을 자동으로 취소하지 않으므로 DLL이 종료될 때 클래스의 등록을 명시적으로 취소해야 합니다. 이 대신 AfxRegisterClass 사용하면 RegisterClass 자동으로 처리됩니다.
AfxRegisterClass 는 DLL에 의해 등록된 고유 클래스 목록을 유지 관리하며 DLL이 종료될 때 자동으로 등록을 취소합니다. DLL에서 사용하는 RegisterClass 경우 DLL이 종료될 때( DllMain 함수에서) 모든 클래스의 등록이 취소되었는지 확인해야 합니다. 이렇게 하지 않으면 다른 클라이언트 애플리케이션이 DLL을 사용하려고 할 때 예기치 않게 실패할 수 RegisterClass 있습니다.
참고하십시오
숫자로 된 기술 노트
범주별 기술 정보