C++ Builder 中的按钮制作

时间:2022-02-23 01:30:56

摘要:c++ builder 是一个功能齐全的Windows应用程序开发工具.它的应用范围非常广泛.本文主要从四个方面叙述了按钮的制作。

关键字:C++ Builder;按钮;组件

中图分类号:TP311 文献标识码:A文章编号:1009-3044(2007)04-11065-02

1 引言

C++ Builder 是一个功能齐全的Windows应用程序开发工具,它的功能很强大,应用范围也非常广泛。 C++ Builder真正的提供了可视化的开发环境,它使我们从完全以代码的形式创建应用程序的繁琐且复杂的工作中解脱出来,使我们完全不用掌握太多的专业知识就能创建出精彩的图形化程序来。

随着多媒体技术的发展,在越来越多的应用程序中,单纯的文字显示已经无法满足人们的视觉效果,使用者对于界面的图形效果的要求也越来越高。所以,我们将在下面介绍几种比较有趣的按钮制作方法来满足人们的这一需求。

2 具体的实现方法

2.1 C++ Builder中的按钮控件

在CB中,对于按钮控件主要有三种:Button, BitBtn, SpeedButton。 接下来,我将分别给大家讲述这三种控件的应用。

Button组件就是我们大家最常见到的那种按钮,它是纯粹的文字显示,而BitBtn除了文本显示外还可以加入图标显示,我们只要在它的属性Glyph中加入适合的图标就可以了。两者的共同属性就是既可以接收鼠标操作又能接收键盘的操作。而SpeedButton就是我们常说的加速键, 一般缺省情况下,它是方形的,它是对应于菜单中用户经常单击的功能,可以减少用户单击菜单的次数,而且快速按钮可以取任何尺寸,也可以包含文本,但通常不包含文本。

一般加速键上面附有的小图标方便于用户判断选项用途。它不同于前两个按钮的地方在于它只接收鼠标操作而不接收键盘的操作。而且除了在属性Glyph 中加入图标外,它还有另外一个属性也需要被设置,那就是提示(Hint)属性,当我们把鼠标的指针移到SpeedButton上超过两秒,就会出现一段文字的提示信息。我们只要想把SpeedButton的属性ShowHint设置为True,然后在Hint栏中输入提示文字就可以了。

2.2 多边型按钮

我们常用的按钮一般都是四边形的,长方形或者是正方形,为了增加可观性,我们可以修改下按钮的形状,这里介绍种椭圆形和三角形按钮。很多的资料上也给出许多的方法,我们就介绍常用方法。这里我们介绍的按钮的形状的改变不是在设计时设置的,而是在运行时设置的。

这里按钮形状的设计主要分为两步:第一步创建按钮的外形,即定义窗口区域,使用API的区域创建函数就可达到目的。我们用了CreateEllipticRgn 、CreatePolygonRgn,用于创建不同类型的区域显示。第二步将区域显示应用到窗口上。一旦使用区域函数创建了一个新的区域显示,就可以使用SetWindowsRgn函数将这个区域应用到窗口上。

//创建圆形按钮

HRGN hRgnY = CreateEllipticRgn(0,0,RButton->Width,YButton->Height);

SetWindowRgn(YButton->Handle,hRgnY,TRUE);

//创建三角形按钮

TrPoint[0].x=SButton->Width/2;TrPoint[0].y=0;TrPoint[1].x=0;

TrPoint[1].y=SButton->Height;TrPoint[2].x=SButton->Width;TrPoint[2].y=SButton->Height;

HRGN hRgnS = CreatePolygonRgn(TrPoint,3,ALTERNATE);

SetWindowRgn(SButton->Handle,hRgnS,TRUE);

其中TrPoint在Unit.h头文件中定义如下:private: // User declarationsPOINT TrPoint[3];

我们分别在按钮的边界内创建了一个圆形区域和一个三角形区域,然后作为新的窗口区域把它赋给各自的按钮。需要注意的是区域是以按钮坐标的形式定义的,而不是用屏幕坐标。(0,0)点是按钮的最左上角,而(宽,高)点是按钮的最右下角。 这里光标只在圆形和三角形区域内变为crCross形状。当然为了使按钮美观我们可以结合上面所介绍BitBtn或SpeedButton按钮,在按钮上附上位图。图1显示了按钮的效果图。

图1

2.3 动态按钮

这里介绍的动态按钮, 在一个图片的某一小块区域点击鼠标,让这小块区域象按钮一样有动的效果,这就是所谓的动态按钮。它的原理就是用Label在图片上框一小块区域,如果鼠标在这块区域内按下也就是在Label上按下,就把这小块区域向右下放移动很小一段距离,当鼠标松开的时候在把这块区域向左上方移动同样的一段距离,这样给别人的感觉就像在按钮上点击一样 具体实现如下:以*.bmp图片为例来说明具体实现。

(1)新建一个工程,把Form1的BroderStyle设置成bsSingle,在Form1上放一个Image控件,把着个控件的picture属性设置成事先准备好的和工程在一个目录下的1.bmp图片;

(2)在Image1上放一个Label控件,Label控件AutoSize设置成false,Transparent设置成true,其他的属性都默认。用Label1在图片上框一块区域,以后点击这块区域就象点击在按钮上有动的效果;

(3)接下来就是要把上一步用Label1框下的区域保存为2.bmp并放在工程的目录下。实现的方法很多,这里就不说了;

(4)在Form1的头文件中定义

HDC dcCompatible;Graphics::TBitmap *BtnBmp;

在Form1的构造函数中初始化BtnBmp和dcCompatible代码如下

dcCompatible = CreateCompatibleDC(GetDC(Handle));

BtnBmp=new Graphics::TBitmap;

在Label1的OnMouseDown事件中写入如下的代码

BtnBmp->LoadFromFile("2.bmp");

SelectObject(dcCompatible,BtnBmp->Handle);

BitBlt(GetDC(Form1->Handle),401,401,99,99,dcCompatible,0,0,SRCCOPY);

在Label1的OnMouseUp事件中写入如下的代码

BtnBmp->LoadFromFile("2.bmp");

SelectObject(dcCompatible,BtnBmp->Handle);

BitBlt(GetDC(Form1->Handle),400,400,100,100,dcCompatible,0,0,SRCCOPY);

其实,我们应用的这个方法可以不仅仅运用到按钮上,还可以是文字。总之,应用这个方法对于我们程序界面的设计,起到了很大的作用,我们可以按照自己的想法设计出很多美观的界面。

2.4 定制按钮组件

虽然CB中已经提供了按钮的控件,但是它可能不能满足人们的需求,这样,我们可以设计一些全新的控件来满足这些需求。这里,我们介绍一种创建按钮组件的方法。创建组件最简单的方法就是修改已有的组件,使其满足我们的需求。我们以创建一个菱形按钮和椭圆形按钮为例。虽然在前面我们也介绍了多边形按钮,但是这次我们要求按钮的形状的改变在设计时设置的,而不是在运行时设置的,所以我们要创建新的组件。这个组件继承于TComponent。具体步骤如下,首先我们要创建组件框架。BCB中提供了自动生成组件框架的方法。所以在这里我们就不详细介绍它的具体过程。我们将其定义TMyNew,然后我们要编写它的属性,由于我们的需求就是需要一个外形改变的按钮,因此,我们不需要任何新的属性,只要和Button的属性一样就可以了。在它的DoPaint属性中,我们来实现我们的需求。

//菱形按钮

POINT RhombusPoint[4];

RhombusPoint[0].x = this->Width/2;RhombusPoint[0].y = 0; RhombusPoint[1].x = 0;RhombusPoint[1].y = this->Height/2; RhombusPoint[2].x = this->Width/2;RhombusPoint[2].y = this->Height; RhombusPoint[3].x = this->Width; RhombusPoint[3].y = this->Height/2; HRGN hRgn; hRgn = CreatePolygonRgn(RhombusPoint, 4, ALTERNATE);

SetWindowRgn(this->Handle, hRgn, TRUE);

PAINTSTRUCT tmpPS; HDC hDC=BeginPaint(this->Handle,&tmpPS); if(IsMouseEnter){

RhombusPoint[0].y+=1;RhombusPoint[1].x+=1;

RhombusPoint[2].y -= 1; RhombusPoint[3].x -= 1; Polygon(hDC,RhombusPoint,4);}

else Polygon(hDC,RhombusPoint,4)

RECT rt;::GetClientRect(this->Handle, &rt); DrawText(hDC,this->Caption.c_str(),strlen(this->Caption.c_str()),&rt,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

EndPaint(this->Handle,&tmpPS); // 椭圆形按钮

HRGN hRgn;

hRgn = CreateEllipticRgn(0,0,this->Width,this->Height);

SetWindowRgn(this->Handle,hRgn,TRUE);

PAINTSTRUCT tmpPS;

HDC hDC=BeginPaint(this->Handle,&tmpPS);

if(IsMouseEnter)

Ellipse(hDC,1,1,this->Width-1,this->Height-1);

else

Ellipse(hDC,0,0,this->Width,this->Height);

RECT rt;::GetClientRect(this->Handle, &rt);

DrawText(hDC,this->Caption.c_str(),strlen(this->Caption.c_str()),&rt,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

EndPaint(this->Handle,&tmpPS);

创建的按钮效果如图2所示。

图2

3 结束语

C++ Builder提供了一个非常优秀的继承开发环境,对开发的各个阶段都提供了很好的支持,从而大大的加速了开发应用程序的效率。使用C++ Builder ,不仅可以编写一般的Windows应用程序和控制台程序也可以编写复杂的企业级数据库应用和WEB服务程序,还可以编写各种动态链接库和ActiveX控件。在编程中,我们既可以使用其提供的高层次类库VCL来编写代码,也能够深入到Windows底层,直接采用API函数甚至内嵌汇编代码来强化程序的功能。因此,我们要加深学习C++ Builder的开发环境,并在实际工作中灵活运用,那么就一定能够提高我们的编程效率以及完善我们的编程方法。

参考文献:

[1]李幼仪,甘志.C++ Builder高级应用开发指南[M].清华大学出版社,2002.

[2]Borland/Inprise公司著.C++ Builder 5开发人员指南[M].机械工业出版社,2000.

[3]陈灿煌.C++ Builder 6 彻底研究[M].中国铁道出版社,2003.

[4]刘超,唐彬.C++ Builder 案例开发集锦[M].电子工业出版社,2005.

本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

上一篇:基于Internet的GIS网格研究 下一篇:个人防火墙技术与网络安全研究