Maison  >  Article  >  Opération et maintenance  >  Win32 SDK Basics (5) Une brève introduction à la classe window

Win32 SDK Basics (5) Une brève introduction à la classe window

黄舟
黄舟original
2017-06-06 09:42:552519parcourir

1. Introduction

Dans l'article précédent, nous avons créé une fenêtre à partir de zéro. Une étape très importante consiste à enregistrer la classe de fenêtre, comme le code suivant :

//注册窗口类
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;
}

Toute fenêtre sous Windows doit être dans le système avant d'être créée. Elle a été clairement enregistré. Lorsque nous utilisons CreateWindowEx pour créer une fenêtre, le nom du deuxième paramètre est le nom de la classe de la fenêtre. Ce nom doit être unique dans la portée visible par notre code. Cet article aborde principalement les problématiques des classes de fenêtres sous Windows.

2. Classification des fenêtres

Tous les éléments visibles dans Windows appartiennent essentiellement à une fenêtre, quelle que soit sa forme. il est rond, carré ou même irrégulier. Toutes ces fenêtres appartiennent à une certaine classe de fenêtre. De manière générale, les classes de fenêtres Windows sont divisées en trois types :
(1) Classe de fenêtre système
(2) Classe de fenêtre globale
(3) Classe de fenêtre locale
Ci-dessous, je discuterai respectivement de la classification des classes de fenêtres dans Windows.

2.1 Classe de fenêtre système

Un bouton et une zone d'édition, que nous avons tous dans le système d'exploitation Windows Les contrôles visibles dans sont en fait une fenêtre. Lorsque nous installons le système d'exploitation, Windows enregistrera un grand nombre de classes de fenêtres au niveau du système dans le système d'exploitation. Lorsque nous développons, nous pouvons créer ces fenêtres directement en fonction des noms de classes de fenêtres. Pour expliquer ce problème, nous introduisons le code suivant en plus du code de l'article précédent.

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 est une fonction que nous avons définie pour créer une fenêtre. Il reçoit deux paramètres, le premier est le nom de la classe de fenêtre enregistrée et le second est le titre de la fenêtre. Contrairement au code de l'article précédent, nous avons omis l'étape d'enregistrement d'une fenêtre personnalisée. Au lieu de cela, dans la fonction WinMain, CreateMain est appelée pour créer une fenêtre avec le nom de classe de fenêtre « Button ». Je pense que tu sais déjà ce que nous allons faire, n'est-ce pas ? Oui, il s'agit de générer un bouton Button. Tous les contrôles que nous utilisons couramment ont été enregistrés en tant que classes de fenêtres système par le système d'exploitation et nous pouvons les utiliser directement. Veuillez consulter les résultats du programme suivant :



Vous pouvez également essayer de créer une modification boîte de dialogue telle que , listes déroulantes et autres fenêtres au niveau du système.

2.2 Classe de fenêtre globale

La classe de fenêtre globale fait référence à la classe de fenêtre qui peut être utilisée dans la portée globale du candidature après inscription. Par exemple, nous pouvons enregistrer la classe globale de fenêtre dans la DLL, puis tous les programmes qui introduisent la DLL peuvent utiliser cette classe. Lors de l'enregistrement d'une classe de fenêtre utilisée globalement, il nous suffit d'ajouter l'attribut CS_GLOBALCLASS au membre de style de lastructure de wec lors de l'enregistrement, comme suit :

	wce.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;

Afin de vérifier ce problème, nous ajoutons un nouveau projet dll, puis définissons une fonction d'enregistrement de fenêtre RegisterWindow() comme suit :

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;
}

Le nom de la classe de fenêtre enregistrée dans RegisterWindow() est "DllMain", que nous appelons dans la fonction principale de dll La fonction d'enregistrement termine l'enregistrement :

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	....
	RegisterWindow();
	return TRUE;
}
}

Utilisez cette classe de fenêtre pour créer une fenêtre dans notre programme principal :

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;
}

Exécutez le programme et vous constaterez que nous avons produit avec succès cette fenêtre :



2.3 Classe de fenêtre locale

Définition de la classe de fenêtre locale, toutes les cs_globalClass qui n'est pas ajouté au style de WCE, et et et, et,, à,,, pour définir, Les classes de fenêtre enregistrées sont toutes des classes de fenêtre partielles.

wce.style = CS_HREDRAW | CS_VREDRAW;//未添加CS_GLOBALCLASS

       我们在上一文中注册的窗口就是一个局部的窗口类,它的特点就是只能在注册的作用域内使用,由于它和全局窗口类只在注册的style和作用域上有分别,这里就不再详述,如要了解,请参照上一文。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn