📄 20001121003.htm
字号:
<HTML>
<HEAD>
<TITLE>利用C++ Builder开发特殊的屏幕显示效果</TITLE>
<META content="MSHTML 5.00.2314.1000" name=GENERATOR>
</HEAD>
<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0
vLink=#990099>
<div align="center">
<table width="744" border="0" cellspacing="0" cellpadding="0" height="76">
<tr>
<td>
<p align="center"><font size="3"><span class=name00><b><br>
利用C++ Builder开发特殊的屏幕显示效果</b></span></font><span class=name00><br>
</span><span
class=Name01><font color=#666666>(作者:孙航东)</font></span></p>
<p><br>
<br>
<span
class=content> 以前,程序员在DOS平台下开发应用软件时,都会利用DOS的开放性特点,通过中断编写出一些特殊的显示效果,以此来给自己的程序增加一些有趣的特色。然而,随着面向Windows的编程和可视化的第四代开发工具的逐步使用,人们越来越被Windows的统一的编程风格所束缚,同时由于Windows直接管理中断,想用原来的方法来实现一些特殊的显示效果变得越来越困难了。
<br>
<br>
那么,在Windows时代程序员如何来实现窗口的特殊效果呢?实际上,由于整个Windows是图形显示系统,因此对系统而言,用户程序的每一个界面、窗口都是系统的一个画布。程序员可以利用这一特点来实现窗口的特殊效果。
<br>
<br>
最近笔者利用C++ Builder 5.0 Enterprise成功的实现了该项功能,现介绍如下: <br>
<br>
1、在BCB中建立一个工程文件project1.dpr,在Form1中添加如下控件: <br>
<br>
控件名称 属性 值 <br>
<br>
TForm Color clBtnText <br>
<br>
TMainMenu Name MainMneu1 <br>
<br>
TImage Name Image1 <br>
<br>
Align alClient <br>
<br>
AutoSize True <br>
<br>
同时在 MainMenu1控件中增加一个菜单项,其属性为: <br>
<br>
Name Caption <br>
<br>
Items1 图像从中间往左右分出 <br>
<br>
Items2 图像从左右往中间合进 <br>
<br>
Items3 图像从中间往上下分出 <br>
<br>
Items4 图像从上下往中间合进 <br>
<br>
Items5 图像从左移入 <br>
<br>
Items6 图像从右移入 <br>
<br>
Items7 图像从上移入 <br>
<br>
Items8 图像从下移入 <br>
<br>
Items9 图像从左刷屏显示 <br>
<br>
Items10 图像从右刷屏显示 <br>
<br>
Items11 图像从上刷屏显示 <br>
<br>
Items12 图像从下刷屏显示 <br>
<br>
Items13 图像从上往下流水 <br>
<br>
Items14 图像从下往上流水 <br>
<br>
Items15 图像圆形展出 <br>
<br>
Items16 图像左右错移 <br>
<br>
Items17 图像上下错移 <br>
<br>
同时在Unit.cpp中的private中添加如下变量: <br>
<br>
private: <br>
<br>
BITMAP bm; <br>
<br>
Graphics::TBitmap *Bitmap1; <br>
<br>
int i,j; <br>
<br>
int WideHalf; <br>
<br>
TRect Dest1,Source1,Dest2,Source2; <br>
<br>
int HeightHalf; <br>
<br>
HRGN MyRgn; <br>
<br>
2、在Form1的OnCreate事件中添加如下代码: <br>
<br>
void __fastcall TForm1::FormCreate(TObject *Sender)//进行图像特效显示的初始化操作//
<br>
<br>
{ <br>
<br>
Graphics::TBitmap *Bitmap1 = new Graphics::TBitmap();//定义一个图象句柄//
<br>
<br>
Bitmap1->LoadFromFile("C:\\factory.bmp");//设定所要特效显示的图象为factory.bmp//
<br>
<br>
if(GetDeviceCaps(Form1->Canvas->Handle,BITSPIXEL)==8)//取得显示窗口的颜色属性//
<br>
<br>
{ <br>
<br>
GetObject(Bitmap1->Handle,sizeof(BITMAP),(LPSTR)&bm); <br>
<br>
if (bm.bmBitsPixel==8)//如果特效显示的图象颜色属性为256色// <br>
<br>
{ <br>
<br>
SelectPalette(Form1->Canvas->Handle,Bitmap1->Palette,FALSE);//从特效显示的颜色画板中提取配色方案//
<br>
<br>
RealizePalette(Form1->Canvas->Handle); //在显示窗口中设置配色方案//
<br>
<br>
} <br>
<br>
Bitmap->HandleType=bmDDB; <br>
<br>
} <br>
<br>
} <br>
<br>
3、在Items1的OnClieck事件中添加如下代码: <br>
<br>
void__fastcall TForm1::Item1Click(TObject *Sender) <br>
<br>
{ //图象从中间往左右分出// <br>
<br>
Form1->Refresh( ); <br>
<br>
WideHalf=Bitmap1->Width/2+Bitmap1->Width%2; <br>
<br>
for(i=0;i<=WideHalf; i++) <br>
<br>
{ <br>
<br>
Dest1=Rect(WideHalf-i,0,WideHalf+i,Bitmap1->Height); <br>
<br>
Source1=Rect(WideHalf-i,0,WideHalf+i,Bitmap1->Height); <br>
<br>
Form1->Canvas->CopyRect(Dest1,Bitmap1->Canvas,Source1);
<br>
<br>
for(j=0;j<10000;j++);//图像的延迟显示// <br>
<br>
} <br>
<br>
} <br>
<br>
4、在Items2的OnClieck事件中添加如下代码: <br>
<br>
void__fastcall TForm1::Item2Click(TObject *Sender) <br>
<br>
{ //图像从左右往中间合进// <br>
<br>
Form1->Refresh( ); <br>
<br>
WideHalf=Bitmap1->Width/2+Bitmap1->Width%2; <br>
<br>
Form1->Refresh( ); <br>
<br>
for(i=0;i<=WideHalf;i++) <br>
<br>
{ <br>
<br>
Source1=Dest1=Rect(0,0,i,Bitmap1->Height); <br>
<br>
Source2=Dest2=Rect(Bitmap1->Width-i,0,Bitmap->Width,Bitmap1->Height);
<br>
<br>
Form1->Canvas->CopyRect(Dest1,Bimap1->Canvas,Source1); <br>
<br>
Form1->Canvas->CopyRect(Dest2,Bitmap1->Canvas,Source2);
<br>
<br>
for(j=0;j<10000;j++); <br>
<br>
} <br>
<br>
} <br>
<br>
5、在Items3的OnClieck事件中添加如下代码: <br>
<br>
void__fastcall TForm1::Item3Click(TObject *Sender) <br>
<br>
{ //图像从中间往上下分出// <br>
<br>
Form1->Refresh( ); <br>
<br>
HeightHAlf=Bittmap1->Height/2+Bitmap1->Height%2; <br>
<br>
for(i=0;i<=HeightHalf;i++) <br>
<br>
{ <br>
<br>
Dest1=Rect(0,HeightHalf-i,Bitmap1->Width,HeightHalf); <br>
<br>
Source1=Rect(0,0,BmpHandle->Width,i); <br>
<br>
Dest2=Rect(0,HeightHaf,Bitmap1->Width,HeightHalf+i); <br>
<br>
Source2=Rect(0,Bitmap1->Height-i,Bitmap1->Width,Bitmap1->height);
<br>
<br>
Form1->Canvas->CopyRect(Dest1,BmpHandle->Canvas,Source1);
<br>
<br>
Form1->Canvas->CopyRect(Dest2,BmpHandle->Canvas,Source2);
<br>
<br>
for(j=0;j<10000;j++); <br>
<br>
} <br>
<br>
} <br>
<br>
6、在Items4的OnClieck事件中添加如下代码: <br>
<br>
void__fastcall TForm1::Item4Click(TObject *Sender) <br>
<br>
{ //图像从上下往中间合进// <br>
<br>
Form1->Refresh( ); <br>
<br>
HeightHalf=Bitmap1->Height/2+Bitmap1->Height%2; <br>
<br>
for(i=0;i<=HeightHalf;i++) <br>
<br>
{ <br>
<br>
Dest1=Rect(0,0,Bitmap1->Width,i); <br>
<br>
Source1=Rect(0,HeightHalf-i,Bitmap1->Width,HeightHalf); <br>
<br>
Dest2=Rect(0,Bitmap1->Height-i, <br>
<br>
Bitmap1->Width,Bitmap1->Height); <br>
<br>
Source2=Rect(0,HeightHalf,Bitmap1->Width,HeightHalf+i); <br>
<br>
Form1->Canvas->CopyRect(Dest1,Bitmap1->Canvas,Source1);
<br>
<br>
Form1->Canvas->CopyRect(Dest2,Bitmap1->Canvas,Source2);
<br>
<br>
for(j=0;j<10000;j++); <br>
<br>
} <br>
<br>
} <br>
<br>
7、在Items5的OnClieck事件中添加如下代码: <br>
<br>
void__fastcall TForm1::Item5Click(TObject *Sender) <br>
<br>
{ //图像从左移入// <br>
<br>
Form1->Refresh( ); <br>
<br>
for(i=Bitmap1->Width;i>=0;i--) <br>
<br>
{ <br>
<br>
Dest1=Rect(0,0,Bitmap1->Width-i,Bitmap1->Height); <br>
<br>
Source1=Rect(i,0,Bitmap1->Width,Bitmap1->Height); <br>
<br>
Form1->Canvas->CopyRect(Dest1,Bitmap1->Canvas,Source1);
<br>
<br>
for(j=0;j<10000;j++); <br>
<br>
} <br>
<br>
} <br>
<br>
8、在Items6的OnClieck事件中添加如下代码: <br>
<br>
void__fastcall TForm1::Item6Click(TObject *Sender) <br>
<br>
{ //图像从右移入// <br>
<br>
Form1->Refresh( ); <br>
<br>
for(i=0;i<=Bitmap1->Width;i++) <br>
<br>
{ <br>
<br>
Dest1=Rect(Bitmap1->Width-i,0,Bitmap1->Width, <br>
<br>
Bitmap1->Height); <br>
<br>
Source1=Rect(0,0,i,Bitmap1->Height); <br>
<br>
Form1->Canvas->CopyRect(Dest1,Bitmap1->Canvas,Source1);
<br>
<br>
for(j=0;j<10000;j++); <br>
<br>
} <br>
<br>
} <br>
<br>
9、在Items7的OnClieck事件中添加如下代码: <br>
<br>
void__fastcall TForm1::Item7Click(TObject *Sender) <br>
<br>
{ //图像从上移入// <br>
<br>
Form1->Refresh( ); <br>
<br>
for(i=0;i<=Bitmap1->Height;i++) <br>
<br>
{ <br>
<br>
Dest1 =Rect(0,0,Bitmap1->Width,i); <br>
<br>
Source1 =Rect(0,Bitmap1->Height-i,Bitmap1->Width,Bitmap1->Height);
<br>
<br>
Form1->Canvas->CopyRect(Dest1,Bitmap1->Canvas,Source1);
<br>
<br>
for(j=0;j<10000;j++); <br>
<br>
} <br>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -