Win32 SDK-Grundlagen (5) Eine kurze Einführung in die Fensterklasse

黄舟
Freigeben: 2017-06-06 09:42:55
Original
2562 Leute haben es durchsucht

1. Einführung

Im vorherigen Artikel haben wir ein Fenster von Grund auf erstellt. Ein sehr wichtiger Schritt besteht darin, die Fensterklasse zu registrieren, z. B. den folgenden 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;
}
Nach dem Login kopieren

Jedes Fenster unter Windows muss im System vorhanden sein, bevor es erstellt wird Wenn wir CreateWindowEx zum Erstellen eines Fensters verwenden, ist der Name des zweiten Parameters der Name der Fensterklasse. Dieser Name sollte innerhalb des für unseren Code sichtbaren Bereichs eindeutig sein. Dieser Artikel befasst sich hauptsächlich mit den Problemen von Fensterklassen unter Windows.

2. Fensterklassifizierung

Alle sichtbaren Elemente in Windows gehören grundsätzlich zu einem Fenster, unabhängig von seiner Form. Egal wie, es ist rund, quadratisch oder sogar unregelmäßig. Alle diese Fenster gehören zu einer bestimmten Fensterklasse. Im Allgemeinen werden Windows-Fensterklassen in drei Typen unterteilt:
(1) Systemfensterklasse
(2) Globale Fensterklasse
(3) Lokale Fensterklasse
Im Folgenden werde ich jeweils auf die Klassifizierung von Fensterklassen in Windows eingehen.

2.1 Systemfensterklasse

Eine -Schaltfläche und ein Bearbeitungsfeld, die wir alle haben Das Windows-Betriebssystem Die darin sichtbaren Steuerelemente sind eigentlich ein Fenster. Wenn wir das Betriebssystem installieren, registriert Windows eine große Anzahl von Fensterklassen auf Systemebene im Betriebssystem. Wenn wir entwickeln, können wir diese Fenster direkt basierend auf den Fensterklassennamen erstellen. Um dieses Problem zu erklären, führen wir den folgenden Code zusätzlich zum Code im vorherigen Artikel ein.

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;
}
Nach dem Login kopieren

CreateMain ist eine Funktion , die wir definiert haben, um ein Fenster zu erstellen. Es empfängt zwei Parameter: Der erste ist der registrierte Fensterklassenname und der zweite der Titel des Fensters. Im Gegensatz zum Code im vorherigen Artikel haben wir den Schritt der Registrierung eines benutzerdefinierten Fensters weggelassen. Stattdessen wird in der WinMain-Funktion CreateMain aufgerufen, um ein Fenster mit dem Fensterklassennamen „Button“ zu erstellen. Ich denke, Sie wissen bereits, was wir tun werden, oder? Ja, es soll eine Button-Schaltfläche generiert werden. Alle von uns häufig verwendeten Steuerelemente wurden vom Betriebssystem als Systemfensterklassen registriert und können direkt verwendet werden. Bitte sehen Sie sich die Ergebnisse des folgenden Programms an:



Sie können auch versuchen, eine Bearbeitung zu erstellen B. Dropdown-Boxen und andere Fenster auf Systemebene.

2.2 Globale Fensterklasse

Die globale Fensterklasse bezieht sich auf die Fensterklasse, die im globalen Bereich des verwendet werden kann Anmeldung nach Anmeldung. Beispielsweise können wir die globale Fensterklasse in der DLL registrieren, dann können alle Programme, die die DLL einführen, diese Klasse verwenden. Bei der Registrierung einer global verwendeten Fensterklasse müssen wir bei der Registrierung lediglich das CS_GLOBALCLASSAttribut zum Stilmitglied der Struktur von wec hinzufügen, wie folgt:

	wce.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
Nach dem Login kopieren

Um dieses Problem zu überprüfen, fügen wir ein neues DLL-Projekt hinzu und definieren dann eine Fensterregistrierungsfunktion RegisterWindow() wie folgt:

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;
}
Nach dem Login kopieren

Der Name der in RegisterWindow() registrierten Fensterklasse ist "DllMain", den wir in der Hauptfunktion von < aufrufen 🎜>dll Die Registrierungsfunktion schließt die Registrierung ab:

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	....
	RegisterWindow();
	return TRUE;
}
}
Nach dem Login kopieren
Verwenden Sie diese Fensterklasse, um ein Fenster in unserem Hauptprogramm zu erstellen:


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;
}
Nach dem Login kopieren

Führen Sie das Programm aus und Sie werden feststellen, dass wir dieses Fenster erfolgreich erstellt haben:



2.3 Lokale Fensterklasse

Per Definition ist dies bei der lokalen Fensterklasse nicht der Fall Fügen Sie CS_GLOBALCLASS zum Stil von wce hinzu. Die registrierten Fensterklassen sind alle Teilfensterklassen.

wce.style = CS_HREDRAW | CS_VREDRAW;//未添加CS_GLOBALCLASS
Nach dem Login kopieren

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

Das obige ist der detaillierte Inhalt vonWin32 SDK-Grundlagen (5) Eine kurze Einführung in die Fensterklasse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!