3.1.1. Исходный текст программы

#include <owl\applicat.h>

#include <owl\framewin.h>

class TMyApp: public TApplication

 {

 public:

 TMyApp():TApplication("Hello Windows !"){};

 void InitMainWindow()

 {

MainWindow=new TFrameWindow(0,"Hello, hello!!");

}

 };

 int OwlMain(int, char* [])

 {

 return TMyApp().Run();

 }

3.1.2. Пояснения к программе

Включаемый заголовочный файл owl\framewin.h содержит описание класса TFrameWindow (см. раздел 10.3.).

Поскольку в данном варианте приложения мы хотим создать свое собственное главное окно в обход стандартных методов класса TApplication, мы должны переопределить виртуальную функцию InitMainWindow класса TApplication. Для этого мы выводим новый, уже наш, класс TMyApp, как производный от класса TApplication и описываем в нем виртуальную функцию InitMainWindow.

Тело конструктора TMyApp пустое, т.е. {}. Работа этого конструктора сводится только к вызову конструктора базового класса TApplication, содержащего единственный параметр - текст заголовка главного окна приложения (см. раздел 10.2.2).

Тело функции InitMainWindow класса TMyApp содержит оператор new, который совместно с конструктором TFrameWindow создает экземпляр объекта-окна с новым заголовком “Hello, Hello !”. Адрес объекта присваивается переменной MainWindow (см. раздел 10.2.1.), унаследованной от TApplication.

3.1.3. Задание

1) Создать и выполнить приложение. Обратите внимание! Вместо заголовка “Hello, Windows !”, заданного конструктором TMyApp, окно имеет заголовок “Hello, Hello !”. Это результат работы переопределенной виртуальной функции TMyApp::InitMainWindow, которая была вызвана после конструктора и изменила текст заголовка на “Hello, Hello !”.

2) Измените тексты заголовков, используемые конструкторами TMyApp и TFrameWindow.

3) Измените статус доступа к членам класса TMyApp на protected или private. Убедитесь, что появятся сообщения об ошибках компиляции, так как в функции OwlMain производится обращение к теперь уже недоступному конструктору TMyApp.

4) Опишите конструктор TMyApp вне класса, не забыв добавить при его описании оператор привязки к классу TMyApp. Убедитесь в работоспособности приложения.

5) Опишите член-функцию InitMainWindow вне класса. Проверьте работоспособность приложения.

3.2. Изменение положения главного окна на экране

Класс TFrameWindow наследует из класса TWindow (см. раздел 10.4.) член-данное Attr( см. раздел 10.4.1.). Attr - это структура, содержащая различные атрибуты окна, такие как стиль окна, позиция на экране, размер и т.д.

3.2.1. Варианты функции InitMainWindow, использующие Attr

Вариант A:

 void InitMainWindow()

 {

MainWindow=new TFrameWindow(0," Hello, hello!!");

MainWindow->Attr.X=5;

MainWindow->Attr.Y=15;

MainWindow->Attr.W=200;

MainWindow->Attr.H=100;

}

Вариант B:

 void InitMainWindow()

 {

MainWindow=new TFrameWindow(0," Hello, hello!!");

MainWindow->Attr.X=GetSystemMetrics(SM_CXSCREEN)/8;

MainWindow->Attr.Y=GetSystemMetrics(SM_CYSCREEN)/8;

MainWindow->Attr.W=MainWindow->Attr.X*6;

MainWindow->Attr.H=MainWindow->Attr.Y*6;

}

3.2.2. Пояснение к вариантам использования функции InitMainWindow

Указатель MainWindow указывает на главное окно приложения, созданное оператором new и конструктором TFrameWindow. Указатель используется для ссылки на элементы структуры Attr главного окна приложения.

X,Y задают положение левого верхнего угла окна на экране.

W и H задают ширину и высоту окна в пикселах.

Функция GetSystemMetrics возвращает значения различных характеристик системы, таких как высота (SM_CYSCREEN) и ширина (SM_CXSCREEN) экрана.

3.2.3. Задание

1) Создать приложение с вариантом A функции InitMainWindow. Проверьте работоспособность приложения.

2) Создать приложение с вариантом A написания функции инициализации, но с другими значениями элементов X,Y,W,H структуры Attr.

3) Создать приложение с вариантом B написания функции InitMainWindow. Убедиться, что окно размещается в центре экрана.

 

3.3. Немного английского

Attr - Attribute - атрибут, свойство признак.

GetSystemMetrics - to Get System Metrics - получить системные характеристики.

a screen - экран

a frame - рамка

a frame window - обрамляющее окно

InitMainWindow - Initialization of Main Window - инициализация главного окна.

to create - создавать

to show - показать

4. Программирование с таблицами отклика

 

Одним из ключевых моментов работы Windows-приложения является тот факт, что работа программы управляется событиями. Примером событий в Windows является выбор пункта меню или нажатие на кнопку в окне программы.

Система сохраняет информацию о произошедшем событии в системной очереди сообщений, а затем передает сообщение о нем работающей программе. При написании Windows-приложения необходимо обеспечить обработку сообщений, поступающих в программу. Если же этого не сделать, то любые действия пользователя над окном программы будут проигнорированы и Вы не сможете работать с меню и т.д. Пусть, например, в окне программы была нажата левая кнопка мыши. В этом случае программа получит сообщение WM_LBUTTONDOWN. Все сообщения Windows, передаваемые программе, представляют собой целочисленные константы с именами, начинающимися с WM_ (Windows Message, т.е. сообщение Windows).

В программах, написанных с применением 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.


Информация о работе «Borland C++ для Windows»
Раздел: Информатика, программирование
Количество знаков с пробелами: 59535
Количество таблиц: 0
Количество изображений: 13

Похожие работы

Скачать
25316
2
1

... автоматизации, которые не описаны в интерфейсе IDispatch. Var Object: Variant; Object := CreateOleObject('Word.Application'); Использование экземпляра сервера автоматизации, то есть вызов его методов, осуществляется с помощью конструкций, обычных для вызова методов в Delphi: <Ссылка на сервер>.<Название метода>(<Список параметров>); Однако механизм, используемый для ...

Скачать
16146
2
10

... требования: Процессор – Pentium 400 MHz. Оперативная память – 512 Mb. Жесткий диск – 10 Gb. Операционная система – Windows XP Professional Программное обеспечение – Borland Database Engine. 2. Разработка рабочего проекта 2.1  Разработка программы Программа, моделирующая игру «Нечет» и «Чет» разработана на языке Object Pascal в визуальной среде Delphi 6. Проект содержит одно окно- ...

Скачать
133101
1
9

... мире. Внутренняя схема - это сама база данных. Отсюда вытекают основные этапы, на которые разбивается процесс проектирования базы данных информационной системы: Концептуальное проектирование - сбор, анализ и редактирование требований к данным. Для этого осуществляются следующие мероприятия: обследование предметной области, изучение ее информационной структуры выявление всех фрагментов, каждый ...

Скачать
46945
2
0

... из контекстного меню или из меню Run, закрыть приложение и лишь затем вносить изменения в проект. В этом случае уменьшится вероятность потери ресурсов Windows. Компоненты Borland C++ Builder Выбор компонентов для групповых операций Для эффективной разработки пользовательских интерфейсов приложений C++ Builder нередко возникает необходимость в манипулировании компонентами на формах. ...

0 комментариев


Наверх