Чтение онлайн

на главную - закладки

Жанры

Применение Windows API

Легалов А. И.

Шрифт:

 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;

 Model _model;

 View _view;

};

Оконная процедура — основной коммутационный узел Windows приложения. Вы не вызываете ее из вашей программы — ее вызывает Windows! Каждый раз когда случается что-то интересное, Windows посылает вашей программе сообщение. Это сообщение передается оконной процедуре. Вы можете обработать его, или передать оконной процедуре, заданной по умолчанию.

Поделиться:
Популярные книги

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Я не бог. Книга XXXIV

Дрейк Сириус
34. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я не бог. Книга XXXIV

Охотник на демонов

Шелег Дмитрий Витальевич
2. Живой лёд
Фантастика:
боевая фантастика
5.83
рейтинг книги
Охотник на демонов

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес

Эпоха Опустошителя. Том IX

Павлов Вел
9. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том IX

Двойник короля 16

Скабер Артемий
16. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 16

Зодчий. Книга II

Погуляй Юрий Александрович
2. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга II

Горизонт Вечности

Вайс Александр
11. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Горизонт Вечности

Тринадцатый IX

NikL
9. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Тринадцатый IX

Романов. Том 1 и Том 2

Кощеев Владимир
1. Романов
Фантастика:
фэнтези
попаданцы
альтернативная история
5.25
рейтинг книги
Романов. Том 1 и Том 2

Газлайтер. Том 31

Володин Григорий Григорьевич
31. История Телепата
Фантастика:
боевая фантастика
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Газлайтер. Том 31

Хозяин Стужи 6

Петров Максим Николаевич
6. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 6

Иной. Том 5. Адская работа

Amazerak
5. Иной в голове
Фантастика:
боевая фантастика
городское фэнтези
технофэнтези
рпг
5.00
рейтинг книги
Иной. Том 5. Адская работа

Отморозок 3

Поповский Андрей Владимирович
3. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 3