- 关 键 词:
- c++
访问地址 http://www.qqread.com/bcb/p218336.html
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调试通过。
更多内容请看Office技巧专区、网管实用技巧100例、C/C++技术专题专题,或进入讨论组讨论。
文/黄建志
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调试通过。
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- Office技巧专区 (7169篇文章)
- 网管实用技巧100例 (6880篇文章)
- C/C++技术专题 (1640篇文章)
- ADO.NET实用技巧 (6407篇文章)
- C/C++进阶技术文档 (821篇文章)
- C++ Builder图形图像编程 (4篇文章)
- 数字小键盘指法练习 (5501次浏览)
- 用WinSock控件编写网络聊天器 (2638次浏览)
- C++Builder注册表编程实例详解 (1568次浏览)
- C++ Builder VCL库函数简介 (1348次浏览)
- 在 C++ Builder中利用串行通信控件编程 (1213次浏览)
- C++ Builder中消息处理过程及应用 (1038次浏览)
- 将指定目录的结构装入TreeView中 (990次浏览)
- 用C++ Builder3 制作记事本 (818次浏览)
- Windows多线程间同步事件的控制方法 (787次浏览)
- C++Builder开发Web应用程序 (746次浏览)



