이전 글에서는 windows 시스템의 세 가지 윈도우 클래스인 시스템 윈도우 클래스, 글로벌 윈도우 클래스, 로컬 윈도우 클래스를 소개했습니다. 각 윈도우 클래스는 운영체제에서 서로 다른 범위를 가지며, 각 범위에 등록된 윈도우 클래스 이름은 중복될 수 없습니다. 창을 생성할 때 시스템, 전역 및 로컬 범위에서 창 클래스 이름에 따라 검색되는 경우가 많습니다. 검색 프로세스는 다음과 같이 요약됩니다.
(1) 이제 운영 체제는 로컬 창 클래스에서 검색합니다. 들어오는 창 클래스 이름을 기준으로 발견되면 2 단계를 실행하고, 발견되지 않으면 3 단계를 실행합니다.
(2)창을 생성할 때 전달한 HINSTANCE변수와 로컬 창 클래스를 비교하세요. 동일한 것으로 확인되면 생성된 창과 등록된 창이 동일한 모듈에 있다는 의미이며, 생성된 창이 반환됩니다. 같지 않으면 3 단계를 계속 진행하세요.
(3)응용 프로그램 전역 창 클래스에서 검색합니다. 발견되면 4 단계를 실행합니다. 발견되지 않으면 5 단계를 실행합니다.
(4) 찾은 윈도우 클래스 정보를 이용하여 윈도우를 생성하고 복귀합니다.
(5) 시스템 윈도우 클래스에서 검색하여 발견되면 윈도우를 생성합니다. 발견되지 않으면 윈도우 생성이 실패합니다.
을 사용하여 창 클래스를 등록할 수 있습니다.
ATOM WINAPI RegisterClass( _In_ const WNDCLASS *lpWndClass ); ATOM WINAPI RegisterClassEx( _In_ const WNDCLASSEX *lpwcx );From API에서.
프로토타입, 두 매개변수의 차이점은 주로 수신된 매개변수에 있음을 알 수 있습니다. 이 매개변수는 우리가 등록해야 하는 창 클래스입니다. 두 개의 창 클래스는 다음과 같이 선언됩니다. typedef struct tagWNDCLASS {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS, *PWNDCLASS;
typedef struct tagWNDCLASSEX {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
위 코드에서 볼 수 있듯이 두 창 클래스 structures의 주요 차이점은 WNDCLASSEX에 cbSize 창의 구조 크기와 작은 아이콘이 포함된다는 것입니다. hIconSm 창의 핸들입니다. 다른 매개변수의 의미는
GetClassInfoGetClassInfo() API는 등록된 창의 정보를
얻을 수 있습니다.function프로토타입은 다음과 같습니다.
BOOL WINAPI GetClassInfo( _In_opt_ HINSTANCE hInstance, _In_ LPCTSTR lpClassName, _Out_ LPWNDCLASS lpWndClass );hInstance—— set lookup 의 범위를 NULL
로 설정하면 시스템, 전역, 로컬의 세 가지 범위에서 검색됩니다.
lpClassName - 찾을 창 클래스의 이름입니다. lpWndClass - 창 클래스 정보를 수신하는 데 사용되는 전달된 WndClass
구조 변수의 주소입니다. 위에서 생성한
Button클래스의 윈도우 정보를 찾아보자:
WNDCLASS wc; if (GetClassInfo(NULL, "Button", &wc) == false) MessageBox(NULL,"GetClassInfo Faile",NULL,NULL);중단점을 설정하여 얻은 Button
Un. RegisterClass
UnregisterClass를 통해 등록된 창 클래스를 등록 취소할 수 있습니다. 해당 프로토타입은 다음과 같습니다.
BOOL WINAPI UnregisterClass( _In_ LPCTSTR lpClassName, _In_opt_ HINSTANCE hInstance );lpClassName - 제거할 창 클래스의 이름입니다. hInstance —— 검색 범위를 설정합니다. NULL
로 설정하면 시스템, 글로벌, 로컬 세 가지 범위에서 검색합니다. 다음 코드는 등록된
Button🎜 창 클래스를 제거합니다. 🎜🎜if (UnregisterClass("Button",NULL) == false) MessageBox(NULL, "UnregisterClass Faile", NULL, NULL);
위 내용은 Win32 SDK 기초 (6) 윈도우 클래스 검색 과정 및 관련 API에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!