ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π½Π°Π±ΠΎΡ Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΡΡ Windows API
β’ Controller (ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ) β ΠΠΎΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΎΠΉ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ ΠΌΠΈΡΠΎΠΌ.
β’ View (ΠΠΈΠ΄) β ΠΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΠ΅Ρ Π²ΡΠ²ΠΎΠ΄ Windows ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
β’ Canvas (Π₯ΠΎΠ»ΡΡ) β ΠΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΡ ΡΡΡΡΠΎΠΉΡΡΠ² ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.
β’ Model (ΠΠΎΠ΄Π΅Π»Ρ) β Π Π°Π±ΠΎΡΠ½ΠΈΠΊ ΠΈ ΠΌΠΎΠ·Π³ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π΄Π΅Π»ΠΎ Ρ Windows.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΡΡΠΎ Win32 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° β ΠΎΠ½Π° ΠΌ.Π±. Π·Π°ΠΏΡΡΠ΅Π½Π° ΠΏΠΎΠ΄ Windows 95, 98, NT, 2000, Me.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: _set_new_handler β ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ° Microsoft. ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ, ΡΠΎ ΡΠΊΠΎΡΠ΅Π΅ ΡΠ΄Π°Π»ΠΈΡΠ΅ ΡΡΡ ΡΡΡΠΎΠΊΡ ΠΈΠ· ΠΊΠΎΠ΄Π°. Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ ΡΠ΅ΠΊΡΡΠ΅ΠΌΡ ΡΡΠ°Π½Π΄Π°ΡΡΡ C++, ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ new Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ (VC++ ΡΠ΅ΠΉΡΠ°Ρ ΡΠΎΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡ. Π.Π. ).
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π‘ΡΠ°ΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈ (ΠΡΡΠ΄ Π»ΠΈ ΠΊΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ°ΠΊΠΈΠ΅ ΡΡΠ°ΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ΄ Windows. Π.Π. ). Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Ρ ΡΠΈΠΏΠ° Win[Get/Set]Long ΠΏΡΡΠΌΡΠΌΠΈ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ Get/SetWindowLong. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΌΠ΅ΡΡΠΎ Π²ΡΠ·ΠΎΠ²Π°
Controller * pCtrl = WinGetLong<CONTROLLER *> (hwnd);
Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΏΠΈΡΠ°ΡΡ
Controller * pCtrl = reinterpret_cast<Controller *> (::GetWindowLong (hwnd, GWL_USERDATA));
ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΡΠ΅ΠΊΡΡΠΎΠ² Generic (11 ΠΊΠ±).
WinMainΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ WinMain, ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΊΠ»Π°ΡΡ ΠΎΠΊΠ½Π° ΠΈ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π― ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠΎΠ²Π°Π» ΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π²Π½ΡΡΡΠΈ Π΄Π²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ²: WinClass ΠΈ WinMaker. WinClass ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠΎΠ±ΡΠ°ΡΡ Π½Π°ΠΌ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ Π½Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠΎΠ³Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΡΠ»ΡΡΠ°Π΅ΡΡΡ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅, ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ Π²ΡΡ ΠΎΠ΄ΠΈΠΌ ΠΈΠ· Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π’Π°ΠΊ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΡΡΠΏΠ°ΡΡ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΡ Ρ ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ Π² ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, ΠΌΡ Π²Ρ ΠΎΠ΄ΠΈΠΌ Π² ΡΠΈΠΊΠ» ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π² ΡΡΠΎΡ ΡΠ°Π· ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ TranslateMessage ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Π½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠ½ΠΊΡΡ ΠΌΠ΅Π½Ρ, ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ Alt+key.
ΠΡΡΠ³ΠΈΠΌ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠΌ ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ ΠΌΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΠΈ Π΄Π»Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π°ΡΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ². ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠΈΡΠ»ΠΎΠ²ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ (ids). ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΈΡ Π΄Π°ΠΆΠ΅ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΡΡ API Π²ΡΠ·ΠΎΠ²Ρ ΡΠ°ΠΊΠΈΡ ΡΡΡΠΎΠΊ, ΠΊΠ°ΠΊ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ° ΠΎΠΊΠ½Π° ΠΈΠ»ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π°. ΠΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ Π² ΡΡΡΠΎΠΊΠΎΠ²ΡΡ ΡΠ΅ΡΡΡΡΠ°Ρ ΠΈ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΊ Π½ΠΈΠΌ ΡΠ΅ΡΠ΅Π· ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ (ids). ΠΠ°ΡΠ° ΡΡΠ΅Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π»Ρ Windows ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ ΠΈΠΌΠ΅Π΅Ρ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΡΠ΅ΡΡΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΠ°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈΠΊΠΎΠ½ΠΊΠΈ, ΠΌΠ΅Π½Ρ, ΡΡΡΠΎΠΊΠΎΠ²ΡΠ΅ ΡΠ΅ΡΡΡΡΡ ΠΈ Π½Π°Π·Π½Π°ΡΠ°ΡΡ ΠΈΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠΈΡΠ»ΠΎΠ²ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ. Π‘ΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° ΡΡΠΈΡ ids ΡΠΎΡ ΡΠ°Π½Π΅Π½Ρ Π² ΡΠ°ΠΉΠ»Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠ°ΠΊΠΈΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠΎΠΌ. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ Π½Π°Π·Π²Π°Π½ "resource.h".
ΠΠΎΠ½ΡΡΠ°Π½ΡΠ°, ID_MAIN, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (Π±ΠΎΠ»ΡΡΡΡ ΠΈ ΠΌΠ°Π»ΡΡ Π² ΡΠΎΠΌ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠΌ ΡΠ΅ΡΡΡΡΠ΅), Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΌΠ΅Π½Ρ, ΠΈ ΡΡΡΠΎΠΊΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°. ID_CAPTION ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΡΡΡΠΎΠΊΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΎΠΊΠ½Π°. Π’Π°ΠΊΠ°Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π°, Π½Π΅ Π³ΠΎΠ²ΠΎΡΡ ΡΠΆΠ΅ ΠΎ Π»Π΅Π³ΠΊΠΎΡΡΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, char* cmdParam, int cmdShow) {
_set_new_handler(&NewHandler);
// Using exceptions here helps debugging your program
// and protects from unexpected incidents.
try {
// Create top window class
TopWinClass topWinClass(ID_MAIN, hInst, MainWndProc);
// Is there a running instance of this program?
HWND hwndOther = topWinClass.GetRunningWindow ();
if (hwndOther != 0) {
::SetForegroundWindow(hwndOther);
if (::IsIconic(hwndOther)) ::ShowWindow(hwndOther, SW_RESTORE);
return 0;
}
topWinClass.Register();
// Create top window
ResString caption(hInst, ID_CAPTION);
TopWinMaker topWin(topWinClass, caption);
topWin.Create();
topWin.Show(cmdShow);
// The main message loop
MSG msg;
int status;
while ((status = ::GetMessage(&msg, 0, 0, 0)) != 0) {
if (status == β1) return β1;
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
return msg.wParam;
} catch(WinException e) {
char buf [50];
wsprintf(buf, "%s, Error %d", e.GetMessage(), e.GetError());
::MessageBox(0, buf, "Exception", MB_ICONEXCLAMATION | MB_OK);
}
catch (β¦) {
::MessageBox(0, "Unknown", "Exception", MB_ICONEXCLAMATION | MB_OK);
}
return 0;
}
WinClassΠΠ°Π²Π°ΠΉΡΠ΅, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ WinClass. ΠΠ½ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π² Windows ΡΡΡΡΠΊΡΡΡΡ WNDCLASSEX ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ Π²ΡΠ΅Ρ Π΅Π΅ ΠΏΠΎΠ»Π΅ΠΉ. ΠΡΠΎΡ ΠΊΠ»Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΈΠ· Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° WinSimpleClass, ΠΊΠΎΡΠΎΡΡΠΉ ΠΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ Π² Windows ΠΊΠ»Π°ΡΡΡ (ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΡΠΏΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠΎΠ², ΠΈ Ρ.Π΄.).
Π― ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ» ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅ΡΡΡΠΎΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, SetBgSysColor ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ Π·Π°Π΄Π°Π½Π½ΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ²Π΅Ρ Π·Π°Π΄Π½Π΅Π³ΠΎ ΡΠΎΠ½Π° ΠΎΠΊΠ½Π° ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΈΠ· ΠΏΡΠ΅Π΄ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΠ²Π΅ΡΠΎΠ² ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠ΅ΡΠΎΠ΄ SetResIcons Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΈΠ· ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΡΠΈΡ ΠΊ ΠΎΠΊΠΎΠ½Π½ΠΎΠΌΡ ΠΊΠ»Π°ΡΡΡ. ΠΡΠΈ ΠΈΠΊΠΎΠ½ΠΊΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΡΠ²ΡΡΡΡ Π² Π²Π΅ΡΡ Π½Π΅ΠΌ Π»Π΅Π²ΠΎΠΌ ΡΠ³Π»Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΈ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π·Π°Π΄Π°Ρ Windows.
TopWinClass Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡ WinClass ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄. ΠΠ½ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄ΡΠ΅ΠΏΠ»ΡΠ΅Ρ ΠΌΠ΅Π½Ρ Π² Π²Π΅ΡΡΠΈΠ½Π΅ ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°.
class WinSimpleClass {
public:
WinSimpleClass(char const * name, HINSTANCE hInst) : _name (name), _hInstance (hInst) {}
WinSimpleClass (int resId, HINSTANCE hInst);
char const* GetName() const { return _name.c_str (); }
HINSTANCE GetInstance() const { return _hInstance; }
HWND GetRunningWindow();
protected:
HINSTANCE _hInstance;
std::string _name;
};
WinSimpleClass::WinSimpleClass(int resid, hinstance hinst) : _hInstance (hInst) {
ResString resStr (hInst, resId);
_name = resStr;
}
HWND WinSimpleClass::GetRunningWindow () {
HWND hwnd = ::FindWindow(getname(), 0);
if (::IsWindow(hwnd)) {
HWND hwndPopup = ::GetLastActivePopup(hwnd);
if (::IsWindow(hwndpopup)) hwnd = hwndPopup;
} else hwnd = 0;
return hwnd;
}
class WinClass: public WinSimpleClass {
public:
WinClass(char const* className, HINSTANCE hInst, WNDPROC wndProc);
WinClass(int resId, HINSTANCE hInst, WNDPROC wndProc);
void SetBgSysColor (int sysColor) {
_class.hbrBackground = reinterpret_cast<HBRUSH> (sysColor + 1);
}
void SetResIcons(int resId);
void Register();
protected:
void SetDefaults();
WNDCLASSEX _class;
};
WinClass::WinClass(char const * classname, HINSTANCE hInst, WNDPROC wndProc) : WinSimpleClass (className, hInst) {
_class.lpfnWndProc = wndProc;
SetDefaults();
}
WinClass::WinClass(int resid, hinstance hinst, wndproc wndproc) : WinSimpleClass (resId, hInst) {
_class.lpfnWndProc = wndProc;
SetDefaults();
}
void WinClass::SetDefaults () {
// Provide reasonable default values
_class.cbSize = sizeof (WNDCLASSEX);
_class.style = 0;
_class.lpszClassName = GetName();
_class.hInstance = GetInstance();
_class.hIcon = 0;
_class.hIconSm = 0;
_class.lpszMenuName = 0;
_class.cbClsExtra = 0;
_class.cbWndExtra = 0;
_class.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1);
_class.hCursor = ::LoadCursor(0, IDC_ARROW);
}
void WinClass::SetResIcons (int resid) {
_class.hIcon = reinterpret_cast<HICON>(::LoadImage(_class.hInstance, MAKEINTRESOURCE(resId), IMAGE_ICON, ::GetSystemMetrics(sm_cxicon), ::GetSystemMetrics(sm_cyicon), 0));
// Small icon can be loaded from the same resource
_class.hIconSm = reinterpret_cast<HICON>(::LoadImage(_class.hInstance, MAKEINTRESOURCE(resId), IMAGE_ICON, :: GetSystemMetrics(sm_cxsmicon), ::GetSystemMetrics(sm_cysmicon), 0));
}
void WinClass::Register () {
if (::RegisterClassEx(&_class) == 0) throw WinException("Internal error: RegisterClassEx failed.");
}
class TopWinClass: public WinClass {
public:
TopWinClass(int resId, HINSTANCE hInst, WNDPROC wndProc);
};
TopWinClass::TopWinClass(int resid, HINSTANCE hInst, WNDPROC wndProc) : WinClass (resId, hInst, wndProc) {
SetResIcons(resId);
_class.lpszMenuName = MAKEINTRESOURCE(resId);
}
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΊΠΎΠ½Π½ΡΠΉ ΠΊΠ»Π°ΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ, ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΊΠΎΠ½ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠΆΠ΅Π»Π°Π΅ΡΠ΅. ΠΠ½ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΡ ΠΆΠ΅ ΡΠ°ΠΌΡΡ ΠΎΠΊΠΎΠ½Π½ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ»Π° Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π° ΠΊΠ»Π°ΡΡΠΎΠΌ. ΠΠ°ΠΊ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π΄Π°Π»ΡΡΠ΅, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ°Π·Π½ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΎΠΊΠ½Π° Π²Π½ΡΡΡΠΈ ΡΡΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ.
WinMakerΠΠ»Π°ΡΡ WinMaker ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ WinClass. ΠΠ³ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ². ΠΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ, ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ Create, ΡΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠΊΠ½ΠΎ, ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Show, ΡΡΠΎΠ±Ρ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ Π΅Π³ΠΎ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π² ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΊΠΎΠ³Π΄Π° ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΠ΅ Create, Π²Π°ΡΠ° ΠΎΠΊΠΎΠ½Π½Π°Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ WM_CREATE.