用C++Builder设计动态按钮

Author: 弯弯 Date: 2001年 48期

?牐犚残砟阋丫⒁獾剑谕缢俣炔欢咸岣叩慕裉欤镜恼局髅俏肆糇》梦收叩氖酉撸荚嚼丛蕉嗟卦谕持惺褂镁赖亩⒔换ナ降谋淼ヒ约捌渌程匦А2还颐且迪终庑┨匦В话愣夹枰柚嗨芇hotoshop、Flash这样复杂的图像设计软件。其实,并不是所有的特效都需要庞大的图像软件才能完成,我们同样可以通过编写程序的方法来达到设计网页特效的目的。下面,笔者就以C++ Builder来设计动态网页按钮为例,来说明一下我们完全可以使用程序来制作网页的特效。
  ?牐牨收咴谡饫锷杓频亩嘲磁ヒ迪值男Ч牵菏蟊暌贫桨磁ド鲜保蟊晷巫幢湮中危卑磁セ岫乇涑闪硗庖环妫佣梦收叩氖酉咚布湮。灰坏┦蟊昀肟磁ブ螅磁ビ只指吹揭郧白刺T诰咛蹇⑹保颐侵饕肅++ Builder提供的SpeedButton构件来显示按钮处在抬起、禁止、按下与保持按下的不同状态,下面是其具体的设计步骤:
  ?牐?1.首先选择一张自己满意的位图作为按钮的原始面貌,并命令为one.bmp,接着可以用图像制作软件将one.bmp转换为色彩更加亮丽的two.bmp,这个位图就是按钮在鼠标经过时显示的图形。另外,为了能“强行”吸引访问者的“眼球”,笔者同时还选取1个声音文件名为crush.wav,以便让鼠标移动到按钮上时发出声音来提醒用户注意。
  ?牐?2.做好准备工作后,我们下面就开始正式进行程序的原代码编写工作,编写时打开一个纯文本编辑软件,输入下面的代码,并保存为资源文件app.rc:
  ?牐燾rush WAV crush.wav
  ?牐爏tart BITMAP one.bmp
  ?牐爏tart1 BITMAP two.bmp
  ?牐?3.在C++ Builder中新建一个项目,并将资源文件app.rc添加进项目中。当然,大家也可以通过BIN目录下的brcc32.exe将RC文件编绎为RES文件,然后用“#program resource “*.res””语句将它联编进项目中,笔者在这里采用了更简单的前一种方法。在当前窗体上加入新的SpeedButton,取名为StartSpeedButton。属性设置为:
  ?牐燙aption  空
  ?牐燙ursor  crHandPoint
  ?牐燜lat  True
  ?牐燞int
  ?牐燝lyph  None
  ?牐燬howhint  True。
  ?牐牻酉吕矗蚩杂Φ耐肺募谄渲械腜rivate项中增加:
  ?牐燝raphics::TBitmap *one,*two; //定义位图
  ?牐燙har *chWavHandle; //定义声音句柄
  ?牐犎缓笤谥鞅淼サ腃PP文件的表单创键事件(onCreate)所对应的函数中先初始化位图:
  ?牐爋ne=new Graphics::TBitmap();
  ?牐爐wo=new Graphics::TBitmap();
  ?牐犗旅妫跏蓟笤僭厝胛煌迹?
  ?牐爋ne->Handle=LoadBitmap(Hinstance, “one”); //从内存中载入位图
  ?牐爐wo->Handle=LoadBitmap(Hinstance, “two”);?牔?
  ?牐牻幼牛偌釉厣粑募?
  ?牐燞RSRC temp=FindResource(Hinstance,“crush”, “WAV”); //从内存中载入声音
  ?牐燞GLOBAL h=LoadResource(Hinstance,temp);
  ?牐燙hWavHandle=(char *)LockResource(h);?牔?
  ?牐犓婧螅颐窃俳《磁サ幕嫦允疚猼wo.bmp的图像:
  ?牐燬tartSpeedButton->Glyph->Assign(two);??
  ?牐牭彼械某跏脊ぷ鹘崾院螅颐腔褂Ω眉笆笔头潘加玫淖试矗僮魇敝灰谥鞅淼サ腛nDestroy事件所对应的函数中加入:
  ?牐燿elete chWavHandle;
  ?牐燿elete two,one;
  ?牐牭秸饫镂梗蟊晷巫幢浠?按钮突起及动态提示已经有了,下面所要做的工作就是完成图形变化及声音提示。在做这部分工作之前,可回想一下浏览网页的情况。我们的动态按钮的响应步骤应该是:鼠标移入按钮时,图形由第一幅图变为第二幅图,同时发出声音来提示用户;移出时图形再变回原貌,但此时不发出声响。因此应让程序知道什么时候鼠标正好移入、什么时候正好移出。按照这个思路,我们可以在头文件的Private项中增加状态变量:
  ?牐燽ool blStart;
  ?牐犜谥鞅淼ノ募腛nCreate中为其设置初始值:
  ?牐燽lStart=true; //在TRUE状态下,一旦发生OnMouseMove事件就可以点亮按钮。
  ?牐犙≈蠸peedButton按钮,在其OnMouseMove事件所对应的函数StartSpeedButtonMouseMove()中增加  if(blStart)//可以点亮按钮:
  ?牐爗StartSpeedButton->Glyph->Assign(one); //加载第一幅图
  ?牐?//通过chWavHandle句柄调用内存中声音文件
  ?牐燬ndPlaySound(chWavHandle,SND_MEMORY|SND_SYNC);
  ?牐燽lStart=false; //再发生OnMouseMove事件不可以点亮按钮}
  ?牐牭比唬贡匦朐谑蟊昀肟磁ナ痹俳夹位指次病H绾尾拍苤朗蟊昀肟兀勘冉显嫉陌旆ㄗ匀皇怯檬蟊甑淖晡恢美磁卸希庋芊蚜ΑR桓銮擅畹恼惺怯冒ㄔ谖恢蒙希┐税磁サ钠渌考腛nMouseMove事件来判断(注意:选用的外围部件相对于此按钮来说需有足够的纵深,否则,一旦鼠标移动太快,有可能会漏过OnMouseMove事件而发生紊乱。确决的办法是:再加上更外围的部件的OnMouseMove事件来双保险)。
  ?牐犚园磁サ耐馕Р考侵鞅淼?MainForm为例,在其OnMouseMove事件所对应的函数MainFormMouseMove()中加入:
  ?牐爄f(!blStart) //鼠标正好由按钮内移出
  ?牐燬tartSpeedButton->Glyph->Assign(two); //加载第二幅图
  ?牐燽lStart=true; //为鼠标重新进入按钮作准备
  ?牐?#include //在主表单CPP文件前部加入为SndPlaySound提供声明的头文件
  ?牐犐厦婢褪潜收呤褂肅++Builder来实现简单动态按钮的设计,当然,如果你是一位编程爱好者的话,完全可以通过编程来实现各种各样的特殊效果的设计。