WIN32汇编语言教程:第05章 使用资源 · 5.4 对话框(9)

表5.5 组合框的消息

消息WparamlParam说明
CB_ADDSTRING0字符串地址把一个字符串添加到列表中
CB_INSERTSTRING位置索引字符串地址把一个字符串插入到列表中
CB_FINDSTRING开始查找的位置索引查找的字符串在列表中查找以lParam字符串开头的项,找到则返回位置索引,未找到则返回CB_ERR
CB_FINDSTRINGEXACT位置索引查找的字符串精确查找字符串
CB_DELETESTRING位置索引0删除一个列表项
CB_RESETCONTENT00删除所有的列表项

 

消息WparamlParam说明
CB_GETLBTEXT位置索引缓冲区地址获取指定列表项的字符串,缓冲区必须足够大
CB_GETLBTEXTLEN位置索引0获取指定列表项的字符串长度
CB_GETCOUNT00获取列表项的总项数
CB_SETCURSEL位置索引0选中一个列表项,并将列表项中的文字拷贝到编辑控件中
CB_SELECTSTRING开始查找的位置索引字符串地址查找以lParam指定的字符串开始的列表项,如果找到则选中它并将字符串拷贝到编辑控件中
CB_GETCURSEL00获取当前选中的位置索引,没有选中的项目则返回CB_ERR
CB_SHOWDROPDOWN状态0打开(状态为TRUE)或收起(状态为FALSE)下拉列表
CB_GETDROPPEDSTATE00检测列表的当前下拉状态,返回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如下所示:

上页:第05章 使用资源 · 5.4 对话框(8) 下页:第05章 使用资源 · 5.4 对话框(10)

第05章 使用资源

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号