Применение 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;


Рекомендуем почитать
Язык PL/SQL

В учебно-методическом пособии рассматриваются основы языка программирования PL/SQL, реализованного в системе управления базами данных Oracle Database Server. Приводятся сведения о поддерживаемых типах данных, структуре программ PL/SQL и выполнении SQL-предложений в них. Отдельно рассмотрено создание хранимых в базах данных Oracle программ PL/SQL – процедур, функций, пакетов и триггеров.


Пишем драйвер Windows на ассемблере

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


Язык программирования С# 2005 и платформа .NET 2.0.

В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML.


Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса

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


Информационная технология. Руководство по управлению документированием программного обеспечения

ГОСУДАРСТВЕННЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИИнформационная технологияРУКОВОДСТВО ПО УПРАВЛЕНИЮ ДОКУМЕНТИРОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯInformation technology. Guidelines for the management of software documentationИздание официальноеДата введения 1994-07-01ГОССТАНДАРТ РОССИИ Москва© Издательство стандартов, 1994.


Самоучитель UML

Самоучитель UMLПервое издание.В книге рассматриваются основы UML – унифицированного языка моделирования для описания, визуализации и документирования объектно-ориентированных систем и бизнес-процессов в ходе разработки программных приложений. Подробно описываются базовые понятия UML, необходимые для построения объектно-ориентированной модели системы с использованием графической нотации. Изложение сопровождается примерами разработки отдельных диаграмм, которые необходимы для представления информационной модели системы.