Создание объекта приложения внутри функции OwlMain
При написании программы будем работать с классом TApplication и функцией OwlMain. В данном варианте программы объект класса TApplication создается внутри функции OwlMain.
Исходный текст приложения
#include <owl\applicat.h>
int OwlMain(int, char* []) { TApplication app("Hello, Windows!"); return app.Run(); }
Пояснения к программе
Заголовочный файл owl\applicat.h содержит описание класса TApplication (см. Раздел 10.2.). app - объект класса TApplication. При создании этого объекта используется неявный вызов конструктора, устанавливающего текст заголовка прикладного окна “Hello, Windows!”. app.Run() - вызов члена-функции класса TApplication для объекта app. Функция TApplication::Run() запускает приложение.
Задание
1) Создать и выполнить приложение, убедившись в правильности функционирования кнопок максимизации и минимизации окна. 2) Передвинуть окно в другое место экрана. 3) Плавно изменить высоту и ширину окна с помощью мыши. 4) Закрыть приложение. 5) Изменить исходный текст приложения, заменив заголовок окна на “Hello, Hello!”. Убедиться в появлении окна с новым заголовком. Немного английского
an application - приложение to run - выполняться a window - окно Windows - название системы Windows OWL - Object Windows Library - библиотека классов Windows to include - включать main - основной, главный to return - возвращать, возвращаться
Динамическое создание объекта класса TApplication
В этом варианте приложения объект класса TApplication динамически создается в свободной области памяти.
Исходный текст приложения
#include <owl\applicat.h>
int OwlMain(int, char* []) { TApplication *app; app=new TApplication(" Hello Windows!"); return app->Run(); }
Пояснения к программе
app - указатель на объект типа TApplication.
Оператор new выделяет участок в свободной области памяти под объект класса TApplication. При этом неявный вызов конструктора инициализирует объект приложения и устанавливает текст заголовка в “Hello, Windows!”.
Задание
Создать и выполнить приложение.
2.3. Кратчайший вариант Windows-приложения
Исходный текст приложения
#include <owl\applicat.h> int OwlMain(int, char* []) { return TApplication(" Hello Windows!").Run(); }
Задание
Создать приложение и убедиться в его работоспособности.
3. Использование класса TFrameWindow для создания главного окна
Класс TFrameWindow является производным от TWindow и обеспечивает функционирование главного окна приложения.
Создание объекта главного окна
В нижеследующем приложении член-функция InitMainWindow класса TApplication с помощью оператора new и конструктора TFrameWindow создает объект - главное окно приложения. Адрес объекта помещается в переменную MainWindow объекта приложения.
Исходный текст программы
#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(); }
Пояснения к программе
Включаемый заголовочный файл 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.
Задание
1) Создать и выполнить приложение. Обратите внимание! Вместо заголовка “Hello, Windows!”, заданного конструктором TMyApp, окно имеет заголовок “Hello, Hello!”. Это результат работы переопределенной виртуальной функции TMyApp::InitMainWindow, которая была вызвана после конструктора и изменила текст заголовка на “Hello, Hello!”. 2) Измените тексты заголовков, используемые конструкторами TMyApp и TFrameWindow. 3) Измените статус доступа к членам класса TMyApp на protected или private. Убедитесь, что появятся сообщения об ошибках компиляции, так как в функции OwlMain производится обращение к теперь уже недоступному конструктору TMyApp. 4) Опишите конструктор TMyApp вне класса, не забыв добавить при его описании оператор привязки к классу TMyApp. Убедитесь в работоспособности приложения. 5) Опишите член-функцию InitMainWindow вне класса. Проверьте работоспособность приложения.
Изменение положения главного окна на экране
Класс TFrameWindow наследует из класса TWindow (см. раздел 10.4.) член-данное Attr(см. раздел 10.4.1.). Attr - это структура, содержащая различные атрибуты окна, такие как стиль окна, позиция на экране, размер и т.д.
Варианты функции 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) экрана.
Задание
1) Создать приложение с вариантом A функции InitMainWindow. Проверьте работоспособность приложения. 2) Создать приложение с вариантом A написания функции инициализации, но с другими значениями элементов X,Y,W,H структуры Attr. 3) Создать приложение с вариантом B написания функции InitMainWindow. Убедиться, что окно размещается в центре экрана. Немного английского
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.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|