ホームページ  >  記事  >  運用・保守  >  Win32 SDK の基本 (5) ウィンドウ クラスの簡単な紹介

Win32 SDK の基本 (5) ウィンドウ クラスの簡単な紹介

黄舟
黄舟オリジナル
2017-06-06 09:42:552519ブラウズ

1. はじめに

前回の記事では、ウィンドウを一から作成しました。最も重要な手順の 1 つは、次のコードに示すように、ウィンドウ クラスを登録することです。

//注册窗口类
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 を使用します。作成時の 2 番目のパラメーターの名前はウィンドウ クラス名であり、コードから見える範囲内で一意である必要があります。この記事では主に Windows におけるウィンドウ クラスの問題について説明します。

2. ウィンドウの分類

Windows で表示されるすべての要素は、その形状に関係なく、基本的には、円形、正方形、または不規則であるかどうかに関係なく、ウィンドウに属します。これらすべてのウィンドウは、特定のウィンドウ クラスに属します。一般に、Windows ウィンドウ クラスは 3 つのタイプに分類されます: (1) システム ウィンドウ クラス
(2) グローバル ウィンドウ クラス
(3) ローカル ウィンドウ クラス
以下に分類します。 Windows のウィンドウ クラスについては、別途説明します。

2.1 システムウィンドウクラス

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 は、ウィンドウを作成するために定義した 関数 です。これは 2 つのパラメータを受け取ります。1 つ目は登録されたウィンドウ クラス名で、2 つ目はウィンドウのタイトルです。前回の記事のコードとは異なり、カスタム ウィンドウを登録する手順は省略しています。代わりに、WinMain 関数で CreateMain が呼び出され、ウィンドウ クラス名「Button」を持つウィンドウが作成されます。私たちが何をしようとしているかはすでにわかっていると思いますね?はい、Button ボタンを生成するためです。私たちがよく使うコントロールはすべてオペレーティング システムによってシステム ウィンドウ クラスとして登録されており、それらを直接使用できます。以下のプログラムの結果をご覧ください:


編集ボックスやドロップダウンボックスなど、他のシステムレベルのウィンドウを作成してみることもできます。

2.2 グローバルウィンドウクラス

グローバルウィンドウクラスとは、登録後にアプリケーションのグローバルスコープで使用できるウィンドウクラスを指します。たとえば、dll にグローバル ウィンドウ クラスを登録すると、dll を導入するすべてのプログラムでこのクラスを使用できるようになります。グローバルに使用されるウィンドウ クラスを登録する場合、次のように、登録時に wec の structural のスタイル メンバーに CS_GLOBALCLASSattribute を追加するだけで済みます。新しい DLL プロジェクトを追加し、次のようにウィンドウ登録関数 RegisterWindow() を定義します。

	wce.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;

RegisterWindow() に登録されたウィンドウ クラスの名前は "DllMain"

で、
dll のメイン関数 登録関数によって登録が完了します:

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;
}
このウィンドウ クラスを使用して、メイン プログラムにウィンドウを作成します:
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	....
	RegisterWindow();
	return TRUE;
}
}

プログラムを実行すると、次のことがわかります。このウィンドウも正常に生成されました:


2.3 ローカル ウィンドウ クラス

ローカル ウィンドウ クラスは定義の観点から定義されており、すべての cs_globalclasss は WCE のスタイルに追加されておらず、登録されたウィンドウ クラスはローカル ウィンドウ クラスです。ウィンドウクラス。

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

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

以上がWin32 SDK の基本 (5) ウィンドウ クラスの簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。