Программирование на Borland С++Рефераты >> Программирование и компьютеры >> Программирование на Borland С++
В программах, написанных с применением OWL, механизм получения информации о произошедших в системе событиях скрыт от программиста и обеспечивается функциями класса TApplication. Программисту требуется только описать свои функции, которые будут автоматически вызываться в ответ на пришедшее в программу сообщение.
Для того, чтобы создать класс, функции которого будут откликаться на пришедшие из системы сообщения, необходимо:
1) Определить таблицу отклика для класса. Для этого в определение класса вставляется строка
DECLARE_RESPONSE_TABLE(<имя класса>);
<имя класса> заменяется на имя того класса, для которого определяется таблица отклика. DECLARE_RESPONSE_TABLE - это макрос OWL, который вводит в Ваш класс некоторые дополнительные элементы, позволяющие системе автоматически вызывать функции-члены класса в ответ на пришедшее сообщение. Таблица отклика содержит имена сообщений Windows и адреса функций, вызываемых при получении соответствующих сообщений.
2) После объявления класса в текст программы вставляется другой макрос
DEFINE_RESPONSE_TABLEn(<имя класса>[,класс][,класс] .);
<имя класса> - все то же имя класса, для которого Вы строите таблицу отклика. Через запятую Вы должны перечислить имена базовых классов, от которых производится наследование. Число n следует заменить на число базовых классов, которые тоже содержат таблицы отклика.
Сразу же за текстом макроса необходимо поместить элементы таблицы реакции, разделенные запятыми. Так, если Вы хотите обрабатывать сообщения о нажатиях правой и левой клавиш мыши в окне Вашего приложения, то в таблицу помещаются следующие элементы:
EV_WM_LBUTTONDOWN,
EV_WM_RBUTTONDOWN,
которые говорят OWL о том, что Вы хотите обрабатывать сообщения о нажатиях левой и правой клавиш соответственно. Скажем EV_WM_LBUTTONDOWN расшифровывается, как Event (событие), Windows Message: Left Button Down.
После описания всех элементов таблицы реакции запишите строку END_RESPONSE_TABLE;
3) Определите в Вашем классе функции, которые будут получать управление, если в системе произойдет желаемое событие. В нашем примере - это две функции
void EvLButtonDown(UINT,TPoint&),
void EvRButtonDown(UINT,TPoint&)
Первый аргумент определяет клавиши-модификаторы, которые были нажаты на клавиатуре одновременно с нажатием одной из кнопок мыши. Второй аргумент определяет координаты точки окна, в которой было произведено нажатие. В тело этих функций можно вставить код, реализующий некоторые действия при получении соответствующих сообщений Windows.
При написании функций отклика необходимо помнить следующее:
1) Функция отклика вызывается OWL автоматически и только тогда, когда произойдет заданное событие. К примеру, функция EvLButtonDown вызывается только тогда, когда пользователь нажмет левую кнопку мыши внутри окна приложения.
2) В приложении может быть несколько классов, имеющих свои таблицы реакции. Класс реагирует только на предназначенные для него сообщения системы.
3) Имена и параметры функций, отвечающих на системные сообщения, предопределены. Это означает, что на каждое сообщение отвечает строго определенная функция с определенным именем. То есть, если Вы хотите обрабатывать нажатия левой кнопки мыши, то в классе необходимо определить функцию с именем EvLButtonDown.
4.1. Отклик на нажатие левой и правой клавиш мыши
Нижеследующее Windows-приложение создает прикладное окно и ожидает нажатия правой или левой кнопки мыши. При нажатии любой из этих клавиш внутри окна появляется панель сообщения, указывающая, какая клавиша была нажата. После нажатия на кнопку OK панель исчезает, а приложение будет ждать нового нажатия на клавиши мыши.
4.1.1 Исходнный текст приложения.
#include <owl\applicat.h>
#include <owl\framewin.h>
class TMyWindow : public TFrameWindow
{
public:
TMyWindow(char *title):TFrameWindow(0,title)
{}
protected:
void EvLButtonDown(UINT,TPoint&);
void EvRButtonDown(UINT,TPoint&);
DECLARE_RESPONSE_TABLE(TMyWindow);
};
DEFINE_RESPONSE_TABLE1(TMyWindow,TFrameWindow)
EV_WM_LBUTTONDOWN,
EV_WM_RBUTTONDOWN,
END_RESPONSE_TABLE;
void TMyWindow::EvLButtonDown(UINT,TPoint&)
{
MessageBox("You have pressed the LEFT mouse button","Message dispatched",MB_OK | MB_ICONINFORMATION);
}
void TMyWindow::EvRButtonDown(UINT,TPoint&)
{
MessageBox("You have pressed the RIGHT mouse button","Message dispatched",MB_OK|MB_ICONINFORMATION);
}
class TMyApp : public TApplication
{
public:
TMyApp():TApplication()
{}
void InitMainWindow()
{
EnableCtl3d();
MainWindow=new TMyWindow("Click Me!!!!!");
}
};
int OwlMain(int, char *[])
{
TMyApp app;
return app.Run();
}
4.1.2. Пояснения к программе
Класс TMyWin описывает прикладное окно, как главное окно приложения и поэтому порождается от класса TFrameWindow.
Кроме описания конструктора класс содержит объявления стандартных функций отклика EvLButtonDown и EvRButtonDown, а так же объявление таблицы отклика для класса.
Вслед за описанием класса располагается описание таблицы отклика на сообщения от левой и правой клавиш мыши.
Функции отклика описаны вне класса. Тело каждой из этих функций содержит единственный вызов функции MessageBox, которую TMyWin наследует от TFrameWindow. Аргументы функции MessageBox задают текст сообщения, заголовок панели и стиль окна сообщения. Стили MB_OK и MB_ICONINFORMATION дают нам диалоговую панель с кнопкой OK и пиктограммой “Information”:
Тело функции TMyApp::InitMainWindow содержит вызов функции EnableCtl3d(), которая разрешает приложению использовать трехмерные диалоги. Вы можете закомментировать вызов этой функции и сравнить полученные результаты.
4.1.3. Задание
1) Создать и выполнить приложение. Поэкспериментировать с приложением, нажимая кнопки мыши в его окне.
2) Измените аргументы в вызовах функции MessageBox. Убедитесь в изменении внешнего вида панели сообщения.
3) Закомментируйте строку EV_VM_RBUTTONDOWN в таблице элементов отклика. Объясните изменившееся поведение приложения.
4.1.4. Немного английского
a button - кнопка
down - вниз
left - влево, левый
right - правый
an event - событие
a message - сообщение
a response - ответ
a table - таблица
to declare - объявить
to define - описать
a box - блок, панель
5. Вывод графики в Windows
Вывод текстовой или графической информации в Windows связан с контекстом устройства DC. Рабочая зона окна связывается с контекстом устройства TClientDC. Перед выводом информации мы должны создать контекст устройства, передав ему идентификатор окна и выбрать в нем набор необходимых графических объектов, таких как перо (TPen), кисть(TBrush) и т. д. Необходимо также позаботиться о цвете выводимых объектов. Созданный контекст позволяет нам рисовать только внутри рабочей области окна, не затрагивая при этом ни другие окна, ни границы самого окна. Наличие в системе такого класса, как TDC, делает доступными более 150 функций, связанных с выводом оконной графики. Эти функции позволяют использовать различные объекты-инструменты (перо, кисть, шрифт и т. д.), выводить текст и рисовать различные фигуры.