Ablakosztályok regisztrálása
Az ablakosztályokat egy ablakeljárás támogatja. Az alkalmazás regisztrálhat egy ablakosztályt RegisterClassA vagy RegisterClassWhasználatával. Az új alkalmazásoknak általában RegisterClassWkell használniuk.
Ha az alkalmazás RegisterClassAhasználatával regisztrálja az ablakosztályt, a függvény tájékoztatja az operációs rendszert, hogy a létrehozott osztály ablakai szöveges vagy karakterparaméterekkel rendelkező üzeneteket várnak egy Windows-kódlap karakterkészlet használatára. Az RegisterClassW használatával történő regisztráció lehetővé teszi az alkalmazás számára, hogy kérje meg az operációs rendszert, hogy adja át az üzenetek szöveges paramétereit Unicode. Az IsWindowUnicode függvény lehetővé teszi az alkalmazások számára az egyes ablakok természetének lekérdezését.
Az alábbi példa bemutatja, hogyan regisztrálhat windowsos kódlap-ablakosztályt és Unicode-ablakosztályt, és hogyan írhatja meg az ablakeljárásokat mindkét esetben. A példa alkalmazásában minden függvény és struktúra az adott "A" (ANSI) vagy "W" (széles, Unicode) adattípussal jelenik meg. A Általános adattípusok használatacímű cikkben ismertetett technikákat használva ezt a példát általános adattípusok használatára is megírhatja, hogy a windowsos kódlapok vagy a Unicode használatára fordítható legyen, attól függően, hogy a "UNICODE" definiálva van-e.
// Register a Windows code page window class.
WNDCLASSA AnsiWndCls;
AnsiWndCls.style = CS_DBLCLKS | CS_PARENTDC;
AnsiWndCls.lpfnWndProc = (WNDPROC)AnsiWndProc;
AnsiWndCls.cbClsExtra = 0;
AnsiWndCls.cbWndExtra = 0;
AnsiWndCls.hInstance = hInstance;
AnsiWndCls.hIcon = NULL;
AnsiWndCls.hCursor = LoadCursor(NULL, (LPTSTR)IDC_IBEAM);
AnsiWndCls.hbrBackground = NULL;
AnsiWndCls.lpszMenuName = NULL;
AnsiWndCls.lpszClassName = "TestAnsi";
RegisterClassA(&AnsiWndCls);
// Register a Unicode window class.
WNDCLASSW UnicodeWndCls;
UnicodeWndCls.style = CS_DBLCLKS | CS_PARENTDC;
UnicodeWndCls.lpfnWndProc = (WNDPROC)UniWndProc;
UnicodeWndCls.cbClsExtra = 0;
UnicodeWndCls.cbWndExtra = 0;
UnicodeWndCls.hInstance = hInstance;
UnicodeWndCls.hIcon = NULL;
UnicodeWndCls.hCursor = LoadCursor(NULL,(LPTSTR)IDC_IBEAM);
UnicodeWndCls.hbrBackground = NULL;
UnicodeWndCls.lpszMenuName = NULL;
UnicodeWndCls.lpszClassName = L"TestUnicode";
RegisterClassW(&UnicodeWndCls);
Az alábbi példa azt mutatja be, hogy mi a különbség az WM_CHAR üzenet kezelése között egy Windows-kódlap ablakának eljárásában és egy Unicode-ablak eljárásban.
// "ANSI" Window Procedure
LRESULT CALLBACK AnsiWndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
// Dispatch the messages that can be received.
switch (message)
{
case WM_CHAR:
// wParam - the value of the key
// lParam - (not used in this example)
if (lstrcmpA("Q", (LPCSTR) wParam))
{
// ...
}
else
{
// ...
}
break;
// Process other messages.
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Unicode Window Procedure
LRESULT CALLBACK UniWndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
// Dispatch the messages that can be received.
switch (message)
{
case WM_CHAR:
// wParam - the value of the key
// lParam - (not used in this example)
if (lstrcmpW(L"Q", (LPCWSTR) wParam))
{
// ...
}
else
{
// ...
}
break;
// Process other messages.
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Az AnsiWndProc által fogadott üzenetek összes szövege Windows-kódlapkarakterekből áll. Az UniWndProc által fogadott üzenetek összes szövege Unicode-karakterekből áll.
Kapcsolódó témakörök