Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Windows APIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 3

Автор А. Π›Π΅Π³Π°Π»ΠΎΠ²

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π½Π°Π±ΠΎΡ€ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ 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.