WIN32汇编语言教程:第09章 通用控件 · 9.1 通用控件简介(1)
9.1.1 通用控件的分类
大部分的通用控件由Comctl32.dll模块提供,所以在使用之前要在源程序中包含相应的include和includelib语句:
include Comctl32.inc includelib Comctl32.lib
Comctl32.dll中提供的通用控件如表9.1所示。
表9.1 通用控件
控 件 名 称 | 预定义的窗口类 | 说明 | 特 殊 风 格 |
Animation Controls | SysAnimate32 | 动画 | ACS_ |
Header Controls | SysHeader32 | 标题栏 | HDS_ |
ListView Controls | SysListView32 | 列表视图 | LVS_ |
TreeView Controls | SysTreeView32 | 树型视图 | TVS_ |
Tab Controls | SysTabControl32 | 项目列表 | TCS_ |
Progress Bars | msctls_progress32 | 进度条 |
控 件 名 称 | 预定义的窗口类 | 说明 | 特 殊 风 格 | |
Status Windows | msctls_statusbar32 | 状态栏 | SBARS_ | |
HotKey Controls | msctls_hotkey32 | 热键 | ||
Trackbars | msctls_trackbar32 | 跟踪条 | TBS_ | |
Up-Down Controls | msctls_updown32 | 滚动条 | UDS_ | |
Toolbars | ToolbarWindow32 | 工具栏 | TBSTYLE_ | |
Tooltip Controls | Tooltips_class32 | 提示文本 | ||
ImageLists | 图像列表 | |||
PropertySheets | 属性表格 | |||
PropertySheetsPage | 属性页 | |||
DragList | 能处理拖放功能的列表框 |
在高版本的Comctl32.dll(IE4.0以上版本更新的Comctl32.dll文件)中,还包括了一些扩展的通用控件,这些扩展控件如表9.2所示。
表9.2 扩展通用控件
控 件 名 称 | 预定义的窗口类 | 说明 | 特 殊 风 格 |
Rebar Controls | ReBarWindow32 | IE风格工具栏 | RBS_ |
Date & Time Picker | SysDateTimePick32 | 日期时间 | DTS_ |
IP Address Picker | SysIPAddress32 | IP地址输入 | |
Pager Controls | SysPager | PGS_ | |
ComboBoxEx | ComboBoxEx32 | 扩展ComboBox | CBS_ |
Windows系统自身附带的软件中也大量使用通用控件,以图9.1中所示的“资源管理器”程序界面为例,窗口的上方使用标题栏控件,标题栏控件上显示的说明文字是提示文本控件,窗口下方使用状态栏控件;左边列出目录的地方是树型视图控件,右边列出文件的地方是列表视图控件,列表视图控件中的标题栏本身就使用另一个控件——标题栏控件。
其他的一些控件在操作系统中也随处可见,如跳格表控件通常在属性设置对话框中使用;拷贝大文件时的进度窗口中有个进度条控件。
除了这些控件之外,Richedit控件也是一个很常用的控件,Richedit控件是Edit控件的增强版本,包含了很完整的文本编辑功能,可以用来编辑带格式的rtf文件和不带格式的txt文件,由于该控件非常复杂,代码的规模比较大,单独一个Richedit控件的代码规模就和Comctl32.dll中全部代码的规模相当,所以Windows系统将Richedit控件单独放到另一个dll文件中,有关Richedit控件的情况将在9.4节中详细介绍。
图9.1 常见的通用控件
9.1.2 使用通用控件
1.库初始化
通用控件的数量非常多,平时把它们全部装入并注册是非常浪费内存的,所以在默认状态下Comctl32.dll并不会被装入内存,因此,在使用通用控件之前必须将通用控件库装入内存,专用函数InitCommonControls可以用来完成这个工作,调用这个函数的惟一目的是保证系统加载Comctl32.dll库文件。
当库文件被装入的时候,库的入口函数会注册所有的通用控件类,然后用户程序就可以使用这些预定义的类来创建各种类型的通用控件窗口,这就像创建其他的子窗口控件一样。InitCommonControls函数没有参数,也没有定义返回值,它的使用方法是:
invoke InitCommonControls
InitCommonControls函数仅注册表9.1中所列的通用控件类,并不注册表9.2中的扩展通用控件。如果需要使用扩展通用控件,那么需要使用InitCommonControlsEx函数来进行装入和注册的工作:
invoke InitCommonControlsEx,lpInitCtrls
lpInitCtrls参数指向一个INITCOMMONCONTROLSEX结构:
INITCOMMONCONTROLSEX STRUCT dwSize dd ? ;结构长度 dwICC dd ? ;需要初始化的类 INITCOMMONCONTROLSEX ENDS
结构中的dwICC字段指定了需要注册的扩展通用控件类,与InitCommonControls注册所有它支持的通用控件类不同,InitCommonControlsEx函数只注册dwICC字段指明的扩展通用控件类,字段可以是下面取值的组合:
● ICC_BAR_CLASSES——注册工具栏、状态栏、Trackbar和Tooltip类。
● ICC_COOL_CLASSES——注册Rebar类。
● ICC_DATE_CLASSES——注册Date and Time Picker类。
● ICC_HOTKEY_CLASS——注册Hot Key类。
● ICC_INTERNET_CLASSES——注册IP Address Picker类。
● ICC_LISTVIEW_CLASSES——注册ListView和Header类。
● ICC_PAGESCROLLER_CLASS——注册Pager类。
● ICC_PROGRESS_CLASS——注册Progress Bar类。
● ICC_TAB_CLASSES——注册Tab和Tooltip类。
● ICC_TREEVIEW_CLASSES——注册TreeView和Tooltip类。
● ICC_UPDOWN_CLASS——注册Up-Down类。
● ICC_USEREX_CLASSES——注册ComboBoxEx类。
● ICC_WIN95_CLASSES——注册InitCommonControls函数注册的所有类。
InitCommonControlsEx函数是InitCommonControls函数的扩充,使用它也可以注册InitCommonControls函数能够注册的所有类(也可以仅注册其中的一部分),如果只用到通用控件,两个初始化函数都可以使用,但若用到扩展通用控件,那就只能使用InitCommonControlsEx函数来进行初始化了。
创建通用控件的代码一般放在主窗口的WM_CREATE消息中,所以InitCommonControls和InitCommonControlsEx函数的调用需要在此之前完成,一般在程序一开始的地方就调用它们。