Применение 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;
В практике разработки ПО зачастую встает задача динамической модификации программного кода в зависимости от текущих или настраиваемых значений параметров. Для решения этой задачи широко используются обратные вызовы. В языке C++ обратные вызовы реализуются различными способами, и далеко не всегда очевидно, какой из них лучший для конкретной ситуации. В книге рассмотрены теоретические и практические аспекты организации обратных вызовов, проанализированы достоинства и недостатки различных реализаций, выработаны рекомендации по выбору в зависимости от требований к проектируемому ПО.
Хватит тратить время на скучные академические фолианты! Изучение Computer Science может быть веселым и увлекательным занятием. Владстон Феррейра Фило знакомит нас с вычислительным мышлением, позволяющим решать любые сложные задачи. Научиться писать код просто — пара недель на курсах, и вы «программист», но чтобы стать профи, который будет востребован всегда и везде, нужны фундаментальные знания. Здесь вы найдете только самую важную информацию, которая необходима каждому разработчику и программисту каждый день. «Эта книга пригодится и для решения повседневных задач.
В учебно-методическом пособии рассматриваются основы языка программирования PL/SQL, реализованного в системе управления базами данных Oracle Database Server. Приводятся сведения о поддерживаемых типах данных, структуре программ PL/SQL и выполнении SQL-предложений в них. Отдельно рассмотрено создание хранимых в базах данных Oracle программ PL/SQL – процедур, функций, пакетов и триггеров.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Книга известного специалиста по программированию (Югославия), содержащая основы языка Пролог и его приложения для решения задач искусственного интеллекта. Изложение отличается методическими достоинствами — книга написана в хорошем стиле, живым языком. Книга дополняет имеющуюся на русском языке литературу по языку Пролог.Для программистов разной квалификации, специалистов по искусственному интеллекту, для всех изучающих программирование.
РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ ПРОЕКТА RSDN, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.