3. 按钮类组件
21)问:在进行Windows程序界面设计中,经常会用到按钮,在C++Builder中,按钮一定是通过按钮组件来实现的吗?
答:是的,并且C++Builder的按钮类组件十分丰富。BCB提供了两类按钮类组件:一类是执行类按钮,另一类是信息类按钮。所谓执行类按钮是指它们通常用来启动程序运行的,比如按钮、位图按钮、加速按钮。而信息类按钮一般用来获取信息,包括单选按钮和复选框。灵活地使用各种按钮,不仅可以使程序更加丰富多彩,而且可以提高程序的性能。
22)问:那么按钮组件有哪些常用的属性和方法呢?
答:对于按钮组件,Caption属性用来描述按钮的标题,也就是按钮上显示的文本,它与标签组件很相识,我们同样可以在这个属性中为按钮指定快捷键。
当Cancel属性值为True时,用户无论何时按下Esc键,都会产生OnClick事件,当窗体上有多个按钮时,Esc键触发TabOrder值最小的那个按钮的OnClick事件。它的缺省值为False
当Default属性值为true时,用户无论何时按下Enter键时,都会产生OnClick事件,与Cancel属性不同的是,如果输入焦点正好在一个按钮上,那么会产生这个按钮的OnClick事件。否则,产生TabOrder的值最小的那个按钮的OnClick事件。它的缺省值为True
Hint属性保存着按钮的提示内容,当用户把鼠标光标停留在按钮上时,就会显示提示信息。
ShowHint属性用来确定是否显示提示文本,缺省值为False。
按钮常用的事件就是OnClick事件,OnClick事件在鼠标单击按钮时产生,另外,通过快捷键、enter键和Esc键也可以产生OnClick事件,一般情况下,按钮都需要增加OnClick事件处理程序。
23)问:那么位图按钮又有什么特点呢?
答:位图按钮BitBtn除了可以像普通按钮那样显示文本外,还可以显示图形,除了具有一般按钮所具有的全部属性外,位图按钮还有一个特有的Kind属性。这个属性用来设定按钮为几种预定义图形按钮风格中的哪一种。这是几种预定义按钮风格。这些做好的按钮如下表:
Kind属性值
按钮外观
等价属性设置
bkCustom
XML:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />Office:office" />ASPectratio="t" v:ext="edit">
缺省值
用来给用户制定
bkOK
Caption=”OK”
ModalResult=mrOK
Default=true
bkCancel
Caption=”Cancel”
ModalResult=mrCancel
Cancel=true
bkYes
Caption=”&Yes”
ModalResult=mrYes
Default=true
bkNo
Caption=”&No”
ModalResult=mrNo
Cancel=true
bkHelp
Caption=”&Help”
bkClose
Caption=”&Close”
bkAbort
Caption=”Abort”
ModalResult=mrAbort
bkRetry
Caption=”&Retry”
ModalResult=mrRetry
bkIgnore
Caption=”&Ignore”
ModalResult=mrIgnore
bkAll
Caption=”&All”
ModalResult=mrAll
当把Kind的属性值设置为bkCustom时,还可以给位图按钮指定其他的图形,具体的方法是,在对象编辑器中选择Glyph属性,然后单击Value列中的省略号按钮,这时会出现一个图形编辑对话框,要求指定位图的位置。
单击Load按钮,在文件打开对话框中选择一个位图文件就可以了。要注意的是,如果选择的位图太大,位图按钮不会自动调整其尺寸,这时你只能看到一部分的图形。
24)问:位图按钮组件的NumGlyph属性有什么作用?
答:属性NumGlyph指出位图按钮使用的位图的数目,当你需要位图按钮使用多个位图分别表示按下,弹起等不同状态时,必须保证这些位图具有相同的尺寸,并且一个接着一个地水平排列着。
在C++Builder中,一个位图按钮最多可有四个位图,因此,NumGraph地取值范围只能是1到4,C++Builder将根据位图按钮地状态确定显示哪个位图。
一般来说,当按钮未选中时显示第一个位图。
当按钮不能选择时,显示第二个位图,
当按钮被单击时显示第三个位图,
当用户释放鼠标键时,又会重新显示第一个位图,
当没有希望的位图时,那么所有地状态都使用第一个位图。
25)问:快捷按钮有哪几个重要属性?
答:快捷按钮与位图按钮很相似,也可以显示图像,但也有一些不同之处:快捷按钮一般都比较小,缺省大小25*25,基本上都是只显示图像而不显示文字,最大差别是,快捷可以保持在按下的状态,而其它两类按钮不能。快捷按钮一般都是用来制作工具栏按钮,这时要和Panel配合使用。下面来看一下它的重要属性:
AllowAllUp:设置一个组的快捷按钮是否可以全部处于弹起的状态。缺省为false,这时可以用来模拟单选按钮,让同一个组的总有一个按钮处在按下状态。如果一个组中只有一个快捷按钮,把这个属性改为true,这时这个按钮就可以在按下和弹起两个状态之间切换,可以用来模拟一个复选按钮。
Down:表示按钮是否按下,若设为true,则处于按下的状态。
GroupIndex:用来把几个这个属性相同的快捷按钮编为一组,即相同取值的按钮为一组。缺省为0,表示这个按钮不编成组。
26)问:那么单选按钮又有什么特点呢?
答:单选按钮RadioButton是相互排斥的一种选择组件,在一组单选按钮中用户一次只能选取一个单选按钮。
虽然你可以只使用一个单选按钮,但是那样单选按钮也就失去了意义。单选按钮一般都是成组出现的。
单选按钮只有一个比较特殊的属性Checked,它表示按钮是否被选中。缺省情况下,Checked的属性是False,表示按钮未选中。
另外单选按钮也具备Caption属性,这就意味着它也可以通过快捷键来选中。
单选按钮在成组使用时有一些特点需要掌握。当你在同一容器(如:Form、Panel、GrouPBox等)上直接放置单选按钮时,这些单选按钮自成一组,也就是说,无论在容器上放置2个或者几十个单选按钮,它们都是一组的,每次只能选中它们中的某一个。
27)问:如果我想在窗体上放置不止一组按钮,应该怎么办?
答:可以用两种方法。一种是使用组合框(GrouPBox),另一种是使用单选按钮分组框(RadioGroup)。
组合框顾名思义就是用来把许多组件组合起来,使窗口变得整齐而有条理,每一组不同的按钮使用一个组合框。在设计时,首先把组合框放在窗体上,然后再把单选按钮放在分组框上。要记住的是,放置次序不能颠倒。一旦把单选按钮放在分组框中,那么这个单选按钮就属于这个组合框了,你无法把它从组合框中移走,如果删除组合框的话,分组框中所有的单选按钮也会被同时删除。
在实际应用中,我们经常使用单选按钮分组框而不是单选按钮。因为单选按钮分组框可以包含多个单选按钮,而它实际上只是一个组件。这比使用分组框和多个单选按钮更直观和简单。
28)问:单选按钮分组框又有哪些特殊的属性呢?
答: 单选按钮分组框有三个属性是比较特殊的:
属性Items是类TStrings的一个对象,这一点与Memo组件中的Lines属性很相似,但是它们的含义不同,Lines属性包含Memo组件中显示的每一行字符串,而Items属性虽然也包含许多字符串,但是每一个字符串代表单选按钮组中的一个单选按钮。
单击Items属性Value列中的省略号按钮,可以打开一个字符串编辑器,然后在这个编辑器中可以输入单选按钮的标题。每个单选按钮占用一行。
Columns属性决定着单选按钮分组框内分栏的数目,默认是1,最多可以有16栏,即16列。
ItemIndex属性为单选分组框中被选中项的序号。-1表示不指向任何一个项。
29)问:复选按钮(CheckBox)有什么作用?
答:复选按钮与单选按钮不同,你可以一次选择多个复选按钮。复选按钮有几个比较重要的属性。
Alignment属性控制复选框标题的位置。
taRightJustify
标题出现在复选框的右边
taLeftJustify
标题出现在复选框的左边
缺省值为taRightJustify。
AllowGrayed属性决定复选框是否可以处于灰色的状态,当属性值为True时,复选框有三种状态,选中、未选中、和灰色;当属性值为False时,复选框只有两种状态。缺省值为false。
Checked属性确定复选框是否被选中。缺省值为false。
要知道复选框是选中状态、未选中状态还是灰色状态。,可以在运行的时候,用程序读取运行时态变量State的值,缺省值为cbUnChecked。
虽然复选框之间并不互相排斥,也就是说,直接放置在窗体上的每一个复选按钮相互之间都不干扰,但是最好还是把复选框分组使用。这样做的好处是便于用户理解。
30)问: CheckBox、RadioButton如何完成动态改变其按钮的标题? RadioGroup能动态添加吧?读取上面三个组件标题又如何做呢?
答:CheckBox、RadioButton的属性里有一个Caption,它的属性值就是按钮的标题,所以应该说对这两个组件来说很容易做到的:
CheckBox1->Caption=”信息”;
Label1->Caption= CheckBox1->Caption;
RadioButton与CheckBox一样,这里就不多说了。
而RadioGroup里面有一个Items属性,这在《闲谈BCB》中说过这个问题,所以你要添加按钮,可以用下面的方法:
RadioGroup1->Items->Add(“我是新来的”);
读取可以利用ItemsIndex来完成:
Label1->Caption=RadioGroup1->Items->Strings[RadioGroup1->ItemIndex];
String是把选中的序号转换成你需要的文本,因为Items是Tstring对象,这类情况在你以后的学习中会经常看到的。
要注意在RadioGroup中也有一个Caption,这是用来给单选分组框设置标题的,这个标题与单选的文字无关。