Применение 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");
>}
Контроллер — нервная система отдельного экземпляра окна. Он создается с этим окном, хранится с ним и, в заключение, разрушается вместе с ним. Вы можете помещать любую информацию о состоянии, имеющую отношение к специфическому экземпляру окна в его контроллер. Вообще же, контроллер содержит "Вид", который имеет дело с рисованием на поверхности окна, и он имеет доступ к "Модели", которая является мозгом вашего приложения (все это называется 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;
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.