пятница, 10 сентября 2010 г.

Автоматическая регистрация классов

В каждой программе под Windows есть часть которая занимается регистрацией классов окна. В очередной раз вставляя этот, в большинстве случаев не требующий правки, код придумал небольшой класс:

  1. class WindowClassCreator
  2. {
  3.     HINSTANCE       mHInst;
  4.     const TCHAR*    mClassName;
  5. public:
  6.     WindowClassCreator( HINSTANCE hinst, const TCHAR* class_name, WNDPROC window_proc ) : mHInst(hinst), mClassName(class_name)
  7.     {
  8.         WNDCLASSEX wcl = {0};
  9.  
  10.         wcl.cbSize = sizeof(wcl);
  11.         wcl.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
  12.         wcl.lpfnWndProc = window_proc;
  13.         wcl.cbClsExtra = 0;
  14.         wcl.cbWndExtra = 0;
  15.         wcl.hInstance = hInst;
  16.         wcl.hIcon = LoadIcon(0, IDI_APPLICATION);
  17.         wcl.hCursor = LoadCursor(0, IDC_ARROW);
  18.         wcl.hbrBackground = 0;
  19.         wcl.lpszMenuName = 0;
  20.         wcl.lpszClassName = class_name;
  21.         wcl.hIconSm = 0;
  22.  
  23.         ::RegisterClassEx(&wcl);
  24.     }
  25.  
  26.     ~WindowClassCreator()
  27.     {
  28.         ::UnregisterClass( mClassName, mHInst );
  29.     }
  30. };

Если создать объект этого класса в глобальном пространстве, то есть приблизительно так:

  1. const TCHAR* WINDOW_CLASS_NAME = TEXT("ENGINE");
  2. static LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
  3. static WindowClassCreator window_class_creator( (HINSTANCE)GetModuleHandle(0), WINDOW_CLASS_NAME, WindowProc );

то функция регистрации вызовется автоматически до вызова функции WinMain, а удаление класса произойдет после завершения, без каких либо упоминаний в коде.

* Подсветка синтаксиса http://quickhighlighter.com