이전 글에서는 처음부터 창을 만들었습니다. 매우 중요한 단계 중 하나는 다음 코드에 표시된 대로 창 클래스를 등록하는 것입니다.
//注册窗口类 BOOL Register(LPSTR lpClassName, WNDPROC wndProc) { WNDCLASSEX wce = { 0 }; wce.cbSize = sizeof(wce); wce.cbClsExtra = 0; wce.cbWndExtra = 0; wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wce.hCursor = NULL; wce.hIcon = NULL; wce.hIconSm = NULL; wce.hInstance = g_hInstance; wce.lpfnWndProc = wndProc; wce.lpszClassName = lpClassName; wce.lpszMenuName = NULL; wce.style = CS_HREDRAW | CS_VREDRAW; ATOM nAtom = RegisterClassEx(&wce); if (nAtom == 0) return FALSE; return true; }
Windows의 모든 창은 생성되기 전에 시스템에 명시적으로 등록되어야 합니다. CreateWindowEx를 사용하여 창을 만듭니다. 생성 시 두 번째 매개변수의 이름은 창 클래스 이름이며, 코드에 표시되는 범위 내에서 고유해야 합니다. 이 문서에서는 주로 Windows의 창 클래스 문제에 대해 설명합니다.
Windows에서 보이는 모든 요소는 기본적으로 원형, 사각형, 불규칙 등 모양에 관계없이 창에 속합니다. 이러한 창은 모두 특정 창 클래스에 속합니다. 일반적으로 Windows 창 클래스는 세 가지 유형으로 나뉩니다.
(1) 시스템 창 클래스
(2) 전역 창 클래스
(3) 로컬 창 클래스
아래에서는 분류를 하겠습니다. Windows의 창 클래스에 대해서는 별도로 설명합니다.
버튼 , 편집 상자, Windows 운영 체제에서 볼 수 있는 모든 컨트롤 은 실제로 창입니다. 운영 체제를 설치하면 Windows는 운영 체제 내에 수많은 시스템 수준 창 클래스를 등록합니다. 개발할 때 창 클래스 이름을 기반으로 이러한 창을 직접 만들 수 있습니다. 이 문제를 설명하기 위해 이전 기사의 코드 위에 다음 코드를 도입합니다.
HWND CreateMain(LPSTR lpClassName, LPSTR lpWndName) { HWND hWnd = CreateWindowEx(0, lpClassName, lpWndName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL); return hWnd; } int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { // TODO: Place code here. g_hInstance = hInstance; HWND hWnd = CreateMain("Button", "window"); Display(hWnd); Message(); return 0; }
CreateMain은 창을 생성하기 위해 정의한 함수입니다. 두 개의 매개변수를 받습니다. 첫 번째는 등록된 창 클래스 이름이고 두 번째는 창 제목입니다. 이전 글의 코드와는 다르게 커스텀 윈도우를 등록하는 단계를 생략했습니다. 대신 WinMain 함수에서 CreateMain이 호출되어 창 클래스 이름이 "Button"인 창을 만듭니다. 우리가 무엇을 할지 이미 알고 계시겠죠? 예, Button 버튼을 생성하는 것입니다. 우리가 일반적으로 사용하는 모든 컨트롤은 운영 체제에 의해 시스템 창 클래스로 등록되어 있으며 직접 사용할 수 있습니다. 아래 프로그램 결과를 확인하세요.
편집 상자, 드롭다운 상자 등과 같은 다른 시스템 수준 창을 만들어 볼 수도 있습니다.
글로벌 윈도우 클래스란 등록 후 애플리케이션의 글로벌 범위에서 사용할 수 있는 윈도우 클래스를 말한다. 예를 들어, dll에 전역 창 클래스를 등록하면 dll을 도입하는 모든 프로그램이 이 클래스를 사용할 수 있습니다. 전역적으로 사용되는 윈도우 클래스를 등록할 때 wec의 structure 스타일 멤버에 CS_GLOBALCLASS속성만 추가하면 됩니다. 다음과 같이
wce.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
이 문제를 확인하기 위해, 우리는 새로운 dll 프로젝트를 추가하고 다음과 같이 창 등록 함수 RegisterWindow()를 정의합니다.
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0);//可以使GetMessage返回0 break; default: break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } BOOL RegisterWindow() { WNDCLASSEX wce = { 0 }; wce.cbSize = sizeof(wce); wce.cbClsExtra = 0; wce.cbWndExtra = 0; wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wce.hCursor = NULL; wce.hIcon = NULL; wce.hIconSm = NULL; wce.hInstance = NULL; wce.lpfnWndProc = WndProc; wce.lpszClassName = "DllMain"; wce.lpszMenuName = NULL; wce.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS; ATOM nAtom = RegisterClassEx(&wce); if (nAtom == 0) return FALSE; return true; }
RegisterWindow()에 등록된 창 클래스의 이름은 "DllMain"이며, dll의 주요 기능 등록 기능은 등록을 완료합니다.
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { .... RegisterWindow(); return TRUE; } }
이 창 클래스를 사용하여 기본 프로그램에 창을 만듭니다.
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { ... HWND hWnd = CreateMain("DllMain", "我是一个Dll注册的窗口"); Display(hWnd); Message(); return 0; }
프로그램을 실행하면 다음과 같은 결과가 나타납니다. 또한 이 창을 성공적으로 생성했습니다.
2.3 로컬 창 클래스
로컬 창 클래스는 정의 측면에서 정의되며 모든 cs_globalclass는 WCE 스타일에 추가되지 않으며 등록된 창 클래스는 로컬입니다. 창 수업.
wce.style = CS_HREDRAW | CS_VREDRAW;//未添加CS_GLOBALCLASS
我们在上一文中注册的窗口就是一个局部的窗口类,它的特点就是只能在注册的作用域内使用,由于它和全局窗口类只在注册的style和作用域上有分别,这里就不再详述,如要了解,请参照上一文。
위 내용은 Win32 SDK 기초 (5) 윈도우 클래스에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!