一、Windows对话框—对话框及其模板
要把一个对话框添加到Visual C++ Developer Studio会有的应用程序上,可以先从Insert菜单中选择 Resource,然后选择Dialog Box。现在一个对话框出现在您的眼前,该对话框带有标题列、标题(Dialog)以及 OK和Cancel按钮。Controls工具列允许您在对话框中插入不同的控件。
Developer Studio将对话框的ID设为标准的IDD_DIALOG1。您可以在此名称上(或者在对话框本身)单击右键,然后从菜单中选择 Properties。在本程序中,将ID改为「AboutBox」(带有引号)。为了与我建立的对话框保持一致,请将 X Pos和Y Pos字段改为32。这表示对话框相对于程序窗口显示区域左上角的显示位置待会会有关于对话框坐标的详细讨论)。
现在,继续在Properties对话框中选择Styles页面标签。因为此对话框没有标题列,所以不要选取 Title Bar复选框。然后请单击Properties对话框的 关闭按钮。
现在可以设计对话框了。因为不需要Cancel按钮,所以先单击该按钮,然后按下键盘上的 Delete键。接着单击OK按钮,将其移动到对话框的底部。在Developer Studio窗口下面的工具列上有一个小位图,它可使控件在窗口内水平居中对齐,请按下此钮。
如果您要让程序的图标出现在对话框中,可以这样做:先在浮动的Controls工具列中按下「 Pictures」按钮。将鼠标移动到对话框的表面,按下左键,然后拉出一个矩形。这就是图标将出现的位置。然后在次矩形上按下鼠标右键,从菜单中选择 Properties。保持ID为IDC_STATIC。此标识符在RESOURCE.H中定义为-1,用于程序中不使用的所有ID。将 Type改为Icon。您可以在Image字段输入程序图标的名称,或者,如果您已经建立了一个图示,那么您也可以从下拉式清单方块中选择一个名称(About1)。
对于对话框中的三个静态字符串,可以从Controls工具列中选择 Static Text,然后确定文字在对话框中的位置。右键单击控件,然后从菜单中选择 Properties。在Properties框的 Caption字段中输入要显示的文字。选择Styles页面标签,从 Align Text字段选择Center。
在添加这些字符串的时候,若希望对话框可以更大一些,请先选中对话框,然后拖曳边框。您也可以选择并缩放控件。通常用键盘上的光标移动键完成此操作会更容易些。箭头键本身移动控件,按下Shift键后按箭头键,可以改变控件的大小。所选控件的坐标和大小显示在Developer Studio窗口的右下角。
如果您建立了一个应用程序,那么以后在查看资源描述档ABOUT1.RC时,您将发现Developer Studio建立的模板。我所设计的对话框模板如下:
ABOUTBOX DIALOG DISCARDABLE 32, 32, 180, 100 STYLE DS_MODALFRAME | WS_POPUP FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,66,80,50,14 ICON "ABOUT1",IDC_STATIC,7,7,21,20 CTEXT "About1",IDC_STATIC,40,12,100,8 CTEXT "About Box Demo Program",IDC_STATIC,7,40,166,8 CTEXT "(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8 END
第一行给出了对话框的名称(这里为ABOUTBOX)。如同其它资源,您也可以使用数字作为对话框的名称。名称后面是关键词DIALOG和DISCARDABLE以及四个数字。前两个数字是对话框左上角的x、y坐标,该坐标在程序呼叫对话框时,是相对于父窗口显示区域的。后两个数字是对话框的宽度和高度。
这些坐标和大小的单位都不是图素。它们实际上依据一种特殊的坐标系统,该系统只用于对话框模板。数字依据对话框使用字体的大小而定(这里是8点的MS Sans Serif字体):x坐标和宽度的单位是字符平均宽度的1/4;y坐标和高度的单位是字符高度的1/8。因此,对这个对话框来说,对话框左上角距离主窗口显示区域的左边是5个字符,距离顶边是2-1/2个字符。对话框本身宽40个字符,高10个字符。
这样的坐标系使得程序写作者可以使用坐标和大小来大致勾勒对话框的尺寸和外观,而不管视讯显示器的分辨率是多少。由于系统字体字符的高度大致为其宽度的两倍,所以,x轴和y轴的量度差不多相等。
模板中的STYLE叙述类似于CreateWindow呼叫中的style字段。对于模态对话框,通常使用WS_POPUP和DS_MODALFRAME,我们将在稍后介绍其它的选项。
在BEGIN和END叙述(或者是左右大括号,手工设计对话框模板时,您可能会使用)之间,定义出现在对话框中的子窗口控件。这个对话框使用了三种型态的子窗口控件,它们分别是DEFPUSHBUTTON(内定按键)、ICON(图标)和CTEXT(文字居中)。这些叙述的格式为:
control-type "text" id, xPos, yPos, xWidth, yHeight, iStyle
其中,后面的iStyle项是可选的,它使用Windows表头文件中定义的标识符来指定其它窗口样式。
DEFPUSHBUTTON、ICON和CTEXT等标识符只可以在对话框中使用,它们是某种特定窗口类别和窗口样式的缩写。例如,CTEXT指示这个子窗口控件类别是「静态的」,其样式为:
WS_CHILD | SS_CENTER | WS_VISIBLE | WS_GROUP
虽然前面没有出现过WS_GROUP标识符,但是在第九章的COLORS1程序中已经出现过WS_CHILD、SS_CENTER和WS_VISIBLE窗口样式,我们在建立静态子窗口文字控件时已经用到了它们。
对于图标,文字字段是程序的图标资源名称,它也在ABOUT1资源描述档中定义。对于按键,文字字段是出现在按键里的文字,这个文字相同于在程序中建立子窗口控件时呼叫CreateWindow所指定的第二个参数。
id字段是子窗口在向其父窗口发送消息(通常为WM_COMMMAND消息)时用来标示它自身的值。这些子窗口控件的父窗口就是对话框本身,它将这些消息发送给Windows的一个窗口消息处理程序。不过,这个窗口消息处理程序也将这些消息发送给您在程序中给出的对话框程序。ID值相同于我们在第九章建立子窗口时,在CreateWindow函数中使用的子窗口ID。由于文字和图标控件不向父窗口回送消息,所以这些值被设定为IDC_STATIC,它在RESOURCE.H中定义为-1。按键的ID值为IDOK,它在WINUSER.H中定义为1。
接下来的四个数字设定子窗口的位置(相对于对话框显示区域的左上角)和大小,它们是以系统字体平均宽度的1/4和平均高度的1/8为单位来表示的。对于ICON叙述,宽度和高度将被忽略。
对话框模板中的DEFPUSHBUTTON叙述,除了包含DEFPUSHBUTTON关键词所隐含的窗口样式,还包含窗口样式WS_GROUP。稍后讨论该程序的第二个版本ABOUT2时,还会详细说明WS_GROUP(以及相关的WS_TABSTOP样式)。