子窗口控件定义的一般语法是:
CONTROL 文本, ID, 类, 风格, x, y, 宽度, 高度 [, 扩展风格]
“文本”指控件的初始化值,“ID”是子窗口向对话框过程发送WM_COMMAND中用的ID值,“类”可以是按钮(Button)、静态(Static)、编辑(Edit)、滚动条(ScrollBar)、列表框(ListBox)和组合框(ComboBox),这些类都是Windows系统中已经预定义的,“对话框管理器”在初始化的时候把每一条控件定义语句转换成下面的CreateWindow命令:
invoke CreateWindow, 类名, 文本, 风格, x, y, 宽度, 高度, 对话框窗口句柄, ID,
hInstance, NULL
正因为如此,所有可以用CreateWindow建立的子窗口都可以在资源中定义,只要知道要使用的类和风格就可以了。所以除了上面这些基本的类之外,对话框中还可以使用一些通用控件,如“日期”(SysDateTimePick32)、“月历”(SysMonthCal32)、“热键”(msctls_hotkey32)和“列表”(SysListView32)等,括号内是它们的类名,只要把定义语句的“类”写成对应的名称就可以了。
基于同一个预定义类的控件根据风格属性的不同,外表可能完全不同,如单选钮、复选框和分组框使用的类都是Button类,文本、图标框、位图框和线条等都是Static类。使用CONTROL语句定义的时候可能不是很直观,所以Rc.exe资源编译器允许使用另一种语法来书写控件定义:
控件名称 [文本,] ID, x, y, 宽度, 高度 [, 风格] [, 扩展风格]
这里使用“控件名称”而不是“类”是因为这个名称只是Rc.exe使用的缩写,并不是真正的Windows类的名称,“控件名称”由Rc.exe解释成“类”名,同时为它使用了几种默认的风格,定义语句中风格属性实际上是附加在默认风格上的,表5.4列出了每种控件使用的类和默认属性,除了表中列出的默认属性外,每种控件还被默认定义了WS_CHILD和WS_VISIBLE属性。
资源脚本中使用的控件名称
控件名称 | 说明 | 基于的类 | 默认窗口风格 |
PUSHBUTTON | 按钮 | Button | BS_PUSHBUTTON, WS_TABSTOP |
DEFPUSHBUTTON | 默认按钮 | Button | BS_DEFPUSHBUTTON, WS_TABSTOP |
CHECKBOX | 复选框 | Button | BS_CHECKBOX, WS_TABSTOP |
AUTOCHECKBOX | 自动复选框 | Button | BS_AUTOCHECKBOX, WS_TABSTOP |
STATE3 | 3态复选框 | Button | BS_3STATE, WS_TABSTOP |
AUTO2STATE | 自动3态复选框 | Button | BS_AUTO3STATE, WS_TABSTOP |
RADIOBUTTON | 单选框 | Button | BS_RADIOBUTTON, WS_TABSTOP |
AUTORADIOBUTTON | 自动单选框 | Button | BS_AUTORADIOBUTTON, WS_TABSTOP |
GROUPBOX | 分组框 | Button | BS_GROUPBOX |
SCROLLBAR | 滚动条 | ScrollBar | SBS_HORZ |
CTEXT | 居中文本 | Static | SS_CENTER, WS_GROUP |
LTEXT | 左对齐文本 | Static | SS_LEFT, WS_GROUP |
RTEXT | 右对齐文本 | Static | SS_RIGHT, WS_GROUP |
ICON | 图标框 | Static | SS_ICON |
EDITTEXT | 文本编辑 | Edit | ES_LEFT, WS_BORDER, WS_TABSTOP |
COMBOBOX | 组合框 | ComboBox | CBS_SIMPLE, WS_TABSTOP |
LISTBOX | 列表框 | ListBox | LBS_NOTIFY, WS_BORDER |
看下面的例子:
GROUPBOX “选项”, -1, 55, 5, 120, 100
PUSHBUTTON “退出”, IDCANCEL, 255, 115, 50, 14
这两条语句和下面的语句编译后产生的二进制资源文件是一模一样的:
CONTROL “选项”, -1, “Button”, BS_GROUPBOX | WS_TABSTOP, 55, 5, 120, 100
CONTROL “退出”, IDCANCEL, “Button”, BS_PUSHBUTTON | WS_TABSTOP, 255, 115, 50, 14
第一种语句的用法比第二种语句不但要直观许多,而且不必书写默认的窗口风格。
当用到的控件没有缩写语法时,那就必须用CONTROL定义了,下面的两句分别定义了一条横线和一个图片框,它们并没有缩写的用法:
CONTROL “”, -1, “Static”, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 60, 65, 110, 1
CONTROL BMP_ID, -1, “Static”, SS_BITMAP | WS_CHILD | WS_VISIBLE, 5, 5, 40, 95