Разберем текст программы
Разберем текст программы.
Как мы уже говорили выше (смотри Урок №1), для того чтобы создать полноценное Windows-приложение, необходимо выполнить несколько важнейших и обязательных процедур:
1. Создать сам объект приложения.
2. Зарегистрировать в системе Windows класс главного окна. Если помимо главного окна будут выводиться на экран внутренние, порожденные окна, то их классы тоже необходимо зарегистрировать. Windows выводит на экран и обслуживает только зарегистрированные окна.
3. Создать главное окно и показать его на экране. Порожденные окна тоже необходимо создать, но это можно сделать позже и не только в главной функции.
4. Организовать цикл обработки сообщений, поступающих в приложение. Вся дальнейшая работа приложения будет состоять в бесконечном выполнении этого цикла и в обработке поступающих в приложение сообщений до тех пор, пока пользователь не подаст команду его завершения с помощью системного меню или вводом <Alt> + <F4>. Это приводит к завершению работы главной функции и удалению приложения из списка действующих задач Windows.
Приложения под Windows на любом языке можно создавать несколькими путями:
1. Используя вызовы стандартных функций Windows API (Application Programming Interface - Интерфейс Прикладного Программирования);
2. Используя одну из прикладных библиотек (OWL, MFC);
С Borland C++ 5.02 поставляется библиотека OWL 5.00. Также есть возможность использовать библиотеку MFC (Microsoft Foundation Classes - Базовые Классы Microsoft).
Мы будем рассматривать библиотеку OWL.
Библиотека OWL имеет все возможности для создания любых Windows - приложений. В ее состав входит огромное число классов:
TApplication - для создания объекта-приложения;
TFrameWindow - для создания главного окна;
TWindow - базовый класс окон, также применяется и для создания дочерних окон;
TDecoratedFrame - для создания декорированных окон;
TDialog - для создания диалоговых окон;
TMenu - для создания объекта меню;
TBitmap - для рисунков;
TPen - для кистей для рисования; и много-много других классов.
Мы с Вами хотим создать простое окно, пока не умеющее взаимодействовать с пользователем.Для этого мы должны создать:
1. Объект-приложение (для этого в OWL создан класс TApplication);
2. Главное окно (для этого OWL имеет класс TFrameWindow);
Отсюда следует, что наше с Вами приложение будет иметь в своем составе два класса: производный от TApplication и производный от TFrameWindow.
При программировании на языке С++ необходимо придерживаться правила:
"Используя класс программист обязан сначала объявить, а после определить используемый им класс".
Объявим используемые нами классы:
class StartApp : public TApplication
{
public:
StartApp() : TApplication() {}
void InitMainWindow();
};
Давайте рассмотрим, какой код здесь написан?
В первой строке: class StartApp : public TApplication - Мы хотим, чтобы наш с Вами класс с именем StartApp умел делать все, что умеет делать класс OWL TApplication. (При программировании на языке С++ это звучит так: класс StartApp наследует классу TApplication).
Во второй строке: { - открывающая фигурная скобка обозначает начало класса.
В третьей строке: public: - Обозначает то, что методы (функции) и члены (данные) нашего класса будут общедоступны.
В четвертой строке: StartApp() : TApplication() {} - описан конструктор по умолчанию (о нем мы поговорим позже).
В пятой строке: void InitMainWindow(); - наш класс будет иметь собственную функцию InitMainWindow(), а не ту, которая содержится в классе TApplication.
В шестой строке: }; - закрывающая фигурная скобка обозначает окончание класса, причем ; (точка с запятой) - указывает на то, что это объявление класса.
Так как наше приложение будет использовать класс OWL TApplication, мы обязаны включить в код нашей программы включаемый файл этого класса из этой библиотеки.
Выполнено это в самой первой строке кода нашей программы:
#include <owl\applicat.h>
Теперь мы должны определить класс главного окна.
1. Включаем в код нашей программы включаемый файл класса TFrameWindow из библиотеки OWL. - это сделано во второй строке кода нашей программы:
#include <owl\framewin.h>
2. Объявляем наш класс StartWindow от TFrameWindow из библиотеки OWL:
class StartWindow : public TFrameWindow
{
public:
StartWindow(TWindow *parent, char far *title);
};
Этот код практически повторяет код объявления класса TApplication за исключением того, что выбран конструктор не по умолчанию и мы не будем использовать методы (функции) и члены (данные) в этом классе.
Следующим действием которое нам предстоит сделать, будет определение конструкторов (кроме конструкторов по умолчанию) и методов (функций) классов нашего приложения.
Определим используемые нами классы и методы (функции):
// Конструктор главного окна
StartWindow::StartWindow(TWindow *parent, char far *title)
:TFrameWindow(parent, title)
{
// код конструктора главного окна
}
Первая и вторая строки:
Из класса StartWindow ( StartWindow:: ), конструктор StartWindow ( StartWindow(TWindow *parent, char far *title): ), наследующий классу TFrameWindow(parent, title), передаст своему базовому классу два параметра (TWindow *parent, char far *title). Эти параметры - два объекта класса TWindow и символьная строка char far. Откуда будут взяты эти данные, мы увидим позднее.
Проще говоря, для того чтобы Windows смогла правильно сконструировать программируемое нами окно, необходимо передать в базовый оконный класс TFrameWindow библиотеки OWL, два параметра: parent (номер родительского окна) и title (строку символов, которая будет напечатана в заголовке окна).
Третья строка:
{ - открытие тела конструктора.
Четвертая строка:
// код конструктора главного окна. - Код конструктора указывает системе какое окно мы хотим получить (цвет, размеры, положение окна, наличие системных кнопок, рамки окна, меню, полос прокрутки и т.д.). В этой программе мы не набираем код конструктора. Поэтому Windows сама побеспокоится как будет выглядеть наше окно (она подставит значения по умолчанию).
Пятая строка:
} - закрытие тела конструктора.
Это очень важно!!!
Обратите внимание, что определение
отличается от объявления отсутствием
знака ; после закрытия тела.
После этого нам необходимо определнть метод (функцию) класса StartApp нашего приложения.
Выполнено это следующим образом:
// Функция InitMainWindow класса TStartApp
void StartApp::InitMainWindow()
{
StartWindow *startWnd = new StartWindow(0, "Первое окно");
SetMainWindow(startWnd);
}
Рассмотрим этот код подробнее:
Первая строка:
void StartApp::InitMainWindow()
Функция InitMainWindow(), принадлежащая классу StartApp, не принимающая (внутри круглых скобок не вписаны данные) никаких значений и не выдающая никаких значений (void).
Вторая строка:
{ - открытие тела функции.
Третья строка:
StartWindow *startWnd = new StartWindow(0, "Первое окно");
Объявляется указатель (*startWnd) с именем startWnd на объект класса StartWindow и создается динамический объект (= new StartWindow(0, "Первое окно")) класса StartWindow с параметрами, которые будут переданы в класс TFrame Window библиотеки OWL (0, "Первое окно"). Первый параметр 0 (нуль) - т.к. окно единственное и не имеет родителя. Второй - символьная строка, значение которой мы хотим увидеть в строке заголовка нашего окна.
Четвертая строка:
SetMainWindow(startWnd);
Окно, на которое указывает указатель startWnd, назначается главным окном приложения.
Пятая строка:
} - закрытие тела конструктора.
Последнее, что нам необходимо сделать - это определнть метод (функцию) OwlMain, обязательную функцию для всех Windows-приложений, создающихся с помощью библиотеки OWL.
Вот код этой функции:
// Функция OwlMain()
int OwlMain(int, char*[])
{
return StartApp().Run();
}
Код этой функции практически никогда не изменяется. Она запускает Windows-приложение, используя функцию Run() класса TApplication (через унаследованный класс StartApp).