Применение Windows API - [6]

Шрифт
Интервал

Класс 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-программистами.

Если, как это часто бывает, ваше приложение имеет только одно окно верхнего уровня, Вы можете непосредственно включать модель в ее контроллер. Это упрощает управление ресурсами, но ценой усиления связи контроллера с моделью. В больших проектах нужно избегать таких связей. Предпочтительнее использовать внутри контроллера "интеллектуальный" указатель на модель.

Большинство методов контроллера требует дескриптора окна, с которым они взаимодействуют. Этот дескриптор передается с каждым сообщением Windows, но проще сохранить его один раз внутри контроллера и использовать всякий раз, когда он необходим. Помните — имеется взаимно однозначное соответствие между контроллерами и экземплярами окон (а следовательно, и их дескрипторами).

>class Controller {

>public:

> Controller(HWND hwnd, CREATESTRUCT * pCreate);

> ~Controller();

> void Size(int x, int y);

> void Paint();

> void Command(int cmd);

>private:

> HWND _hwnd;


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.