WIN32汇编语言教程:第05章 使用资源 · 5.4 对话框(11)
下面结合源程序来说明列表框的使用。当列表框有LBS_NOTIFY风格的时候,用户有所动作时列表框会向父窗口发送WM_COMMAND消息,同时在wParam的高16位中指定通知码,列表框的通知码种类很少,基本上就是以下几种:
● LBN_DBLCLK 用户双击了一个项目。
● LBN_ERRSPACE 插入项目时无法申请到足够的内存。
● LBN_KILLFOCUS 输入焦点被切换到其他控件中,列表框丢失了焦点。
● LBN_SELCANCEL 用户撤销了一个选择。
● LBN_SELCHANGE 选定状态改变。
● LBN_SETFOCUS 列表框得到输入焦点。
我们最关心的是LBN_DBLCLK和LBN_SELCHANGE通知码,在单选列表框中,如果程序用双击来选择项目,那么就要处理LBN_DBLCLK通知,例子程序中当用户双击IDC_LISTBOX1时弹出一个消息框,读者可以查看其使用方法。在多选列表框中,由于用户可能选择了多个项目,所以一般不用双击的方法选定;如果收到LBN_SELCHANGE通知的话,可以得知用户有一个选择动作,在这里可以进行相应的操作。
列表框通知父窗口是通过发送WM_COMMAND消息,而程序控制列表框的时候是通过向列表框发送消息来完成的,常用的列表框消息如表5.8所示。
表5.8 列表框消息
消息 | wParam | lParam | 说明 |
LB_ADDSTRING | 0 | 字符串地址 | 添加一个项目,返回加入后的索引 |
LB_DELETESTRING | 位置索引 | 0 | 删除一个项目,返回剩余的项数 |
LB_FINDSTRING | 开始索引 | 字符串地址 | 查找以字符串开头的项目,找到则返回位置索引,未找到则返回LB_ERR |
LB_FINDSTRINGEXACT | 开始索引 | 字符串地址 | 精确查找一个项目,返回值同上 |
LB_GETANCHORINDEX | 0 | 0 | 返回多选列表框多选时的起始位置 |
LB_GETCARETINDEX | 0 | 0 | 多选列表框中的当前焦点项目位置 |
LB_GETCOUNT | 0 | 0 | 返回列表框中的项目总数 |
LB_GETCURSEL | 0 | 0 | 返回单选列表框当前选中的项目 |
LB_GETSEL | 位置索引 | 0 | 检测指定项目的选中状态,返回非0为选中,返回0为未选中 |
LB_GETSELCOUNT | 0 | 0 | 返回多选列表框选中项目的总数 |
LB_GETSELITEMS | 最大项数 | 缓冲区地址 | 返回多选列表框的选中项目索引列表到缓冲区中 |
LB_GETTEXT | 位置索引 | 缓冲区地址 | 返回某个项目的字符串 |
LB_GETTEXTLEN | 位置索引 | 0 | 返回某个项目的字符串长度 |
LB_GETTOPINDEX | 0 | 0 | 返回当前可见的第一个项目位置 |
LB_INSERTSTRING | 插入位置 | 字符串地址 | 在指定位置插入一个项目 |
LB_RESETCONTENT | 0 | 0 | 删除所有项目 |
LB_SELECTSTRING | 开始位置 | 字符串地址 | 将以指定字符串开头的项目选中 |
LB_SELITEMRANGE | 选择状态 | 范围 | 在多选框中将一个范围选中或清除 |
LB_SETCURSEL | 位置索引 | 0 | 在单选列表框中选中一个项目 |
LB_SETSEL | 选择状态 | 位置索引 | 在多选框中将一个项目选中或清除 |
LB_SETTOPINDEX | 位置索引 | 0 | 滚动显示到指定的项目 |
LB_DIR | 属性 | 文件通配符 | 搜索目录并将符合文件通配符的文件名加入到列表框中 |
这些消息中LB_DIR是个比较有趣的消息,它可以将指定目录中的文件名自动列出来并加入列表框中,如例子中用*.*将当前目录的全部文件名加到列表框中。LB_DIR消息中wParam参数可以指定的属性可以是以下值的组合:
DDL_ARCHIVE 加入归档属性的文件。 DDL_DIRECTORY 加入目录。 DDL_DRIVES 加入驱动器名。 DDL_HIDDEN 包含隐含文件。 DDL_READONLY 包含只读文件。 DDL_READWRITE 包含可读写的文件。 DDL_SYSTEM 包含系统文件。
在列表框中初始化时加入项目可以使用LB_ADDSTRING和LB_INSERTSTRING消息,删除项目可以用LB_DELETESTRING消息,删除全部项目用LB_RESETCONTENT消息。
对于单选列表框,要获取选中项目可以发送LB_GETCURSEL消息,要得到这个项目的字符串需要再用索引值通过LB_GETTEXT消息获取,读者可以查看例子中处理LBN_DBLCLK通知码的部分代码。
对于多选列表框,需要用LB_GETSELITEMS消息获取全部选中项目,这个消息返回的是一个列表,所有选中项目的索引按顺序排列返回到缓冲区中,所以在例子中处理“查看”按钮消息(IDOK)的时候,程序先发送LB_GETSELCOUNT消息得到选中的项目数,以便在下面用一个循环获取所有的项目,得到项目数后,再用LB_GETSELITEMS将选中项目的索引取到@szBuffer中,接下来进入一个循环,循环的次数就是LB_GETSELCOUNT得到的数值,在循环中,程序从@szBuffer中将索引值逐个取出并用LB_GETTEXT消息获取每一项的字符串,最后用一个MessageBox显示出来。
上页:第05章 使用资源 · 5.4 对话框(10) 下页:第05章 使用资源 · 5.5 字符串资源/5.6 版本信息资源(1)