
- •Часть IV
- •Глава 25
- •224 Глава 25
- •226 Глава 25
- •Глава 26
- •230 ____Глава 26
- •232 Глава 26
- •234 Глава 26
- •236 Глава 26
- •238 Глава 26
- •240 Глава 26
- •242 Глава 26
- •Глава 27
- •Virtual void InitMainWindow();//Замещаем функцию InitMainWindow
- •246 Глава 27
- •248 Глава 27
- •250 Глава 27
- •252 . Глава27
- •Глава 28 Диалоговые окна
- •256 Глава 28
- •258 Глава 28
- •260 Глава 28
- •262 Глава 28
- •264 Глава 28
- •266 Глава 28
- •268 Глава 28
- •Глава 29
- •270 Глава 29
- •272 Глава 29
- •274 Глава 29
- •276 Глава 29
- •278 Глава 29
- •280 Глава 29
- •282 Глава 29
276 Глава 29
Функции откликов активизируются при выполнении пользователем каких-либо манипуляций с элементами управления. В них вызовом OWL-функции GetPosition() для соответствующего элемента снимается текущее положение его ручки, функцией wspintf() формируется текущее содержимое надписи, и функцией TStatic::SetText() новая надпись выводится в дочернее окно, соответствующее статическому объекту. Для того, чтобы изменения отобразились на экране, вызывается функция Invalidate() для главного окна.
Помимо описанных действий, общих для обеих функций отклика, при входе в функцию UpdateFre-quency() выполняется отбраковка двух кодов нотификации - SB_THUMBTRACK и SB_ENDSCROLL. В результате отбрасываются сообщения от ползунка, возникающие, когда пользователь тащит его ручку, а также сообщения, поступающие при отпускании клавиши мыши. Игнорирование этих сообщений заметно уменьшает мелькание экрана, который перерисовывается только в моменты окончательного выбора нового положения ручки ползунка.
Декорированные окна
В библиотеке OWL предусмотрены средства для создания в окне приложения специальных приспособлений - панели, или линейки инструментов, инструментального планшета и линейки, или строки состояния (статусной строки). Окно с такого рода приспособлениями принадлежит классу TDecoratedWin-
dow и называется декорированным окном. Как видно из рис. 29.4, этот класс является производным как от класса окон с рамками TFrameWindow, так и от класса TLayoutWindow, обеспечивающего поведение окон, размеры и положение которых взаимозависимы. С помощью класса TLayoutWindow можно, например, создать дочернее окно, которое будет пропорционально изменять свои размеры при изменении размеров родительского окна, или располагаться всегда на определенном расстоянии от его границ; можно задать жесткую связь между правой границей одного дочернего окна и левой границей другого, что как бы "приклеивает" их друг к другу. В рассматриваемом далее примере эти возможности пригодятся для создания окна-клиента, совпадающего по размерам с главным окном приложения.
Класс TDecoratedFrame, включая в себя все возможности классов TFrameWindow и TLayoutWindow, добавляет к ним еще и средства размещения в окне разного рода приспособлений с заданными характеристиками поведения.
Сами приспособления выделены в библиотеке OWL в отдельную группу классов, являющихся производными от базового класса TGadget (рис. 29.5). В рассматриваемом далее примере будут использованы классы TButtonGadget и TSeparatorGadget.
Наконец, такие инструменты, как инструментальная линейка, инструментальный планшет или строка состояния образуются с помощью группы классов, производных от базового для них класса TGadget-Window (который сам выводится из класса TWindow, рис. 29.6). Мы приведем примеры использования
классов TToolBox, TMessageBar и TControlBar. Рассмотренный ниже пример 29-3 приложения с декорированным окном является переработкой примера 28-4, в котором в главное окно приложения выводилось графическое отображение некоторого массива данных, причем форму представления графика можно было изменять с помощью немодального диалогового окна. В примере 29-3. для изменения формы представления данных, а также цвета графика вместо диалога с кнопками настройки используется классический набор инструментов декорированного окна (рис. 29.7).
Окна
и их оформление ' 277
Описать класс главного окна (в примере 29-3 — MyWindow), который должен быть производным не от класса TFrameWindow, как обычно, а от класса TDecoratedWindow
Описать класс окна-клиента (в примере - MyClient), производный от базового оконного класса TWindow. Именно окно-клиент будет выступать в дальнейшем в качестве рабочего окна приложения, и именно для него следует описать таблицу откликов и функцию Paint()
Привязать окно-клиент к главному окну приложения, что выполняется путем включения в конст руктор главного окна указателя на окно-клиент
В программе конструктора главного (декорированного) окна предусмотреть заполнение его необ ходимыми приспособлениями
Побеспокоиться заранее о разработке файлов .bmp с рисунками для кнопок инструментального планшета и линейки инструментов и включить ссылки на них в файл ресурсов приложения. В файле ре сурсов должна также содержаться таблица строк (ресурс STRINGTABLE), выводимых в линейку состоя ния.
Рассмотрим теперь текст приложения 29-3.
//Приложение 29-3. Декорированные окна
//Файл 29-3.h
#define Dlg 100
#define CM_HELP 202
#define CM_EXIT 24310
#define CM_POINTS 101
#define CM_CURVE 102
#define CM_HISTO 103
#define CM_BLUE 104
#define CM_GREEN 105
#define FILESIZE 20
#define IDB_POINTS 301
#define IDB_CURVE 302
#define IDB_HISTO 303
#define IDB_HELP 304
#define 1DB_BLUE 305
#define IDB_GREEN 306
//Файл 29-3.rc #include "29-3.h" MainMenu MENU{ POPUP "Файл"{
MENUITEM "Справка",CM_HELP
MENUITEM SEPARATOR
MENUITEM "Выход",CM_EXIT
} POPUP "Вид"{
MENUITEM "Точки",CM_POINTS
MENUITEM "Огибающая",CM_CURVE
MENUITEM "Гистограмма", CM_HISTO
} }
Dlg DIALOG 82, 70, 116, 84
STYLE WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU CLASS "BorDlg"