WinMaker
Класс WinMaker организован аналогично WinClass. Его конструктор устанавливает значения по умолчанию, которые могут быть переустановлены вызовом специфических методов. После завершения всех установок, Вы вызываете метод Create, чтобы создать окно, и метод Show, чтобы отобразить его. Обратите внимание, что в тот момент, когда Вы вызываете Create, ваша оконная процедура вызывается с сообщением WM_CREATE.
Верхнее окно создано с использованием класса TopWinMaker, который обеспечивает соответствующий стиль и заголовок.
>class WinMaker {
>public:
> WinMaker(WinClass& winClass);
> operator HWND() { return _hwnd; }
> void AddCaption(char const * caption) {
> _windowName = caption;
> }
> void AddSysMenu() { _style |= WS_SYSMENU; }
> void AddVScrollBar() { _style |= WS_VSCROLL; }
> void AddHScrollBar() { _style |= WS_HSCROLL; }
> void Create();
> void Show(int nCmdShow = SW_SHOWNORMAL);
>protected:
> WinClass& _class;
> HWND _hwnd;
> DWORD _exStyle; // extended window style
> char const* _windowName; // pointer to window name
> DWORD _style; // window style
> int _x; // horizontal position of window
> int _y; // vertical position of window
> int _width; // window width
> int _height; // window height
> HWND _hWndParent; // handle to parent or owner window
> HMENU _hMenu; // handle to menu, or child-window id
> void * _data; // pointer to window-creation data
>};
>WinMaker::WinMaker(WinClass& winclass) : _hwnd(0), _class(winClass), _exStyle(0), // extended window style
> _windowName (0), // pointer to window name
> _style(WS_OVERLAPPED), // window style
> _x(CW_USEDEFAULT), // horizontal position of window
> _y(0), // vertical position of window
> _width(CW_USEDEFAULT), // window width
> _height(0), // window height
> _hWndParent(0), // handle to parent or owner window
> _hMenu(0), // handle to menu, or child-window id
> _data(0) // pointer to window-creation data
>{ }
>void WinMaker::Create() {
> _hwnd = ::CreateWindowEx(_exStyle, _class.GetName(), _windowName, _style, _x, _y, _width, _height, _hWndParent, _hMenu, _class.GetInstance(), _data);
> if (_hwnd == 0) throw WinException ("Internal error: Window Creation Failed.");
>}
>void WinMaker::Show(int nCmdShow) {
> ::ShowWindow(_hwnd, nCmdShow);
> ::UpdateWindow(_hwnd);
>}
>// Makes top overlapped window with caption
>TopWinMaker::TopWinMaker((WinClass& winclass, char const* caption) : WinMaker(winClass) {
> _style = WS_OVERLAPPEDWINDOW | WS_VISIBLE;
> _windowName = caption;
>}
Классы общего назначения
Прежде, чем идти дальше, рассмотрим некоторые простые классы общего назначения. WinException — нечто, что мы хотим использовать для исключений во время сбоев Windows API. Он заботится о восстановлении кода ошибки Windows. (Между прочим, имеется простой способ преобразовать код ошибки в строку функцией API FormatMessage.)
Класс ResString просто инкапсулирует строку, хранимую в строковых ресурсах вашего приложения.
>// The exception class: stores the message and the error code class
>WinException {
>public:
> WinException(char* msg) : _err(::GetLastError()), _msg(msg) {}
> DWORD GetError() const { return _err; }
> char const* GetMessage() const { return _msg; }
>private:
> DWORD _err;
> char * _msg;
>};
>// The out-of-memory handler: throws exception
>int NewHandler(size_t size) {
> throw WinException( "Out of memory");
> return 0;
>}
>class ResString {
> enum { MAX_RESSTRING = 255 };
>public:
> ResString(HINSTANCE hInst, int resId);
> operator char const*() { return _buf; }
>private:
> char _buf[MAX_RESSTRING + 1];
>};
>ResString::ResString(hinstance hinst, int resid) {
> if (!::LoadString(hinst, resid, _buf, max_resstring + 1)) throw WinException ("Load String failed");
>}
Controller
Контроллер — нервная система отдельного экземпляра окна. Он создается с этим окном, хранится с ним и, в заключение, разрушается вместе с ним. Вы можете помещать любую информацию о состоянии, имеющую отношение к специфическому экземпляру окна в его контроллер. Вообще же, контроллер содержит "Вид", который имеет дело с рисованием на поверхности окна, и он имеет доступ к "Модели", которая является мозгом вашего приложения (все это называется MVC, или образцом "Модель-Вид-Контроллер" ("Model-View-Controller"), изобретенным Smalltalk-программистами.