In the previous article, we created a window from scratch. One of the most important steps is to register the window class, such as the following code:
//注册窗口类 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; }
Any window under Windows must be specified in the system before creation Registration, when we use CreateWindowEx to create a window, the name of the second parameter is the window class name. This name should be unique within the scope visible to our code. This article mainly discusses the issues of window classes under Windows.
All visible elements in Windows basically belong to a window, regardless of its shape No matter how, it is round, square, or even irregular. All these windows belong to a certain window class. Generally speaking, Windows window classes are divided into three types:
(1) System window class
(2) Global window class
(3) Local window Class
Below, I will discuss the classification of window classes in Windows respectively.
A button and an edit box, all of which we use in the windows operating system The controls visible in are actually a window. When we install the operating system, Windows will register a large number of system-level window classes within the operating system. When we develop, we can create these windows directly based on the window class names. To explain this problem, we introduce the following code on top of the code in the previous article.
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 is a function we defined to create a window. It receives two parameters, the first is the registered window class name, and the second is the title of the window. Unlike the code in the previous article, we have omitted the step of registering a custom window. Instead, in the WinMain function, CreateMain is called to create a window with the window class name "Button". I think you already know what we're going to do, right? Yes, it is to generate a Button button. All the controls we commonly use have been registered as system window classes by the operating system, and we can use them directly. Please see the results of the following program:
# You can also try to create an edit box such as , drop-down boxes and other system-level windows.
The global window class refers to the window class that can be used in the global scope of the application after registration. For example, we can register the global window class in the dll, then all programs that introduce the dll can use this class. When registering a window class for global use, we only need to add the CS_GLOBALCLASS attribute to the style member of wec's structure when registering, as follows:
wce.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
In order to verify this problem, we add a new dll project, and then define a window registration function RegisterWindow() as follows:
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; }
"DllMain". We call this registration function in the main function of dll to complete the registration. :
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; }
Run Program you will find that we have also successfully produced this window:
我们在上一文中注册的窗口就是一个局部的窗口类,它的特点就是只能在注册的作用域内使用,由于它和全局窗口类只在注册的style和作用域上有分别,这里就不再详述,如要了解,请参照上一文。 The above is the detailed content of Win32 SDK Basics (5) A brief introduction to the window class. For more information, please follow other related articles on the PHP Chinese website!wce.style = CS_HREDRAW | CS_VREDRAW;//未添加CS_GLOBALCLASS