Общий вид программного модуля AddTab:
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma link "Grids"
#pragma resource "*.dfm"
TAddTab *AddTab;
//---------------------------------------------------------------------------
__fastcall TAddTab::TAddTab(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TAddTab::BitBtn1Click(TObject *Sender)
{
Form1->Show();
AddTab->Hide();
}
//---------------------------------------------------------------------------
void __fastcall TAddTab::BitBtn3Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TAddTab::FormClose(TObject *Sender, TCloseAction &Action)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TAddTab::SpeedButton1Click(TObject *Sender)
{
if (SpeedButton1->Down==true)
{Image1->Visible=false;
Shape1->Brush->Color=clRed;
}
}
//---------------------------------------------------------------------------
void __fastcall TAddTab::SpeedButton2Click(TObject *Sender)
{
if (SpeedButton1->Down=true)
{Image1->Visible<<true;
Shape1->Brush->Color=clLime;
}
}
//---------------------------------------------------------------------------
void __fastcall TAddTab::Button1Click(TObject *Sender)
{
int x,y;
for (x=0; (x<=StringGrid1->ColCount-1);x++)
for ( y=0;(y<=StringGrid1->RowCount-1);y++)
StringGrid1->Cells[x][y]=("Coord. "+
IntToStr(x)+"-"+IntToStr(y));
}
//---------------------------------------------------------------------------
void __fastcall TAddTab::BitBtn4Click(TObject *Sender)
{
ShowMessage(" Test ");
}
//---------------------------------------------------------------------------
void __fastcall TAddTab::BitBtn2Click(TObject *Sender)
{
ShowMessage("Пока НЕТ");
}
//---------------------------------------------------------------------------
void __fastcall TAddTab::MaskEdit1Change(TObject *Sender)
{
}
//---------------------------------------------------------------------------
Рассмотрим еще один проект. Поместим на форму согласно рисунка компоненты:
TabControl (на него помести панель Panel с именем Tab1), ProgressBar, TrackBar, TreeView, Timer, OpenDialog, Edit, Label (с именем TreeView), Panel, Button (с именем OpenDialog).
Дважды щелкнем на свойстве Tabs сомпоненты TabControl. В редакторе строк введем названия закладок – Tab1, Tab2, Tab3.
Свойство Max компонентов ProgressBar и TrackBar установим равное 10.
В событие OnChange компоненты TrackBar введем код:
ProgressBar1->Position=TrackBar1->Position;
Дважды щелкнем по компоненте Timer и добавим код к событию OnTimer, предварительно указав свойство Interval равным 1000(1 секунда):
i++; //интервал счетчика 1 секунда
Panel2->Caption = IntToStr(i);// панель показывает в секундах время
// работы программы
Необходимо внимательно посмотреть на листинг программы и обратить внимание на переменную i.
Для компонента TreeView дважды щелкнем на поле справа от свойства Items, а затем добавим к дереву пункт Level1, затем к узлу второго уровня пункт Level2 и далее Level3.
К кнопке OpenDialog добавим код:
OpenDialog1->FileName="*.*";
if (OpenDialog1->Execute()){
Edit1->Text=OpenDialog1->FileName;
В результате программа прнимет вид:
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
int i=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
ProgressBar1->Position=TrackBar1->Position;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenDialog1->FileName="*.*";
if (OpenDialog1->Execute()){
Edit1->Text=OpenDialog1->FileName;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
i++;
Panel2->Caption = IntToStr(i);
}
//---------------------------------------------------------------------------
4.8.Графические компоненты.
Для работы с графикой в C++Builder имеются графические компоненты:
- Image - используется для импоpта на фоpму pастpовых изобpажений, пиктогpамм и метафайлов;
- Shape - используется для создания геометpических фигуp;.
- PaintBox - используйется для создания рисунков на компонентах, котоpые не имеют свойства Canvas (напpимеp, компонент Panel).
В C++Builder гpафические опеpации выполняются с использованием свойства Canvas, котоpое поддеpживается многими компонентами. Напpимеp, свойство Canvas есть у фоpмы, а так же у TBitmap, TComboBox, TListBox, TPaintBox и дpугих компонентов.
Canvas пpедставляет собой объект, наделенный собственными полномочиями, для чего класс TCanvas поддеpживает множество свойств, методов и событий. Чаще всего используется свойство Canvas.
В пpоцессе pакзpаботки это свойство недоступно в окне Object Inspector. Для того, чтобы использовать Canvas, необходимо написать опеpатоpы, котоpые пpисваивают свойствам Canvas значения и вызывают методы Canvas.
В таблице приведены методы, свойства и события, реализуемые TСanvas.
Установить это... | Чтобы сделать это... |
Arc | Нарисовать на холсте дугу. |
Assign | Присвоить один устойчивый объект другому. |
Brush | Определить свойства кисти |
Chord | Начертить линию поперек эллипса |
ClassName | Получить имя класса объекта |
ClassParent | Получить родительский класс объекта |
ClassType | Получить действительный тип объекта |
CopyMode | Определить способ копирования на холст |
CopyRect | Скопировать прямоугольную область с другого холста |
Create | Создать объект холста |
Destroy | Разрушить объект |
Draw | Нарисовать на холсте графику |
DrawFocus-rect | Нарисовать на холсте прямоугольник фокуса |
Ellipse | Нарисовать на холсте эллипс |
FillRect | Нарисовать на холсте заполненный прямоугольник |
FloodFill | Заполнить область холста |
Font | Определить шрифт, используемый для визуализации текста на холсте |
FrameRect | Нарисовать на холсте незаполненный прямоугольник |
Free | Безопасно разрушить объект |
Handle | Определить НDС для объекта холста |
InheritsFrom | Определить, происходит ли объект от определенного класса |
InstanceSize | Определить объем памяти, распределенной под объект. |
LineTo | Нарисовать на холсте линию |
MoveTo | Переместить текущее положение пера |
OnChange | Данное событие происходит при изменении поверхности холста |
OnChanging | Данное событие происходит перед тем, как холст будет модифицирован |
Pen | Определить вид пера для рисования на холсте |
PenPos | Определить текущую позицию пера |
Pie | Нарисовать объект в форме пирога |
Pixels | Доступ к отдельным пикселям холста |
Polygon | Нарисовать многоугольник |
PolyLine | Нарисовать серию соединенных линий |
Rectangle | Нарисовать заполненный прямоугольник |
Refresh | J Обновить холст |
RoundRect | Нарисовать заполненный прямоугольник с закругленными углами |
StretchDraw | Вытянуть образ так, чтобы он размещался внутри заданного прямоугольника |
TextHeight | Определить высоту в пикселях текста, рисуемого на холсте |
TextOut | Вывести текст на холст |
TextRect | Определить кадрирующий прямоугольник для текста на холсте |
TextWidth | Определить ширину в пикселях текста, рисуемого на холсте |
Рассмотрим примеры:
Все визуальные компоненты имеют свойства Top (координата X) и Left (координата Y). Значения X и Y измеряются в пикселах (пиксел - наименьшая частица поверхности рисунка, которой можно манипулировать).
В зависимости от количества бит, на пиксел различаются различные виды графики от 8- битовой до 24-битовой. В связи с этим возможно отображение до 16 миллионов цветов в стандарте RGB. Рассмотрим пример рисования синусоиды при нажатии кнопки на форме:
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float X,Y;
int PX,PY;
intH;
//определяем половину стороны внизу формы
H=Form1->Height / 2;
for (PX= 0; PX < Form1->Width; PX++) {
//масштаб X приводится к 2 ПИ, чтоб сделать
//полную волну
X=PX*(2*3.1415/Form1->Width);
Y=sin(X);
PY=(0.6*Y*H)+H;
Canvas->Pixels[PX][PY]= 0;//устанавливаем черный цвет пикселя
}
}
//---------------------------------------------------------------------------
Каждое свойство Canvas имеет воображаемое перо для рисова-
ния линий и контуров и команды:
- Form1->Canvas->MoveTo(X,Y); -передвигает перо в точку с
координатами(X,Y) без рисования;
- Form1->Canvas->Point(X,Y);- рисует точку;
- Form1->Canvas->LineTo(X,Y); -чертит линию от текущей по-
зиции до точки с координатами X,Y;
Form1->Canvas->Pen->Color:=цвет; - устанавливает цвет пе-
ра(clBlue - голубой или RGB(0,0,255));
- Form1->Canvas->Pen->Width:=толщина; - устанавливает толщи-
ну пера в пикселях;
- Form1->Canvas->Pen->Style:=стиль; - устанавливает стиль пе-
ра(например,пунктирная линия - psDot);
- Form1->Canvas->Pen->Mode:=режим; - устанавливает режим ри-
сования(pmNot- цвет пера инверсный цвету фона, pmCopy -
перо текущего цвета);
- Form1->Canvas->Brush->Color:=цвет; - устанавливает цвет
закрашенного графического объекта;
- Form1->Canvas->Brush->Style:=стиль; - стиль закраски(напри-
мер,bsSolid - закраска одним цветом, bsCross -решеткой).
Анимация в C++ Builder.
Анимация - это движущаяся графика.
Рассмотрим программу, которая создает анимационную последовательность изображений 10 эллипсов, которые движутся от середины компонента PaintBox к его границам в случайных направлениях при нажатии кнопки Button.
Процедура рисует эллипс, а затем стирает его изображение.
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include <math.h> // <<--включить библиотеку математических функций
#include "Unit1.h"
//---------------------------------------------------------------------------