В каждой программе под Windows есть часть которая занимается регистрацией классов окна. В очередной раз вставляя этот, в большинстве случаев не требующий правки, код придумал небольшой класс:
- class WindowClassCreator
- {
- HINSTANCE mHInst;
- const TCHAR* mClassName;
- public:
- WindowClassCreator( HINSTANCE hinst, const TCHAR* class_name, WNDPROC window_proc ) : mHInst(hinst), mClassName(class_name)
- {
- WNDCLASSEX wcl = {0};
-
- wcl.cbSize = sizeof(wcl);
- wcl.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
- wcl.lpfnWndProc = window_proc;
- wcl.cbClsExtra = 0;
- wcl.cbWndExtra = 0;
- wcl.hInstance = hInst;
- wcl.hIcon = LoadIcon(0, IDI_APPLICATION);
- wcl.hCursor = LoadCursor(0, IDC_ARROW);
- wcl.hbrBackground = 0;
- wcl.lpszMenuName = 0;
- wcl.lpszClassName = class_name;
- wcl.hIconSm = 0;
-
- ::RegisterClassEx(&wcl);
- }
-
- ~WindowClassCreator()
- {
- ::UnregisterClass( mClassName, mHInst );
- }
- };
Если создать объект этого класса в глобальном пространстве, то есть приблизительно так:
- const TCHAR* WINDOW_CLASS_NAME = TEXT("ENGINE");
- static LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
- static WindowClassCreator window_class_creator( (HINSTANCE)GetModuleHandle(0), WINDOW_CLASS_NAME, WindowProc );
то функция регистрации вызовется автоматически до вызова функции WinMain, а удаление класса произойдет после завершения, без каких либо упоминаний в коде.
* Подсветка синтаксиса http://quickhighlighter.com
Ну, универсальность отсутствует - при любом розширении функционала данный хелпер розрастется в страшного монстра, и будет проще регистрировать по старинке.
ОтветитьУдалитья подумаю над этим...
ОтветитьУдалить