第1章 计算机测控系统实验基础
1.1.7 在C++Builder中使用图形
C++Builder的VCL图形组件封装了Windows图形设备接口(GDI,Graphics Device Interface),使得在Windows程序设计中添加图形也变得很容易。 在C++Builder应用程序中绘制图形,应该在图形对象(如Form,Image等)的画布(Canvas)中绘制,而不是直接在对象中绘制。画布是图形对象的属性,同时它本身又是对象。画布对象的一个主要的优点是它能够有效地处理资源并且能管理设备场境。所以应用程序可以用相同的方法在屏幕、打印机、位图或者图元文件中绘图。直接在控件的画布上绘图,该图就会立即显示。画布(Canvas)的主要属性和方法如下表所示:
属性 Font Brush Pen PenPos Pixels 说明 指定在图象中写入文本时使用的字体。设置TFont对象的属性可以指定字体、字体的颜色、大小和样式。 决定画布在填充图形形状和背景时使用的颜色和图案。设置TBrush对象的属性可以指定在填充画布的空间使用的颜色、样式或位图。 指定画布在绘制线条和边框时使用的画笔类型。设置TPen对象的属性可以指定画笔的颜色、样式、宽度和模式。 指出画笔当前的位置。 指出当前的画笔所在的位置的象素的颜色值。
(1)使用画笔(Pen)
画布的Pen属性控制线条出现的方式,包括用来绘制形状外框的线条。 画笔本身有四个属性:Color,Width,Style和Mode: ①Color属性:更改画笔的颜色 Canvas->Pen->Color=color; 值 clBlack clWhite clBlue clRed clGreen
6 说明 黑色 白色 蓝色 红色 绿色 计算机测控系统实验指导书
还可以用rgb的各分量的值来表示一种颜色: Canvas->Pen->Color=RGB(214,214,200);
②Width属性:更改画笔的宽度 Canvas->Pen->Width=n;
③Style属性:更改画笔的样式 Canvas->Pen->Style=psDash;
值 psSolid psDash psDot psDashDot PsClear 说明 实线 虚线 点画线 点虚线 清除线 ④Mode属性:更改画笔的模式 Canvas->Pen->Style=pmCopy; 值 pmBlack pmWhite pmNop pmNot pmCopy 说明 总是黑色 总是白色 颜色不变 转成背景颜色 指定颜色(默认值)
(2)使用画刷(Brush)
画布的Brush属性控制填充区域的方式,包括形状的内部区域。画刷有三个属性: ①Color属性:更改填充颜色 Canvas->Brush->Color=color;
②Style属性:更改画刷样式 Canvas->Brush->Style=bsSolid;
③使用位图作为画刷模式
BrushBmp->LoadFromFile(\
7
第1章 计算机测控系统实验基础
Form1->Canvas->Brush->Bitmap = BrushBmp;
Form1->Canvas->FillRect(Rect(0,0,100,100));
(3)单独设置和获取单个象素点
读取:color=Canvas-> Pixels[x][y];//读取位置为(x,y)的象素的点的颜色值。 Canvas->Pixels[x][y] = clRed; //把位置为(x,y)的象素值设置为红色。
(4)使用Canvas的方法来绘制图形对象 ①绘制直线
Canvas->MoveTo(0, 0);
Canvas->LineTo(X, Y);//从(0,0)到(X,Y)画一条直线。
②绘制矩形、椭圆形和圆角矩形
矩形:Canvas->Rectangle(0, 0, 100, 400);
椭圆形:Canvas->Ellipse(0, 0, Image1->Width, Image1->Height); 圆角矩形:Canvas->RoundRect(x, y, x + Dx, y + Dy, Dx/2, Dy/2); ③绘制多边形
Windows::TPoint points[4]; points[0] = Point(10,10); points[1] = Point(30,10); points[2] = Point(130,30); points[3] = Point(240,120); Canvas->Polygon(points, 3);
1.1.8 C++Builder画面设计实例
用C++ Builder编程实现下图所示的显示画面,实时趋势所需的数据由内部函数值代替。
解:上图所示的画面设计称之为窗体设计,是用C++ Builder中的控件绘制的。曲线和棒
8
计算机测控系统实验指导书
图的动态显示则是通过程序实现的。
(1)窗体设计 ①趋势曲线和棒图的刻度盘采用Image控件装入预先绘制好的位图文件。两个Image控件标记为Image1和Image2。
②趋势曲线和棒图的刻度、工位号、工位名称、SP、PV、MV及参数名称等画面上的可视文字信息,均利用Label控件直接显示。该画面所使用的Label控件标记为Label1~Label35。
③最新报警点的点号及报警类型也由Label控件实现,但由程序控制其显示状态。这两个Label控件标记为Label36和Label37。
④所有可变数值的显示使用Edit控件实现,各控件标记为Edit1~Edit14。 ⑤使用PageControl控件实现不同类画面的切换。 ⑥使用Button控件实现同类画面的翻页操作及某些控制功能。 ⑦使用Timer控件实现数据、曲线、棒图的实时刷新操作。
(2)参考程序
#include
#include
#pragma package(smart_init) #pragma resource \
float t30sp=138.5,t30pv=130.5,t30mv=50.2;//假设值 int t30trend[480]; //曲线有480个点 int t1;
TForm1 *Form1; //窗体程序
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{ }
//定时器处理程序
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
t30pv=120+50*sin(t1*5*3.1415/360); //建立实时数据,Y=A+B*SIN(C) t1++;
for(int i=0;i<479;i++)
{
t30trend[i]=t30trend[i+1]; //刷新实时数据 }
t30trend[479]=t30pv; //最新数据
Image2->Picture->LoadFromFile(\; //重调背景,清楚当前棒图 Image2-> Canvas->Pen->Color = clRed; //给定值棒图为红色 Image2-> Canvas->Pen->Width = 3; //棒条宽度 Image2->Canvas->MoveTo(20,181); //给定值棒条起点 Image2->Canvas->LineTo(20,181-t30sp*177/300); //比例变换 Image2-> Canvas->Pen->Color = clBlue; //测量值棒图为兰色 Image2->Canvas->MoveTo(26,181); //测量值棒条起点 Image2->Canvas->LineTo(26,181-t30pv*177/300); //比例变换 Image2-> Canvas->Pen->Color = clGreen; //输出阀位为绿色 Image2->Canvas->MoveTo(46,181); //阀位棒条起点 Image2->Canvas->LineTo(46,181-t30mv*177/300); //比例变换 Image1->Picture->LoadFromFile(\; //重调趋势背景,清除当前趋势曲线
9
第1章 计算机测控系统实验基础
Image1-> Canvas->Pen->Width = 1; //曲线粗细程度 Image1-> Canvas->Pen->Color = clRed; //测量值曲线为红色 Image1->Canvas->MoveTo(0,300); //曲线起点 for(int i=0;i<480;i++) //曲线由480个点组成
{
Image1->Canvas->LineTo(i,300-t30trend[i]); //两点之间连一直线 }
Image1-> Canvas->Pen->Color = clBlue; //给定值曲线为兰色 Image1->Canvas->MoveTo(0,300); //曲线起点 for(int i=0;i<480;i++) //曲线由480点组成
{
Image1->Canvas->LineTo(i,300-t30sp); }
Edit1->Text=FloatToStrF(t30sp,0,4,4); Edit2->Text=FloatToStrF(t30pv,0,4,4); Edit3->Text=FloatToStrF(t30mv,0,3,3)+\; } 10
//两点之间连一直线 //给定值显示,取4位有效数 //测量值显示,取4位有效数 //阀位值显示,取3位百分数形式