Управляющие компоненты Windows
Рассмотрим несколько управляющих компонент Windows, облегчающих диалог с приложением. Первый компонент - это линейка прокрутки. Она может быть расположена в окне приложения и представляет собой вертикальную или горизонтальную полосу с ползунком. Ползунок можно передвинуть, зацепив его указателем мыши и перетащив вдоль полосы прокрутки. Линейка создается как объект класса TScrollBar в конструкторе окна приложения. Конструктору TScrollBar передаются координаты и размеры создаваемой линейки, а так же тип линейки - горизонтальная или вертикальная. Покажем, как использовать в приложении вертикальную линейку прокрутки. Во время перемещения ползунка вертикальная линейка генерирует уведомляющие сообщения WM_VSCROLL. Вы можете перехватить и обработать эти сообщения, объявив в классе-владельце такой линейки функцию отклика EvVScroll и дополнив таблицу отклика класса макросом EV_WM_VSCROLL. Функция будет вызываться при изменении положения ползунка на линейке. При создании линейки присвойте адрес сконструированного объекта указателю. В результате Вы получите доступ к разнообразному набору функций объекта. К примеру, появится возможность позиционировать ползунок из программы, получать позицию ползунка и изменять масштаб линейки (по умолчанию позиция ползунка на линейке изменяется от 0 до 100). Все сказанное выше справедливо и для горизонтальной линейки прокрутки, но для реакции на ее сообщения требуется функция EvHScroll и макрос EV_WM_HSCROLL. Теперь уделим внимание другому компоненту визуального интерфейса Windows - кнопке. Кнопка может быть расположена в окне приложения и представляет собой прямоугольник с надписью. Кнопка реагирует на щелчки мышью выдачей уведомляющего сообщения. Она создается в конструкторе окна приложения, как объект класса TButton.
Конструктору TButton передается адрес объекта-окна, в котором Вы хотите разместить кнопку, текст надписи на кнопке, ее координаты и размер. Конструктору также передается константный идентификатор кнопки. Данный идентификатор совпадает с идентификатором уведомляющего сообщения, генерируемого кнопкой при нажатии. Реакция на нажатия кнопки реализуется аналогично реакции на выбор команды меню: Вы описываете функцию реакции (имя функции произвольное) на нажатия кнопки и помещаете в таблицу реакции макрос EV_COMMAND(BUTTON_ID,UserName) с идентификатором кнопки и именем функции отклика. Приложение может иметь несколько кнопок с различными идентификаторами и для каждой кнопки нужно создать свою функцию отклика и добавить элемент в таблицу реакций. Если Вы хотите реагировать только на нажатия кнопки, никак не изменяя ее характеристик, то присваивать указателю адрес созданного объекта-кнопки не требуется.
Изменение размера выводимой графики с помощью линейки прокрутки
В нижеследующем приложении в прикладном окне выдается голубой прямоугольник с вписанным в него эллипсом. В окне создается вертикальная линейка прокрутки. Перемещая ползунок линейки, можно плавно изменять размеры выводимых геометрических фигур в некотором фиксированном диапазоне.
Исходный текст программы
#include <owl\applicat.h> #include <owl\framewin.h> #include <owl\dc.h> #include <owl\scrollba.h> class TMyWin: public TFrameWindow { public: TPoint pn,pk; TScrollBar *sb; TMyWin(): TFrameWindow(0,"The Paint function") { sb=new TScrollBar(this,1,350,100,20,125,FALSE); pn.x=100; pn.y=40; pk.x=300; pk.y=pn.y; } protected: void Paint(TDC&,BOOL,TRect&); void EvVScroll(UINT, UINT, HWND); DECLARE_RESPONSE_TABLE(TMyWin); };
DEFINE_RESPONSE_TABLE1(TMyWin,TFrameWindow) EV_WM_VSCROLL, END_RESPONSE_TABLE;
void TMyWin::Paint(TDC &dc,BOOL,TRect&) { TColor color(TColor::LtBlue); TPen pen1(color);
dc.SelectObject(pen1); dc.Rectangle(pn,pk); TPen pen2(TColor::LtGreen); dc.SelectObject(pen2); dc.Ellipse(pn,pk); } void TMyWin::EvVScroll(UINT scrollcode, UINT thumbPos, HWND hwnd) { TFrameWindow::EvVScroll(scrollcode,thumbPos,hwnd); InvalidateRect(TRect(pn,pk)); pk.y=pn.y+sb->GetPosition()*2; UpdateWindow(); } class TMyApp: public TApplication { public: TMyApp():TApplication() {} void InitMainWindow() { MainWindow=new TMyWin(); } };
int OwlMain(int, char *[]) { TMyApp app; return app.Run(); }
Пояснения к программе
Заголовочный файл owl\scrollba.h содержит описание класса TScrollBar и его членов-функций. Описание класса TMyWin содержит объявления точек (объектов класса TPoint) для левого верхнего и правого нижнего углов прямоугольника. В классе дополнительно объявлен объект класса TScrollBar, представляющий собой вертикальную линейку прокрутки. TMyWin содержит также функцию отклика EvVScroll на сообщения от линейки прокрутки и переопределенную функцию Paint. В теле конструктора TMyWin создается линейка прокрутки и задаются начальные значения координат двух углов прямоугольника. Описание таблицы реакций содержит элемент EV_WM_VSCROLL. Функция EvVScroll вызывает одноименную функцию базового класса для обеспечения полной обработки поступающих от скроллера сообщений. Затем функция требует перерисовать часть рабочей зоны окна для вывода геометрических фигур с измененными размерами. Для получения положения ползунка на линейке прокрутки используется функция GetPosition, которая возвращает число в диапазоне от 0 до 100. Вызов функции UpdateWindow вызывает немедленное обновление окна приложения, посылая окну WM_PAINT в обход системной очереди сообщений.
Задание
1) Создать исследовать работу приложения. 2) Изменить вертикальную линейку прокрутки на горизонтальную. 3) Исследовать работу приложения, закомментировав вызов UpdateWindow в теле EvVScroll. 4) Исследовать работу приложения, удалив вызов функции InvalidateRect. 5) Измените таблицу реакции, удалив в ней EV_WM_VSCROLL. Объясните поведение приложения.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|