时间: 2021-07-31 作者:daque
文/黄建志 在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),image1-〉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调节和测试经过。