以前,程序員在DOS平臺(tái)下開(kāi)發(fā)應(yīng)用軟件時(shí),都會(huì)利用DOS的開(kāi)放性特點(diǎn),通過(guò)中斷編寫出一些特殊的顯示效果,以此來(lái)給自己的程序增加一些有趣的特色。然而,隨著面向Windows的編程和可視化的第四代開(kāi)發(fā)工具的逐步使用,人們?cè)絹?lái)越被Windows的統(tǒng)一的編程風(fēng)格所束縛,同時(shí)由于Windows直接管理中斷,想用原來(lái)的方法來(lái)實(shí)現(xiàn)一些特殊的顯示效果變得越來(lái)越困難了。
那么,在Windows時(shí)代程序員如何來(lái)實(shí)現(xiàn)窗口的特殊效果呢?實(shí)際上,由于整個(gè)Windows是圖形顯示系統(tǒng),因此對(duì)系統(tǒng)而言,用戶程序的每一個(gè)界面、窗口都是系統(tǒng)的一個(gè)畫布。程序員可以利用這一特點(diǎn)來(lái)實(shí)現(xiàn)窗口的特殊效果。
最近筆者利用C++ Builder 5.0 Enterprise成功的實(shí)現(xiàn)了該項(xiàng)功能,現(xiàn)介紹如下:
1、在BCB中建立一個(gè)工程文件project1.dpr,在Form1中添加如下控件:
控件名稱 屬性 值
TForm Color clBtnText
TMainMenu Name MainMneu1
TImage Name Image1
Align alClient
AutoSize True
同時(shí)在 MainMenu1控件中增加一個(gè)菜單項(xiàng),其屬性為:
Name Caption
Items1 圖像從中間往左右分出
Items2 圖像從左右往中間合進(jìn)
Items3 圖像從中間往上下分出
Items4 圖像從上下往中間合進(jìn)
Items5 圖像從左移入
Items6 圖像從右移入
Items7 圖像從上移入
Items8 圖像從下移入
Items9 圖像從左刷屏顯示
Items10 圖像從右刷屏顯示
Items11 圖像從上刷屏顯示
Items12 圖像從下刷屏顯示
Items13 圖像從上往下流水
Items14 圖像從下往上流水
Items15 圖像圓形展出
Items16 圖像左右錯(cuò)移
Items17 圖像上下錯(cuò)移
同時(shí)在Unit.cpp中的private中添加如下變量:
private:
BITMAP bm;
Graphics::TBitmap *Bitmap1;
int i,j;
int WideHalf;
TRect Dest1,Source1,Dest2,Source2;
int HeightHalf;
HRGN MyRgn;
2、在Form1的OnCreate事件中添加如下代碼:
void __fastcall TForm1::FormCreate(TObject *Sender)//進(jìn)行圖像特效顯示的初始化操作//
{
Graphics::TBitmap *Bitmap1 = new Graphics::TBitmap();//定義一個(gè)圖象句柄//
Bitmap1->LoadFromFile("C:\\factory.bmp");//設(shè)定所要特效顯示的圖象為factory.bmp//
if(GetDeviceCaps(Form1->Canvas->Handle,BITSPIXEL)==8)//取得顯示窗口的顏色屬性//
{
GetObject(Bitmap1->Handle,sizeof(BITMAP),(LPSTR)bm);
if (bm.bmBitsPixel==8)//如果特效顯示的圖象顏色屬性為256色//
{
SelectPalette(Form1->Canvas->Handle,Bitmap1->Palette,FALSE);//從特效顯示的顏色畫板中提取配色方案//
RealizePalette(Form1->Canvas->Handle); //在顯示窗口中設(shè)置配色方案//
}
Bitmap->HandleType=bmDDB;
}
}
那么,在Windows時(shí)代程序員如何來(lái)實(shí)現(xiàn)窗口的特殊效果呢?實(shí)際上,由于整個(gè)Windows是圖形顯示系統(tǒng),因此對(duì)系統(tǒng)而言,用戶程序的每一個(gè)界面、窗口都是系統(tǒng)的一個(gè)畫布。程序員可以利用這一特點(diǎn)來(lái)實(shí)現(xiàn)窗口的特殊效果。
最近筆者利用C++ Builder 5.0 Enterprise成功的實(shí)現(xiàn)了該項(xiàng)功能,現(xiàn)介紹如下:
1、在BCB中建立一個(gè)工程文件project1.dpr,在Form1中添加如下控件:
控件名稱 屬性 值
TForm Color clBtnText
TMainMenu Name MainMneu1
TImage Name Image1
Align alClient
AutoSize True
同時(shí)在 MainMenu1控件中增加一個(gè)菜單項(xiàng),其屬性為:
Name Caption
Items1 圖像從中間往左右分出
Items2 圖像從左右往中間合進(jìn)
Items3 圖像從中間往上下分出
Items4 圖像從上下往中間合進(jìn)
Items5 圖像從左移入
Items6 圖像從右移入
Items7 圖像從上移入
Items8 圖像從下移入
Items9 圖像從左刷屏顯示
Items10 圖像從右刷屏顯示
Items11 圖像從上刷屏顯示
Items12 圖像從下刷屏顯示
Items13 圖像從上往下流水
Items14 圖像從下往上流水
Items15 圖像圓形展出
Items16 圖像左右錯(cuò)移
Items17 圖像上下錯(cuò)移
同時(shí)在Unit.cpp中的private中添加如下變量:
private:
BITMAP bm;
Graphics::TBitmap *Bitmap1;
int i,j;
int WideHalf;
TRect Dest1,Source1,Dest2,Source2;
int HeightHalf;
HRGN MyRgn;
2、在Form1的OnCreate事件中添加如下代碼:
void __fastcall TForm1::FormCreate(TObject *Sender)//進(jìn)行圖像特效顯示的初始化操作//
{
Graphics::TBitmap *Bitmap1 = new Graphics::TBitmap();//定義一個(gè)圖象句柄//
Bitmap1->LoadFromFile("C:\\factory.bmp");//設(shè)定所要特效顯示的圖象為factory.bmp//
if(GetDeviceCaps(Form1->Canvas->Handle,BITSPIXEL)==8)//取得顯示窗口的顏色屬性//
{
GetObject(Bitmap1->Handle,sizeof(BITMAP),(LPSTR)bm);
if (bm.bmBitsPixel==8)//如果特效顯示的圖象顏色屬性為256色//
{
SelectPalette(Form1->Canvas->Handle,Bitmap1->Palette,FALSE);//從特效顯示的顏色畫板中提取配色方案//
RealizePalette(Form1->Canvas->Handle); //在顯示窗口中設(shè)置配色方案//
}
Bitmap->HandleType=bmDDB;
}
}