C++ Builder 中的图像显示技巧
- 格式:doc
- 大小:57.00 KB
- 文档页数:8
应用程序的界面跟随不同分辨率而改变利用OnResize事件改变控件位置及大小C++ Builder/Delphi中的Form控件有一个OnResize事件,Form 的所有与大小变化有关的动作可以触发这个事件,包括Form的创建、最大化/最小化/还原、用鼠标拖动改变大小等。
因此,在此事件中动态地改变各个控件的位置可以确保其在Form中的相对位置正确。
因为CBuilder与Delphi的程序有很多共同之处,所以这里只列出CBuilder的代码。
下面的代码将确保控件在任何情况下都居中。
程序一:void __fastcall TForm1::FofmResize(TObject*Sender){int midLoc=Width/2; //取Form的中点Label1-> Left=midLoc-Label1-> Width/2; //设置Label1的位置为Form居中Button1-> Left=midLoc-Button1-> Width/2; //设置Button1的位置为Form居中}稍微修改这段代码,可以使控件保持在任何想要的位置。
同样,也可以利用OnResize事件改变控件的大小。
当Form中控件很多时,分别对每一个控件单独调整位置是件非常麻烦的事,在TFrom类中有一个Controls数组维护所有From中的控件,利用它可方便地对所有控件进行操作。
下面是其源代码:程序二:void __fastcall TForm1::FormResize(TObject*Sender){int midLoc=Width/2;TControl * ChildControl;fof(int i=0; i <ControlCount; i++){//遍历Controls数组,ControlCount是数组元素个数ChildControl = Controls[i];ChildCotrol-> Left = midLoc-ChildControl-> Width/2;}}利用“容器”控制成组控件位置上面的代码对维持所有控制到统一位置非常方便,但不利于对成组控件进行操作。
ok.et内容提要:本文介绍了图形的绘制和图像处理,其中详细介绍了画布(Canvas)的属性与使用方法,利用它们,可以非常直观方便地绘制直线、曲线、矩形、椭圆等各种图形。
本文还介绍了图像处理的方法,其中包括 Image 组件、TBitmap 类和 TJPEGImage 类的使用,而要进行快速的图像处理,几乎都离不开 ScanLine 技术。
使用 ScanLine 技术,能够快速取得bitmap 的每行的颜色值,而无需使用 Canvas 的 Pixels 属性逐点获取像素点的颜色值。
关键字:C++Builder、图形、图像、画布引言:自 Windows 诞生以来,可以通过 GDI(Graphics Device Interface)来实现图形的绘制。
然而对于初学者来说,庞大复杂的 GDI 绘图系统是一个难以跨越的学习障碍。
所幸的是,在C++Builder 绘图系统中,提供了一个简易可行的画布( Canvas),可以用非常直观的方式来实现Windows 下的绘图功能。
C++Builder 提供了 Image 组件,可以很方便地装载图像,以及进行图像处理。
正文:1 在窗体上作图1.1 知识要点1. 画布( Canvas)在 C++Builder 中,几乎所有的可视化组件(包括:Form、Image、Bitmap、PaintBox)都包含Canvas 属性。
Canvas 包含了许多和绘图有关的性质,如 Pen、Brush、Pixels、Font 等,另外它还包含了各种绘图的函数,如 LineTo、Rectangle、MoveTo、Polygon 等。
(1)Canvas 类主要属性有:Font:画布绘制文本所用的字体。
Brush:用于填充背景的画笔刷。
Pen:用来画线和描述图形轮廓的画笔。
PenPos:当前绘图位置的坐标。
Pixels:画布像素数组。
(2)Canvas 类主要方法有:Arc:用当前画笔在画布上画圆弧。
C++Builder一些小技法怎样在C++Builder中创建使用DLL自从C++Builder从去年浪漫情人节上市以来,吸引了大量的Delphi、VC、Vb的程序员到它的怀抱,大量的C、C++程序员感叹道:总算有了C的可视化开发工具,对我也是一样,从BC、Delphi到C++Builder。
动态链接库(DLL)是Windows编程常遇到的编程方法,下面我就介绍一下在BCB (C++Builder下简称BCB) 中如何创建使用DLL和一些技巧。
一、创建:使用BCB File|NEW建立一个新的DLL工程,并保存好文件BCB,生成一个DLL的程序框架。
1.DllEntryPoint函数为一个入口方法,如果使用者在DLL被系统初始化或者注销时被调用,用来写入对DLL的初始化程序和卸载程序;参数:hinst用来指示DLL的基地址;reason用来指示DLL的调用方式,用于区别多线程单线程对DLL的调用、创建、卸载DLL;2.在程序中加入自己所要创建的DLL过程、函数;3.用dllimport描述出口;例程序如下:#include#pragma hdrstopextern 揅?__declspec(dllexport) int test();int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*){return 1;}int test(){return 3;}注意:动态链接库中调用过程、函数时有不同的CALL方式__cdecl、__pascal, __fastcall、__stdcall,BCB中默认的方式为__cdecl(可不写),如果考虑兼容性可用时__stdcall声明方法为:extern 揅?__declspec(dllexport) int __stdcall test();对于其中过程、函数也改为:int __stdcall test()二、使用DLL在BCB中使用DLL有两种方法:1.用静态调用法首先需要在BCB的项目中加入输入接口库(import library),打开工程项目,使用BCB View|Project Manager打开项目列表,向项目中加入接口库(*.lib)。
MGBuilder用户操作手册Rev. 2.1上海麦杰科技有限责任公司Shanghai Magus Technology Co., Ltd.2004年12月1.1 概述 (4)1.2 内容介绍 (4)2 MGBuilder配置及使用说明 (5)2.1内容介绍 (5)2.2 配置MGBuilder的使用环境 (5)2.2.1 Windows系统 (5)2.2.2 Unix及Linux系统 (5)2.3 MGBuilder的目录及文件结构 (6)2.4 MGBuilder功能概述 (6)2.5 启动MGBuilder (7)2.6 使用MGBuilder (7)2.6.1文件菜单 (7)2.6.2 编辑菜单 (8)2.6.3 查看菜单 (8)3 绘制及编辑图形元素 (10)3.1内容介绍 (10)3.2 线、多线 (10)3.2.1 线、多线的绘制 (10)3.2.2 线、多线的编辑 (10)3.3 矩形 (11)3.3.1 矩形的绘制 (11)3.3.2 矩形的编辑 (11)3.4 多边型 (11)3.4.1 多边形的绘制 (11)3.4.2 多边形的编辑 (11)3.5 椭圆 (11)3.5.1 椭圆的绘制 (11)3.5.2 椭圆的编辑 (12)3.6 圆弧 (12)3.6.1 圆弧的绘制 (12)3.6.2 圆弧的编辑 (12)3.7 文本 (12)3.7.1 文本的绘制 (12)3.7.2 文本的编辑 (13)3.8 采集点 (13)3.8.1 采集点的绘制 (13)3.8.2 采集点的编辑 (14)3.9 按钮 (14)3.9.1 按钮的绘制 (14)3.9.2 按钮的编辑 (15)3.10 时间 (15)3.10.1 时间的绘制 (15)3.10.2 时间的编辑 (15)4.1 内容介绍 (16)4.2 插入图像 (16)4.3 插入棒状图 (17)4.5 插入趋势 (17)5 图库的使用 (18)5.1内容介绍 (18)5.2插入图库元素 (18)5.3 添加图库对象 (19)6 设置图形属性 (20)6.1 内容介绍 (20)6.2 设置对象的颜色和填充方式 (20)6.3 设置对象的线型和线宽 (23)6.4 设置字体 (23)6.5 设置事件 (23)6.5 设置事件 (24)6.6 设置图形属性 (24)7 图形工具的使用 (25)7.1 内容介绍 (25)7.2 图形镜像 (25)7.2.1 左右镜像 (25)7.2.2 上下镜像 (25)7.3 旋转 (26)7.3.1 顺转90度 (26)7.3.2 逆转90度 (26)7.4 对齐 (26)7.4.1 左对齐 (26)7.4.2右对齐 (26)7.4.3上对齐 (27)7.4.4下对齐 (27)7.4.5 垂直对齐 (27)7.4.6 水平对齐 (27)7.5 组合 (28)7.5.1 组合 (28)7.5.2 取消组合 (28)8 使用帮助 (29)附录A MGBuilder快捷键速查 (30)附录B DSP文件格式 (31)附录C 使用中可能遇到的问题 (38)1 简介1.1 概述MGBuilder组态工具是专门为自动控制、控制系统仿真而设计的图形化组态工具,它具有图形编辑功能及动态定义功能,用户使用它可以很方便地绘制和仿真各种控制系统的过程图形,同时与图形浏览工具MGViewer配合使用,无需再进行复杂的二次编程,就可以实现各种控制的界面仿真工作,大大减少了为了追求仿真系统的形似所花费的时间,加快仿真系统的开发进度。
C++ Builder 初学问与答(一)第一部分:基础入门1.窗体1)问:Windows的编程就是在窗体的基础上实现的,C++Builder是怎样处理窗体的呢?答:窗体的一部分功能通过窗体的属性来实现,窗体的属性非常多,这里只对其中比较重要的属性进行介绍。
1.ActiveControl指定窗体上的某个组件为输入焦点。
如下面的语句将窗体上的Label1组件成为输入焦点:ActiveControl=Label1。
在同一时时刻,应用程序只能有一个输入焦点。
2.BorderIcons用来设定标题栏上出现哪些系统图标。
它是一个集合,可以设成以下几个类型:最大化按钮(biMaximize)、最小化按钮(biMinimize)、帮助按钮(biHelp)和系统菜单(biSystemMenu)。
3.Icon属性用来指定当窗体最小化时显示的图标。
4.KeyPreview属性为true时,表示击键事件发生时先传给窗体,然后再传给有输入焦点的组件上,相当于窗体截获了原本属于组件的事件。
缺省值为false,表示击键事件只送到当前有输入焦点的组件上。
5.Menu属性用来指定窗体的主菜单。
6.Visible属性用来确定窗体是否可见。
此外还有一些运行时态属性,这些属性只有在程序运行的时候才能通过编程访问。
这种属性主要有:Active属性用来确定窗体是否获得输入焦点。
ActiveMDIChild这个函数将返回当前活动的子窗体。
DropTarget属性用来指定窗体是否是拖放操作的对象。
Parent属性用来设定包含窗体的窗口控件,通常是另一个窗体。
如果窗体没有包含它的控件,那么它的Parent属性为nil。
2)问:Windows窗体有很多样式,比如对话框,弹出窗口。
如果我要控制窗体的边界样式,应该怎么办?答:属性BorderStyle可以指定窗体边界的外观和行为。
它一共有六种可能的取值。
bsDialog表示大小不可变的标准的对话框边界。
原创]C++builder组件属性详解尽管C++Builder的组件种类繁多,每种组件又都有许多不同的属性,但是在这些众多的属性中有相当一部分是大多数组件所共有的。
因此我们应当主要掌握这些共有组件。
在设计时设置属性一般是通过属性窗口来进行的。
在属性窗口设置组件属性的操作步骤如下:1)打开相应对象的属性窗口。
2)从属性列表中选定属性名称。
3)在属性窗口的右列输入或选择新的属性值。
注意:有些属性在设置值右侧有…按钮,单击该按钮会出现相应的设置对话框,设置值需要在对话框中选定。
在代码中设置组件属性的方法是:对象名称->属性名称=设置值;下面我们来介绍一些主要组件的主要属性。
窗体form的属性:1.Caption:标题。
是窗体和各种可视化控件的共有属性,用来指定窗体标题栏中的说明文字,默认与控件名相同,但程序员可以在对象监视器和代码中修改。
在代码中修改的格式为:Form->Caption = "da";// da表示程序员输入的标题。
通常,对于Windows系统中的多文档界面( MDI )应用程序,当主框架窗口中的子窗口以最大化显示的时候,应用程序的标题栏中显示的内容为“ <应用程序名> - <打开的文档名>”;当子窗口以非最大化窗口显示的时候,主框架窗口中只显示应用程序的名称,子窗口有自己的标题栏,其中显示该窗口打开的文件名。
所以,当窗体的显示方式发生了改变后,应该立即改变标题栏中的内容。
2.Name:变量名。
是窗体和所有控件的共有属性,系统给予其默认名字,但程序员可以在对象监视器修改,不要在代码中修改。
通常,应该在系统开发的设计阶段就将整个工程中所有窗体的名称确定,然后在编程阶段,根据设计文档修改窗体的Name属性。
一般情况下,不要在程序运行期间通过代码修改Name属性。
3.Enabled:可操作性。
决定了对象在运行时是否允许用户进行操作。
它是逻辑型:true表示允许用户操作并可对其操作作出响应;false表示禁止用户操作,此时对象呈灰色。
C++ Builder 中的图像显示技巧
在C++ Builder中,实现一幅图像的显示非常简单,只要在Form窗体中定义一个TImage组件,设置其Picture属性,然后选择任何有效的.ico、.bmp、.emf或.wwf文件,加载进来,所选文件就显示在TImage组件中。
但这只是直接将图形显示在窗体中,毫无技巧可言,给人感觉是一种枯燥乏味。
为了使图形显示有别具一格的效果。
按下列步骤实现:
1、定义一个TImage组件,把要显示的图形先加载到TImage组件中,也就是说,把图形内容从磁盘载入内存中,作为图形缓存。
2、创建一新的位图对象,其尺寸跟TImage组件中的图形一样。
3、利用画布(Canvas)的CopyRect功能(将一个画布的矩形区域拷贝到另一个画布的矩形区域),以达到动态显示位图。
下面介绍各种图形显示技巧的具体实现方法。
上拉效果
图1
实现原理:首先将暂存图形的第一条水平线,搬移至要显示位图的最后一条,接着再将暂存图形的前两条水平线,依次搬移至要显示位图的最后两条水平线,然后搬移前
三条、前四条直到全部图形数据搬完为止。
在搬移的过程中即可看到显示的位图由下而上浮起,而达到上拉的效果(如图1)。
程序算法:
void _fastcall TFor-
m1::Button1Click(TObject *Sender)
{int i,width,height;
Graphics::TBitmap *newbmp;
newbmp=new Graphics::TBitmap;
newbmp-〉Width=Image1-〉Width;
newbmp-〉Height=Image1-〉Height;
width=Image1-〉Width;
height=Image1-〉Height;
for(i=0;i
{newbmp-〉Canvas-〉CopyRect(Rect(0,height-i,width,height),
Image1-〉Canvas,Rect(0,0,width,i));
Form1-〉Canvas-〉Draw(10,10,newbmp);}
delete newbmp;}
从左向右平铺显示效果
图2
实现原理:首先将暂存图形的最后一条竖线,搬移至要显示位图的第一条竖线,接着再将暂存图形的最后两条竖线,依序搬移至要显示位图的前两条竖线,然后搬移最后三条、四条竖线直到全部图形数据搬完为止。
在搬移的过程中即可看到显示的位图由左向右浮起,而达到从左向右平铺显示的效果(如图2)。
程序算法:
void _fastcall TForm1::Button2Click(TObject *Sender)
{int i,width,height;
Graphics::TBitmap *newbmp;
newbmp=new Graphics::TBitmap;
newbmp-〉Width=Image1-〉Width;
newbmp-〉Height=Image1-〉Height;
width=Image1-〉Width;
height=Image1-〉Height;
for(i=0;i<=width;i++)
{ newbmp-〉Canvas-〉
CopyRect(Rect(0,0,i,height),
Image1-〉Canvas,Rect(width-i,0,width,height));
Form1-〉Canvas-〉Draw(10,10,newbmp); }
delete newbmp;}
垂直交错效果
图3
实现原理:将要显示的图形拆成两部分,奇数条扫描线由上往下搬移,偶数条扫描线则由下往上搬移,而且两者同时进行。
便可看到分别由上下两端出现的较淡图形向屏幕中央移动,直到完全清楚为止(如图3)。
程序算法:
void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{Graphics::TBitmap *newbmp;
int i,j,height,width;
newbmp=new Graphics::TBitmap;
newbmp-〉Width=Image1-〉Width;
newbmp-〉Height=Image1-〉Height;
height=Image1-〉Height;
width=Image1-〉Width;
i=0;
while(i<=height)
{for(j=0;j
{newbmp-〉Canvas-〉CopyRect(Rect(j*2,0,j*2+1,i),Image1-〉Canvas, Rect(j*2,0,j*2+1,i));
newbmp-〉Canvas-〉CopyRect(Rect(j*2+1,height,j*2+2,height-i), Image1-〉Canvas, Rect(j*2+1,height,j*2+2,height-i)); }
Form1-〉Canvas-〉Draw(10,10,newbmp);
i+=2; }
delete newbmp;}
水平交错效果
图4
实现原理:同垂直交错效果原理一样,将要显示的图形拆成两部分,奇数条扫描线由左往右搬移,偶数条扫描线则由右往左搬移,两者同时进行。
从屏幕上便可看到分别由左右两端出现的较淡图形向屏幕中央移动,直到完全清楚为止(如图4)。
程序算法:
void __fastcall TForm1::BitBtn4Click(TObject *Sender)
{int i,j,height,width;
Graphics::TBitmap *newbmp;
newbmp=new Graphics::TBitmap;
newbmp-〉Width=Image1-〉Width;
newbmp-〉Height=Image1-〉Height;
height=Image1-〉Height;
width=Image1-〉Width;
i=0;
while(i<=height)
{for(j=0;j
{newbmp-〉Canvas-〉CopyRect(Rect(0,j*10,i,j*10+5),Image1-〉Canvas,
Rect(0,j*10,i,j*10+5));
newbmp-〉Canvas-〉CopyRect(Rect(width-i,j*10+5,width,j*10+10),
Image1-〉Canvas, Rect(width-i,j*10+5,width,j*10+10)); }
Form1-〉Canvas-〉Draw(10,10,newbmp);
i+=2; }
delete newbmp;}
从左到右圆筒滚动效果
图5
实现原理:图形复制过程中,把目标图形的坐标按照曲线方式移动,以达到圆筒滚动效果(如图5)。
程序算法:
void __fastcall TForm1::BitBtn5Click(TObject *Sender)
{int i,j,height,width;
Graphics::TBitmap *newbmp;
newbmp=new Graphics::TBitmap;
newbmp-〉Width=Image1-〉Width;
newbmp-〉Height=Image1-〉Height;
height=Image1-〉Height;
width=Image1-〉Width;
i=0;
int intr=50;
for(i=0;i<=width;i+=5)
{for(j=1;j<=2*intr;j++)
{newbmp-〉Canvas-〉
CopyRect(Rect(i+j,-sqrt(2*intr*j-j*j),i+j+1,-sqrt(2*intr*j-j*j)+height),Ima ge1-〉Canvas,Rect(i+j,0,i+j+1,height));}
newbmp-〉Canvas-〉CopyRect(Rect(i,0,i+5,height),Image1-〉
Canvas,Rect(i,0,i+5,height));
Form1-〉Canvas-〉Draw(10,10,newbmp);
Sleep(10); }}
所有程序算法都在C++ Builder 4.0和5.0调试通过。