Применение Windows API - [10]
> delete control;
> DestroyWindow(hwnd);
> return TRUE;
> }
> return FALSE;
>}
Давайте, взглянем на «Контроллер». Обратите внимание, что каждый элемент управления на поверхности диалогового окна имеет соответствующий (внедренный) объект управления внутри «Контроллера». Имеются редакторы, селективные списки, радиокнопки и линейки прокрутки. Встречается специальный элемент управления «metafile», который рисует шкалу частот и два объекта отображения, соответствующие двум статическим подокнам, в которые мы рисуем графики. И, наконец, мы имеем объект Painter, который является ответственным за асинхронную перерисовку каждого из двух подокон.
>class Controller {
>public:
> Controller(HWND hwnd);
> ~Controller();
> void Command(HWND hwnd, int id, int code);
> void Scroll(HWND hwnd, int cmd, int pos);
> void Paint(HWND hwnd);
> void ReInit(HWND hwnd);
> void Stop(HWND hwnd);
>private:
> void InitScrollPositions();
> void PaintScale();
> BOOL _isStopped;
> int _bitsPerSample;
> int _samplesPerSecond;
> int _fftPoints;
> int _samplesPerBuf;
> EditReadOnly _edit;
> Combo _comboFreq;
> Combo _comboPoints;
> RadioButton _radio8;
> RadioButton _radio16;
> ScrollBarMap _scroll;
> StaticEnhMetafileControl _scaleFreq;
> ViewWave _viewWave;
> ViewFreq _viewFreq;
> Painter _display;
>};
Конструктор «Контроллера» заботится об инициализации всех элементов управления, передавая им дескриптор диалогового окна и соответствующие идентификаторы. Как косметическую добавку, мы присоединяем нашу собственную иконку к диалогу. В противном случае система использовала бы стандартную иконку Windows.
>Controller::Controller(HWND hwnd) :_isStopped(TRUE), _bitsPerSample(16), _samplesPerSecond(SAMPLES_SEC), _fftPoints(FFT_POINTS * 4), _samplesPerBuf(FFT_POINTS * 2), _radio8(hwnd, IDC_8_BITS), _radio16(hwnd, IDC_16_BITS), _scroll(hwnd, IDC_SCROLLBAR), _edit(hwnd, IDC_EDIT), _comboFreq(hwnd, IDC_SAMPLING), _comboPoints(hwnd, IDC_POINTS), _viewWave(hwnd, IDS_WAVE_PANE, FFT_POINTS * 8), _viewFreq(hwnd, IDS_FREQ_PANE), _scaleFreq(hwnd, IDC_FREQ_SCALE), _display(hwnd, _viewWave, _viewFreq, _samplesPerBuf, _samplesPerSecond, _fftPoints) {
> // Attach icon to main dialog
> HICON hIcon = LoadIcon(TheInstance, MAKEINTRESOURCE(ICO_FFT));
> SendMessage(hwnd, WM_SETICON, WPARAM(ICON_SMALL), LPARAM(hIcon));
> // Other initializations…
>}
Использование диалогового окна в качестве главного — очень удобная и простая техника, особенно для приложений, которые используют панелеподобный интерфейс. Между прочим, приложение "Морской бой" (см. домашнюю страницу) использует тот же самый прием.
Использование фабрики классов для окон диалога
Перевод А. И. Легалова
Англоязычный оригинал находится на сервере компании Reliable Software
Отсюда можно загрузить программу, демонстрирующую окно диалога (zip архив 14 кб)
Диалоговое окно для Windows программы является тем же, чем является вызов функции для программы на языке C. Сначала, Windows программы передают некоторые данные диалоговому окну, чтобы инициализировать его. Затем диалоговое окно обменивается информацией с пользователем. Когда пользователь решает, что любопытство программы было удовлетворено, он (или она) нажимает кнопку OK. Вновь полученные данные возвращаются обратно программе.
Диалоговое окно обычно взаимодействует со всеми видами элементов управления (виджетами, устройствами, гизмозами — называйте их как хотите). Код диалогового окна взаимодействует с этими элементами, посылая и получая сообщения через свою «Процедуру диалога». В реализациях различных диалоговых окон имеется много общего кода. Нам хотелось бы написать и отладить этот код только один раз, а затем многократно использовать его.
Что изменяется от диалога к диалогу:
• Разновидность данных, которые передаются в диалог и возвращаются из него.
• Разновидность элементов внутри диалогового окна.
• Взаимодействие между элементами.
Эта изменчивость может быть инкапсулирована в двух специальных клиентских классах: классе списка параметров и классе контроллера диалога.
Класс списка параметров инкапсулирует внутри себя параметры. Он обеспечивает доступ для их восстановления и изменения. Определение и реализация этого класса находятся под полным контролем клиента (программиста, многократно использующего наш код).
Класс контроллера диалога содержит объекты управления для всех элементов диалога и осуществляет взаимодействия между ними. Клиент, как предполагается, получает этот класс от абстрактного класса DlgController и реализует все его чистые виртуальные методы.
Остальное — только клей. Нам необходимо параметризировать шаблон класса CtrlFactory, который используется нашей обобщенной реализацией класса ModalDialog. Фабрика контроллера создает соответствующий, определенный клиентом, контроллер и возвращает полиморфный указатель на него. Рис. 1 показывает связи между различными классами, включаемыми в реализацию диалогового окна.
Рис. 1. Классы, включаемые в образец проектирования "Диалоговое окно".
Давайте, начнем с клиентского кода. В нашей обобщенной программе мы нуждаемся в диалоговом окне, которое позволяет пользователю редактировать строку. Используя редактор ресурса, мы создаем шаблон диалога, который содержит средства редактирования и две кнопки, OK и CANCEL. Идентификатор ресурса (id) этого диалога – IDD_EDITDIALOG. Затем мы определяем наш собственный класс списка параметров по имени EditorData и специальный класс контроллера по имени EditorCtrl. Когда пользователь выбирает пункт меню Edit, будет выполняться следующий код:
В практике разработки ПО зачастую встает задача динамической модификации программного кода в зависимости от текущих или настраиваемых значений параметров. Для решения этой задачи широко используются обратные вызовы. В языке C++ обратные вызовы реализуются различными способами, и далеко не всегда очевидно, какой из них лучший для конкретной ситуации. В книге рассмотрены теоретические и практические аспекты организации обратных вызовов, проанализированы достоинства и недостатки различных реализаций, выработаны рекомендации по выбору в зависимости от требований к проектируемому ПО.
Хватит тратить время на скучные академические фолианты! Изучение Computer Science может быть веселым и увлекательным занятием. Владстон Феррейра Фило знакомит нас с вычислительным мышлением, позволяющим решать любые сложные задачи. Научиться писать код просто — пара недель на курсах, и вы «программист», но чтобы стать профи, который будет востребован всегда и везде, нужны фундаментальные знания. Здесь вы найдете только самую важную информацию, которая необходима каждому разработчику и программисту каждый день. «Эта книга пригодится и для решения повседневных задач.
В учебно-методическом пособии рассматриваются основы языка программирования PL/SQL, реализованного в системе управления базами данных Oracle Database Server. Приводятся сведения о поддерживаемых типах данных, структуре программ PL/SQL и выполнении SQL-предложений в них. Отдельно рассмотрено создание хранимых в базах данных Oracle программ PL/SQL – процедур, функций, пакетов и триггеров.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Книга известного специалиста по программированию (Югославия), содержащая основы языка Пролог и его приложения для решения задач искусственного интеллекта. Изложение отличается методическими достоинствами — книга написана в хорошем стиле, живым языком. Книга дополняет имеющуюся на русском языке литературу по языку Пролог.Для программистов разной квалификации, специалистов по искусственному интеллекту, для всех изучающих программирование.
РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ ПРОЕКТА RSDN, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.