在瀏覽網(wǎng)頁(yè)時(shí),各種各樣制作精美的動(dòng)態(tài)按鈕常常令人驚羨不已。 這種按鈕平常默默無(wú)聞,當(dāng)鼠標(biāo)經(jīng)過(guò)時(shí),立即一躍而出,在鼠標(biāo)變?yōu)槭中蔚耐瑫r(shí),圖形也變得更加亮麗,有的還發(fā)出特有聲音,將你的注意力瞬間抓了過(guò)去;而當(dāng)鼠標(biāo)移開(kāi)之后,一切又恢復(fù)原樣,以免分散你對(duì)新焦點(diǎn)的注意。如果我們能用C++ Builder實(shí)現(xiàn)這種效果,那么一定會(huì)給所開(kāi)發(fā)的應(yīng)用程序增色不少。
在C++Builder中,適合制作動(dòng)態(tài)按鈕的構(gòu)件是SpeedButton。雖然SpeedButton可以通過(guò)1個(gè)16×64像素的位圖來(lái)顯示按鈕處在抬起、禁止、按下與保持按下的不同狀態(tài),但要實(shí)現(xiàn)HTML風(fēng)格的按鈕,還得要通過(guò)編程來(lái)實(shí)現(xiàn)。
選擇1副所鐘意的位圖取名為start.bmp。用圖形制作軟件(如photoshop)將其轉(zhuǎn)換為黑白圖形存為start1.bmp。這2個(gè)位圖分別是按鈕在鼠標(biāo)經(jīng)過(guò)時(shí)及平時(shí)顯示的圖形。同時(shí)還選取1個(gè)聲音文件(不要太長(zhǎng)),假設(shè)其名為crush.wav。
打開(kāi)純文本編輯軟件(如notepad),輸入以下內(nèi)容:
crush WAV crush.wav
start BITMAP start.bmp
start1 BITMAP start1.bmp
保存為資源文件mysrc.rc。
啟動(dòng)Builder,打開(kāi)新工程,將資源文件mysrc.rc添加進(jìn)項(xiàng)目中。你也可以通過(guò)BIN目錄下的brcc32.exe將RC文件編繹為RES文件,然后用 #program resource "*.res" 語(yǔ)句將其聯(lián)編進(jìn)項(xiàng)目中。本文采用更簡(jiǎn)單的前一種方法。
在當(dāng)前窗體上加入新的SpeedButton,取名為StartSpeedButton。屬性按下表設(shè)置:
Caption 空
Cursor crHandPoint
Flat true
Hint 單擊以…..
Glyph None
Showhint true
注意:在設(shè)計(jì)階段,按鈕的Glyph屬性不要先行指定為start1.bmp。
打開(kāi)所對(duì)應(yīng)的頭文件,在其中的private項(xiàng)中增加
Graphics::TBitmap *start,*start1;//定義位圖
Char *chWavHandle;//定義聲音句柄
在主表單的CPP文件的表單創(chuàng)鍵事件(onCreate)所對(duì)應(yīng)的函數(shù)中先初始化位圖,
start=new Graphics::TBitmap();
start1=new Graphics::TBitmap();
初始化后再載入位圖
start->Handle=LoadBitmap(Hinstance, "start");//從內(nèi)存中載入位圖
start1->Handle=LoadBitmap(Hinstance, "start1");
載入聲音文件
HRSRC temp=FindResource(Hinstance,"crush", "WAV");//從內(nèi)存中載入聲音
HGLOBAL h=LoadResource(Hinstance,temp);
ChWavHandle=(char *)LockResource(h);
先在浮動(dòng)按鈕上顯示普通的黑白圖形
StartSpeedButton->Glyph->Assign(start1);
在初始工作完成后,好的習(xí)慣應(yīng)及時(shí)釋放所占用的資源。在主表單的OnDestroy事件所對(duì)應(yīng)的函數(shù)中加入
delete chWavHandle;
delete start1,start;
至此,第一步已經(jīng)結(jié)束,試著運(yùn)行一下,鼠標(biāo)形狀變化、按鈕突起及動(dòng)態(tài)提示已經(jīng)有了,最后再讓我們來(lái)完成圖形變化及聲音提示。
在做這部分工作之前,可回想一下瀏覽網(wǎng)頁(yè)的情況。我們的動(dòng)態(tài)按鈕的響應(yīng)步驟應(yīng)該是:鼠標(biāo)移入按鈕時(shí),圖形由黑白變?yōu)椴噬?,同時(shí)發(fā)出聲響(以后稱之為點(diǎn)亮按鈕);移出時(shí)圖形再變回黑白,但此時(shí)不發(fā)出聲響。因此應(yīng)讓程序知道什么時(shí)候鼠標(biāo)正好移入、什么時(shí)候正好移出。
在頭文件的private項(xiàng)中增加狀態(tài)變量
bool blStart;
在主表單文件的OnCreate中為其設(shè)置初始值
blStart=true;//在TRUE狀態(tài)下,一旦發(fā)生OnMouseMove事件就可以點(diǎn)亮按鈕
選中SpeedButton按鈕,在其OnMouseMove事件所對(duì)應(yīng)的函數(shù)StartSpeedButtonMouseMove()中增加
if(blStart)//可以點(diǎn)亮按鈕
{
StartSpeedButton->Glyph->Assign(start);//變?yōu)椴蕡D
// 通過(guò)chWavHandle句柄調(diào)用內(nèi)存中聲音文件
SndPlaySound(chWavHandle,SND_MEMORY|SND_SYNC);
blStart=false;// 再發(fā)生OnMouseMove事件不可以點(diǎn)亮按鈕
}
當(dāng)然,還必須在鼠標(biāo)離開(kāi)按鈕時(shí)再將圖形恢復(fù)為黑白。如何才能知道鼠標(biāo)離開(kāi)呢?比較原始的辦法自然是用鼠標(biāo)的坐標(biāo)位置來(lái)判斷,但這樣很費(fèi)力。一個(gè)巧妙的招數(shù)是用包含(在位置上)此按鈕的其它部件的OnMouseMove事件來(lái)判斷(注意:選用的外圍部件相對(duì)于此按鈕來(lái)說(shuō)需有足夠的縱深,否則,一旦鼠標(biāo)移動(dòng)太快,有可能會(huì)漏過(guò)OnMouseMove事件而發(fā)生紊亂。確決的辦法是,再加上更外圍的部件的OnMouseMove事件來(lái)雙保險(xiǎn))。
以按鈕的外圍部件是主表單MainForm為例,在其OnMouseMove事件所對(duì)應(yīng)的函數(shù)MainFormMouseMove()中加入
if(!blStart)//鼠標(biāo)正好由按鈕內(nèi)移出
StartSpeedButton->Glyph->Assign(start1);// 圖形恢復(fù)黑白
blStart=true;//為鼠標(biāo)重新進(jìn)入按鈕作準(zhǔn)備
最后在主表單CPP文件前部加入為SndPlaySound提供聲明的頭文件
#include
編繹運(yùn)行,哈哈,一切正如所想的,我的按鈕也具備了HTML風(fēng)格,你還不趕緊行動(dòng)。
注:以上程序在 Builder 4.0/win98環(huán)境下運(yùn)行通過(guò)。這里所說(shuō)的主表單也可以是包含動(dòng)態(tài)按鈕的表單。
在C++Builder中,適合制作動(dòng)態(tài)按鈕的構(gòu)件是SpeedButton。雖然SpeedButton可以通過(guò)1個(gè)16×64像素的位圖來(lái)顯示按鈕處在抬起、禁止、按下與保持按下的不同狀態(tài),但要實(shí)現(xiàn)HTML風(fēng)格的按鈕,還得要通過(guò)編程來(lái)實(shí)現(xiàn)。
選擇1副所鐘意的位圖取名為start.bmp。用圖形制作軟件(如photoshop)將其轉(zhuǎn)換為黑白圖形存為start1.bmp。這2個(gè)位圖分別是按鈕在鼠標(biāo)經(jīng)過(guò)時(shí)及平時(shí)顯示的圖形。同時(shí)還選取1個(gè)聲音文件(不要太長(zhǎng)),假設(shè)其名為crush.wav。
打開(kāi)純文本編輯軟件(如notepad),輸入以下內(nèi)容:
crush WAV crush.wav
start BITMAP start.bmp
start1 BITMAP start1.bmp
保存為資源文件mysrc.rc。
啟動(dòng)Builder,打開(kāi)新工程,將資源文件mysrc.rc添加進(jìn)項(xiàng)目中。你也可以通過(guò)BIN目錄下的brcc32.exe將RC文件編繹為RES文件,然后用 #program resource "*.res" 語(yǔ)句將其聯(lián)編進(jìn)項(xiàng)目中。本文采用更簡(jiǎn)單的前一種方法。
在當(dāng)前窗體上加入新的SpeedButton,取名為StartSpeedButton。屬性按下表設(shè)置:
Caption 空
Cursor crHandPoint
Flat true
Hint 單擊以…..
Glyph None
Showhint true
注意:在設(shè)計(jì)階段,按鈕的Glyph屬性不要先行指定為start1.bmp。
打開(kāi)所對(duì)應(yīng)的頭文件,在其中的private項(xiàng)中增加
Graphics::TBitmap *start,*start1;//定義位圖
Char *chWavHandle;//定義聲音句柄
在主表單的CPP文件的表單創(chuàng)鍵事件(onCreate)所對(duì)應(yīng)的函數(shù)中先初始化位圖,
start=new Graphics::TBitmap();
start1=new Graphics::TBitmap();
初始化后再載入位圖
start->Handle=LoadBitmap(Hinstance, "start");//從內(nèi)存中載入位圖
start1->Handle=LoadBitmap(Hinstance, "start1");
載入聲音文件
HRSRC temp=FindResource(Hinstance,"crush", "WAV");//從內(nèi)存中載入聲音
HGLOBAL h=LoadResource(Hinstance,temp);
ChWavHandle=(char *)LockResource(h);
先在浮動(dòng)按鈕上顯示普通的黑白圖形
StartSpeedButton->Glyph->Assign(start1);
在初始工作完成后,好的習(xí)慣應(yīng)及時(shí)釋放所占用的資源。在主表單的OnDestroy事件所對(duì)應(yīng)的函數(shù)中加入
delete chWavHandle;
delete start1,start;
至此,第一步已經(jīng)結(jié)束,試著運(yùn)行一下,鼠標(biāo)形狀變化、按鈕突起及動(dòng)態(tài)提示已經(jīng)有了,最后再讓我們來(lái)完成圖形變化及聲音提示。
在做這部分工作之前,可回想一下瀏覽網(wǎng)頁(yè)的情況。我們的動(dòng)態(tài)按鈕的響應(yīng)步驟應(yīng)該是:鼠標(biāo)移入按鈕時(shí),圖形由黑白變?yōu)椴噬?,同時(shí)發(fā)出聲響(以后稱之為點(diǎn)亮按鈕);移出時(shí)圖形再變回黑白,但此時(shí)不發(fā)出聲響。因此應(yīng)讓程序知道什么時(shí)候鼠標(biāo)正好移入、什么時(shí)候正好移出。
在頭文件的private項(xiàng)中增加狀態(tài)變量
bool blStart;
在主表單文件的OnCreate中為其設(shè)置初始值
blStart=true;//在TRUE狀態(tài)下,一旦發(fā)生OnMouseMove事件就可以點(diǎn)亮按鈕
選中SpeedButton按鈕,在其OnMouseMove事件所對(duì)應(yīng)的函數(shù)StartSpeedButtonMouseMove()中增加
if(blStart)//可以點(diǎn)亮按鈕
{
StartSpeedButton->Glyph->Assign(start);//變?yōu)椴蕡D
// 通過(guò)chWavHandle句柄調(diào)用內(nèi)存中聲音文件
SndPlaySound(chWavHandle,SND_MEMORY|SND_SYNC);
blStart=false;// 再發(fā)生OnMouseMove事件不可以點(diǎn)亮按鈕
}
當(dāng)然,還必須在鼠標(biāo)離開(kāi)按鈕時(shí)再將圖形恢復(fù)為黑白。如何才能知道鼠標(biāo)離開(kāi)呢?比較原始的辦法自然是用鼠標(biāo)的坐標(biāo)位置來(lái)判斷,但這樣很費(fèi)力。一個(gè)巧妙的招數(shù)是用包含(在位置上)此按鈕的其它部件的OnMouseMove事件來(lái)判斷(注意:選用的外圍部件相對(duì)于此按鈕來(lái)說(shuō)需有足夠的縱深,否則,一旦鼠標(biāo)移動(dòng)太快,有可能會(huì)漏過(guò)OnMouseMove事件而發(fā)生紊亂。確決的辦法是,再加上更外圍的部件的OnMouseMove事件來(lái)雙保險(xiǎn))。
以按鈕的外圍部件是主表單MainForm為例,在其OnMouseMove事件所對(duì)應(yīng)的函數(shù)MainFormMouseMove()中加入
if(!blStart)//鼠標(biāo)正好由按鈕內(nèi)移出
StartSpeedButton->Glyph->Assign(start1);// 圖形恢復(fù)黑白
blStart=true;//為鼠標(biāo)重新進(jìn)入按鈕作準(zhǔn)備
最后在主表單CPP文件前部加入為SndPlaySound提供聲明的頭文件
#include
編繹運(yùn)行,哈哈,一切正如所想的,我的按鈕也具備了HTML風(fēng)格,你還不趕緊行動(dòng)。
注:以上程序在 Builder 4.0/win98環(huán)境下運(yùn)行通過(guò)。這里所說(shuō)的主表單也可以是包含動(dòng)態(tài)按鈕的表單。

