void InitMainWindow()
{
MainWindow=new TMyWin();
}
};
int OwlMain(int, char *[])
{
TMyApp app;
return app.Run();
}
8.1.2. Пояснения к программе
Заголовочный файл owl\scrollba.h содержит описание класса TScrollBar и его членов-функций. Описание класса TMyWin содержит объявления точек (объектов класса TPoint) для левого верхнего и правого нижнего углов прямоугольника. В классе дополнительно объявлен объект класса TScrollBar, представляющий собой вертикальную линейку прокрутки. TMyWin содержит также функцию отклика EvVScroll на сообщения от линейки прокрутки и переопределенную функцию Paint.
В теле конструктора TMyWin создается линейка прокрутки и задаются начальные значения координат двух углов прямоугольника.
Описание таблицы реакций содержит элемент EV_WM_VSCROLL.
Функция EvVScroll вызывает одноименную функцию базового класса для обеспечения полной обработки поступающих от скроллера сообщений. Затем функция требует перерисовать часть рабочей зоны окна для вывода геометрических фигур с измененными размерами. Для получения положения ползунка на линейке прокрутки используется функция GetPosition, которая возвращает число в диапазоне от 0 до 100. Вызов функции UpdateWindow вызывает немедленное обновление окна приложения, посылая окну WM_PAINT в обход системной очереди сообщений.
8.1.3. Задание
1) Создать исследовать работу приложения.
2) Изменить вертикальную линейку прокрутки на горизонтальную.
3) Исследовать работу приложения, закомментировав вызов UpdateWindow в теле EvVScroll.
4) Исследовать работу приложения, удалив вызов функции InvalidateRect.
5) Измените таблицу реакции, удалив в ней EV_WM_VSCROLL. Объясните поведение приложения.
8.2. Изменение цвета выводимой графики с помощью кнопок
В приводимом здесь тексте Windows-приложения цвет выводимых на экран геометрических фигур изменяется при нажатии одной из двух кнопок, размещенных в окне приложения.
8.2.1. Исходный текст программы.
#include <owl\applicat.h>
#include <owl\framewin.h>
#include <owl\button.h>
#include <owl\dc.h>
#define CM_BUTTON1 100
#define CM_BUTTON2 200
class TMyWin : public TFrameWindow
{
public:
TPoint pn,pk;
int nColor;
TMyWin() : TFrameWindow(0,"The Paint function")
{
new TButton(this,CM_BUTTON1,"Palette 1",350,50,80,30);
new TButton(this,CM_BUTTON2,"Palette 2",350,100,80,30);
pn.x=100;
pn.y=50;
pk.x=300;
pk.y=200;
nColor=1;
}
void Paint(TDC&,BOOL,TRect&);
void CmButton1()
{
nColor=1;
Invalidate();
UpdateWindow();
}
void CmButton2()
{
nColor=2;
Invalidate();
UpdateWindow();
}
DECLARE_RESPONSE_TABLE(TMyWin);
};
DEFINE_RESPONSE_TABLE1(TMyWin,TFrameWindow)
EV_COMMAND(CM_BUTTON1,CmButton1),
EV_COMMAND(CM_BUTTON2,CmButton2),
END_RESPONSE_TABLE;
void TMyWin::Paint(TDC &dc,BOOL,TRect&)
{
TColor color(nColor==1 ? TColor::LtBlue : TColor::LtYellow);
TPen pen1(color);
dc.SelectObject(pen1);
dc.Rectangle(pn,pk);
TPen pen2(nColor==1 ? TColor::Black : TColor::LtRed);
dc.SelectObject(pen2);
dc.Ellipse(pn,pk);
}
class TMyApp : public TApplication
{
public:
TMyApp():TApplication()
{}
void InitMainWindow()
{
MainWindow=new TMyWin();
}
};
int OwlMain(int, char *[])
{
TMyApp app;
return app.Run();
}
8.2.2. Пояснения к программе
Заголовочный файл owl\button.h содержит описание класса TButton и его членов.
В начало программы помещены директивы
#define CM_BUTTON1 100
#define CM_BUTTON2 200,
определяющие константные идентификаторы сообщений, которые будут посылаться программе кнопками в ответ на щелчки мышью. CM_BUTTON1 генерируется первой кнопкой, CM_BUTTON2 - второй. Можно выбрать другие имена сообщений, отличные от CM_BUTTONn и значения констант, отличные от приведенных в программе, но для того, чтобы программа правильно реагировала на сообщения кнопок, необходимо правильно заполнить таблицу реакций, передав в качестве аргументов макросам таблицы имена констант и имена функций отклика.
Конструктор прикладного окна создает с помощью оператора new две кнопки, передавая им в качестве аргументов идентификатор окна, идентификатор уведомляющего сообщения, которое будет генерировать кнопка, текст надписи на кнопке и координаты размещения кнопки в окне приложения.
Обратите внимание на то, что адреса созданных объектов-кнопок не присваиваются указателям. Этого не требуется делать потому, что в программе нет необходимости ссылаться на эти объекты.
Функции отклика на сообщения кнопок CmButton1 и CmButton2 изменяют признак цвета геометрических фигур и объявляют о необходимости перерисовки окна приложения.
Таблица отклика конструируется так же, как это делалось при использовании меню. Она содержит идентификаторы уведомляющих сообщений, приходящих от кнопок и имена функций класса прикладного окна, отвечающих за обработку данных сообщений.
8.2.3. Задание.
1) Создать приложение и исследовать его работу.
2) Изменить аргументы конструктора (текст кнопки, координаты, размер и т. д.) TButton одной из кнопок.
3) Исследуйте работу приложения, закомментировав вызов Invalidate в одной из функций отклика.
9. Ввод и редактирование текста
Данная тема будет посвящена панелям ввода и редактирования - одной из популярнейших компонент Windows.
Использование панели ввода и редактирования текста позволяет приложению ввести и при необходимости отредактировать одну или несколько строк текста.
Панель редактирования создается, как объект класса TEdit и может быть размещена в любом прикладном окне. Данная панель представляет собой стандартный текстовый редактор Windows, в котором доступны все операции редактирования текста - вставка и замена текста, удаление символов и работа с буфером обмена Windows.
Различают два типа панелей редактирования - однострочная и многострочная.
Создание панелей редактирования и размещение их в окне приложения осуществляются аналогично созданию кнопок и полос прокрутки. Объект создается из класса TEdit. Конструктору объекта передается идентификатор окна, в котором будет размещена панель, константный идентификатор панели, текст, который будет помещен в редактор и координаты панели в окне приложения. Дополнительно конструктору передается стиль панели редактирования: TRUE, если создается многострочная панель, FALSE, если панель - однострочная (см раздел 10.7).
9.1. Пример использования однострочного текстового редактора для ввода и редактирования текста
Приведенное в этом разделе приложение создает однострочный текстовый редактор и выводит копии этой строки в окне приложения.
9.1.1. Исходный текст приложения
#include <owl\applicat.h>
#include <owl\framewin.h>
#include <owl\edit.h>
#include <owl\button.h>
#include <owl\dc.h>
#define ID_ONELINER 150
#define CM_BUTTON 160
#define TEXTLEN 10
class TMyWin: public TFrameWindow
{
TEdit *oneLiner;
char txt[TEXTLEN];
public:
TMyWin(): TFrameWindow(0,"the TEdit object")
{
- oneLiner=new TEdit(this,ID_ONELINER,"Input one line",10,10,100,30,TEXTLEN,FALSE);
- new TButton(this,CM_BUTTON,"Update",10,100,70,25);
- txt[0]='\0';
}
protected:
void CmButton();
void Paint(TDC&,BOOL,TRect&);
DECLARE_RESPONSE_TABLE(TMyWin);
};
DEFINE_RESPONSE_TABLE1(TMyWin,TFrameWindow)
EV_COMMAND(CM_BUTTON,CmButton),
END_RESPONSE_TABLE;
void TMyWin::CmButton()
{
oneLiner->GetLine(txt,TEXTLEN,0);
Invalidate();
//UpdateWindow();
}
void TMyWin::Paint(TDC& dc,BOOL,TRect&)
{
- for (int i=1;i<=2;i++)
- dc.TextOut(150,50+i*20,txt);
}
class TMyApp:public TApplication
{
public:
TMyApp(): TApplication(){};
void InitMainWindow()
- {
- MainWindow=new TMyWin();
- }
};
int OwlMain(int,char *[])
{
return TMyApp().Run();
}
9.1.2. Пояснения к программе
Заголовочный файл owl\edit.h содержит описание класса TEdit и его членов-функций.
Класс TMyWin описывает прикладное окно. В классе определен указатель на объект TEdit, используемый для ссылки на член-функции элемента редактирования.
Конструктор TMyWin создает однострочную панель редактирования. Первый аргумент конструктора TEdit равен this. Это привязывает панель редактирования к прикладному окну. Конструктору также передается текст, который будет изначально размещен в панели редактирования.
Дополнительно в окне приложения размещается кнопка, при нажатии которой текст из буфера редактора переписывается в строку с именем txt. Для этого вызывается GetLine. Первый параметр функции - указатель на строку, в которую требуется переписать текст строки из редактора, второй аргумент - длина переписываемой строки, третий аргумент - номер копируемой из элемента редактирования строки. Функция отклика на нажатия кнопки объявляет о необходимости перерисовки главного окна. Это приводит к тому, что Paint выводит текст, скопированный в txt в окно приложения. После запуска приложения Вы можете изменить текст в элементе редактирования, а затем нажать на кнопку. В результате все изменения в редакторе будут отображены в окне приложения.
9.1.3. Задание
1) Создайте и исследуйте приложение.
2) Поместите в окно приложения еще одну панель редактирования. После нажатия на кнопку приложение должно выводить в свое окно строки из первой и второй панели редактирования.
9.2. Использование многострочного текстового редактора для ввода и редактирования текста.
Нижеприведенное Windows-приложение использует многострочную панель редактирования текста.
9.2.1. Исходный текст программы
#include <owl\applicat.h>
#include <owl\framewin.h>
#include <owl\edit.h>
#include <owl\button.h>
#include <owl\dc.h>
#define ID_MULTILINER 150
#define CM_BUTTON 160
class TMyWin: public TFrameWindow
{
TEdit *multiLiner;
char *txt;
public:
TMyWin(): TFrameWindow(0,"the TEdit object")
{
- multiLiner=new TEdit(this,ID_MULTILINER,"Input lines",10,10,200,100,0,TRUE);
- new TButton(this,CM_BUTTON,"Update",10,130,70,25);
}
protected:
void CmButton();
void Paint(TDC&,BOOL,TRect&);
DECLARE_RESPONSE_TABLE(TMyWin);
};
DEFINE_RESPONSE_TABLE1(TMyWin,TFrameWindow)
EV_COMMAND(CM_BUTTON,CmButton),
END_RESPONSE_TABLE;
void TMyWin::CmButton()
{
Invalidate();
//UpdateWindow();
}
void TMyWin::Paint(TDC& dc,BOOL,TRect&)
{
- for (int i=1;i<=multiLiner->GetNumLines();i++)
- {
- int lineLength= multiLiner->GetLineLength(i-1);
- txt= new char[lineLength];
- multiLiner->GetLine(txt,lineLength,i-1);
- dc.TextOut(250,50+i*20,txt);
- delete txt;
- }
}
class TMyApp:public TApplication
{
public:
TMyApp(): TApplication(){};
void InitMainWindow()
- {
- MainWindow=new TMyWin();
- }
};
int OwlMain(int,char *[])
{
return TMyApp().Run();
}
9.2.2. Задание
1) Сравните листинги программ, приводимые в 9.2.1 и в 9.1.1, уделив особое внимание на различия в конструировании однострочной и многострочной панелей редактирования.