WIN32汇编语言教程:第05章 使用资源 · 5.4 对话框(9)
表5.5 组合框的消息
消息 | Wparam | lParam | 说明 |
CB_ADDSTRING | 0 | 字符串地址 | 把一个字符串添加到列表中 |
CB_INSERTSTRING | 位置索引 | 字符串地址 | 把一个字符串插入到列表中 |
CB_FINDSTRING | 开始查找的位置索引 | 查找的字符串 | 在列表中查找以lParam字符串开头的项,找到则返回位置索引,未找到则返回CB_ERR |
CB_FINDSTRINGEXACT | 位置索引 | 查找的字符串 | 精确查找字符串 |
CB_DELETESTRING | 位置索引 | 0 | 删除一个列表项 |
CB_RESETCONTENT | 0 | 0 | 删除所有的列表项 |
消息 | Wparam | lParam | 说明 |
CB_GETLBTEXT | 位置索引 | 缓冲区地址 | 获取指定列表项的字符串,缓冲区必须足够大 |
CB_GETLBTEXTLEN | 位置索引 | 0 | 获取指定列表项的字符串长度 |
CB_GETCOUNT | 0 | 0 | 获取列表项的总项数 |
CB_SETCURSEL | 位置索引 | 0 | 选中一个列表项,并将列表项中的文字拷贝到编辑控件中 |
CB_SELECTSTRING | 开始查找的位置索引 | 字符串地址 | 查找以lParam指定的字符串开始的列表项,如果找到则选中它并将字符串拷贝到编辑控件中 |
CB_GETCURSEL | 0 | 0 | 获取当前选中的位置索引,没有选中的项目则返回CB_ERR |
CB_SHOWDROPDOWN | 状态 | 0 | 打开(状态为TRUE)或收起(状态为FALSE)下拉列表 |
CB_GETDROPPEDSTATE | 0 | 0 | 检测列表的当前下拉状态,返回TRUE表示拉下,FALSE表示收起 |
当用户在组合框中进行选择操作时,Windows向对话框过程发送WM_COMMAND消息,消息中wParam参数的低16位是组合框ID,高16位是通知码,用来表示用户的操作,通知码的定义如表5.6所示。
表5.6 用户操作组合框后的通知码
通 知 码 | 说明 |
CBN_SELCHANGE | 用户将要选择一个项目(鼠标移动到了这个项目上) |
CBN_CLOSEUP | 下拉列表关闭(可能是选择完成也可能是取消选择) |
CBN_SELENDOK | 用户完成选择项目 |
CBN_SELENDCANCEL | 用户取消选择(鼠标移动到了某个项目上,但并没有按下而是点击了其他控件,或按动了Esc键) |
CBN_DBLCLK | 在CBS_SIMPLE的组合框中双击了一个列表项 |
CBN_DROPDOWN | 用户打开了下拉框(按动了编辑框边的下拉按钮) |
如果想在用户选择了一个项目后做相应的动作,最好的办法就是处理CBN_SELENDOK通知码,因为这才意味着用户真正完成了一个选择动作,例子程序中就是这样处理的:
.elseif ax == IDC_TITLETEXT ;在WM_COMMAND消息中 shr eax,16 .if ax == CBN_SELENDOK invoke SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_GETCURSEL,0,0 ;根据返回的eax值做相应动作... .endif
以上的操作都是针对下拉列表部分的,另外也有很多消息是针对组合框中的编辑控件的,对组合框的窗口句柄发送WM_GETTEXT和WM_SETTEXT,操作的对象就是组合框的编辑控件;如果要限制编辑控件中文本的最大输入长度,可以发送CB_LIMITTEXT消息,这时候wParam参数指定最大数量;当用户在编辑框中编辑文本的时候,Windows在用户输入之后、字符显示之前会发送CBN_EDITUPDATE通知码;当字符在编辑框中显示以后,又会发送CBN_EDITCHANGE通知码。所以在处理WM_COMMAND消息时通过处理这两个通知码可以检测到用户的输入操作。
组合框是子窗口控件中比较复杂的一种,这里介绍的是常用的消息和通知码,另外还有少量不常用的内容,读者可以自行查看相关的资料。
8. 使用列表框
列表框提供一个可供用户选择的列表,用户可以一次选择一个项目,也可以同时选中多个项目,本节用一个单独的例子程序来说明列表框的用法,所有的源程序可以在所附光盘的Chapter05\Listbox目录中找到,包括Listbox.rc文件和Listbox.asm文件,其中Listbox.rc文件定义如下:
//################################################################## #include <resource.h> //################################################################## #define ICO_MAIN Ox1000 //图标 #define DLG_MAIN 1 #define IDC_LISTBOX1 101 #define IDC_LISTBOX2 102 #define IDC_SEL1 103 #define IDC_RESET 104 //################################################################## ICO_MAIN ICON "Main.ico" //################################################################## DLG_MAIN DIALOG 163, 160, 190, 108 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "列表框控件示例" FONT 9, "宋体" { LISTBOX IDC_LISTBOX1, 6, 5, 55, 86, LBS_STANDARD LISTBOX IDC_LISTBOX2, 68, 5, 115, 86, LBS_STANDARD | LBS_MULTIPLESEL LTEXT "", IDC_SEL1, 6, 93, 55, 8 PUSHBUTTON "复位(&R)", IDC_RESET, 89, 90, 45, 14 DEFPUSHBUTTON "查看(&S)", IDOK, 139, 90, 45, 14, WS_DISABLED } //##################################################################
程序运行的效果如图5.9所示。程序中总共定义了两个列表框。左边列表框为IDC_LISTBOX1,这是一个单选的列表框,选择一个项目的时候下面的文本中会显示出选择的项目,双击某个项目的时候会弹出图中标有②的消息框。右边的列表框是IDC_LISTBOX2,是一个多选的列表框,选择完毕后可以用“查看”按钮弹出图中标有①的消息框,消息框中显示了所有选中的项目。读者也可以按下“复位”按钮清除列表框的选择。
图5.9 列表框例子的运行结果
定义列表框时可以使用的风格如表5.7所示。
表5.7 列表框可以使用的风格
风 格 | 说明 |
LBS_DISABLENOSCROLL | 在不需滚动的时候也显示垂直滚动条 |
LBS_EXTENDEDSEL | 在多选列表框中允许按住Shift键同时选中一个范围 |
LBS_MULTIPLESEL | 允许多选,如果不定义的话则是单选列表框 |
LBS_NOSEL | 列表框项目只能查看不能选择 |
LBS_NOTIFY | 用户点击或双击项目时向父窗口发送WM_COMMAND消息 |
LBS_SORT | 自动按字母顺序排序插入的项目 |
LBS_USETABSTOPS | 列表框项目的文本中允许将Tab字符的位置展开 |
LBS_STANDARD | 组合LBS_NOTIFY,LBS_SORT,WS_VSCROLL和WS_BORDER |
一般单选列表框只需定义LBS_STANDARD就可以了。
汇编源代码Listbox.asm如下所示: