前回の記事では、ウィンドウを一から作成しました。最も重要な手順の 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 におけるウィンドウ クラスの問題について説明します。
Windows で表示されるすべての要素は、その形状に関係なく、基本的には、円形、正方形、または不規則であるかどうかに関係なく、ウィンドウに属します。これらすべてのウィンドウは、特定のウィンドウ クラスに属します。一般に、Windows ウィンドウ クラスは 3 つのタイプに分類されます: (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; }
編集ボックスやドロップダウンボックスなど、他のシステムレベルのウィンドウを作成してみることもできます。
グローバルウィンドウクラスとは、登録後にアプリケーションのグローバルスコープで使用できるウィンドウクラスを指します。たとえば、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 のスタイルに追加されておらず、登録されたウィンドウ クラスはローカル ウィンドウ クラスです。ウィンドウクラス。
我们在上一文中注册的窗口就是一个局部的窗口类,它的特点就是只能在注册的作用域内使用,由于它和全局窗口类只在注册的style和作用域上有分别,这里就不再详述,如要了解,请参照上一文。 以上がWin32 SDK の基本 (5) ウィンドウ クラスの簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。wce.style = CS_HREDRAW | CS_VREDRAW;//未添加CS_GLOBALCLASS