列表框 列表框允许用户从多个对象中选择一项或多项,这些对象可以是文本、文件和位图等。当列表框的项不能全部显示出来时,可以用滚动条来滚动显示。 1. 基础知识 默认的列表框只允许用户单选,需要多选时,须把列表框的风格定义为 LBS_ MULTIPLESEL 和 LBS_EXTENDEDSEL 。列表框提供的其他风格取值可以控制列表框的外观和操作。例如是否按照列表框各项的名称排序,是否多行排列,是否有滚动条等。 风格取值 描述 LBS_EXTENDEDSEL 能通过Shift键或者鼠标进行多选 LBS_HASSTRINGS 可以用GetText函数得到列表框里选项的字符串 LBS_MULTICOLUMN 指定列表框以多列形式显示内容 LBS_MULTIPLESEL 用户可以选择多个项 LBS_NOINTEGRALHEIGHT 当应用程序创建列表框时,列表框的大小由系统指定 LBS_NOREDRAW 列表框不响应用户的修改,可以通过发送WM_REDRAW 来取消该设置 LBS_NOTIFY 让主窗口接收列表框的任何改变的消息 LBS_OWNERDRAWFIXED 主窗口负责列表框的重画,列表框里每项的高度相同 LBS_0WNERDRAWVARIABLE 主窗口负责列表框的重画,列表框里每项的高度可以变化 LBS_SORT 按各项名称的字母排序 LBS_STANDARD 等同于LBS_SORT和LBS_NOTIFY LBS_USETABSTOPS 允许用户使用Tab键在各项中切换 LBS_WANTKEYBOARDINPUT 输入焦点在列表框时,任何键盘输入都会向父窗口发送WM_VKEYTOITEM或者WM_CHARTOITEM消息 LBS_DISABLENOSCROLI 当列表框的项不够时,垂直滚动条禁活:没有该属性时,滚动条隐藏 当用户对列表框进行了操作时,就会向主窗口发送一条消息。列表框的消息类型比较简单,主要是单击、双击和选择等。同编辑框一样,列表框也会遇到内存不够的问题,所以消息类型中含有这一项。消息总是通过WM_COMMAND的形式发送给主窗口的。其中,wParam的低位字节表示列表框的标识符,高位字节表示消息的类型,lParam表示主窗口句柄。列表框的消息类型如表所示。 消息类型 描述 LB_DELETESTRING 删除指定的选项 LB_ADDFILE 向列表框里增加一个文件(包括目录) LB_FINDSTRING 在列表框里查找指定的项 LB_FINDSTRlNGEXACT 精确查找指定的项 LB_GETCOUNT 得到列表框里项的数目 LB_GETCURSEL 返回当前被选中选项的序号 LB_GETSEL 得到被选项的状态,如果出错,则返回零值 LB_GETSELCOUNT 得到被选中的个数 LB_GETTEXT 返回选中的文本,返回值为字符串长度 LB_GETTEXTLEN 返回字符串长度 LB_INITSTORAGE 向列表框增加项之前存储原来的内容 LB_INSERTSTRING 向列表框增加一项,但不重新排序 LB_ITEMFROMPOINT 返回离指定点最近项的序号 LB_RESETCONTENT 清除列表框里所有的项 LB_SELECTSTRING 寻找指定的项 LB_SELITEMRANGE 指定选择的范围 LB_SELITEMRANGEEX 选定或者删除指定的项 LB_SETCOLUMNWIDTH 设置列的宽度 LB_SETCOUNT 设置列表框里项的最大数目 LB_SETCURSEL 选中指定的项 LBN_DBLCLK 发送用户双击的消息 LBN_ERRSPACE 发送内存空间不够的消息 LBN_KILLFOCUS 当列表框失去焦点时发送该消息 LBN_SELCANCEL 当用户取消选择时发送该消息 LBN_SELCHANGE 当用户选择改变时发送该消息 LBN_SETFOCUS 当输入焦点转移到列表框时发送该消息 WM_CTLCOLORLISTBOX 在列表框重画时向父窗口发送该消息 WM_DELETEITEM 删除选项 WM_VKEYTOITEM 输入焦点在列表框里,用户按键时发送该消息 鼠标右键WM_CONTEXTMENU 消息就行了。wParam 是点击右键的窗口的句柄,lParam 是鼠标坐标。如果用户使用 SHIFT+F10 来响应菜单,那么 lParam 收到的坐标都是 -1。 LOWORD(wParam) 子窗口ID HIWORD(wParam) 通知码 Lparam 子窗口句柄 定义列 [1] 增加列需要用列的结构LVCOLUMN,定义如下: typedef struct _LVCOLUMN { UINT mask; //定义该列可使用的类型 int fmt; //定义列格式 int cx; //定义列宽度(以像素为单位) LPTSTR pszText; //列内容 int cchTextMax; //列内容最大长度 int iSubItem; //定义此列序号 #if (_WIN32_IE >= 0x0300) int iImage; //指向图像 int iOrder; //零基列偏移量。列偏移量是从左到右的顺序。例如0列在最左边。 #endif #if (_WIN32_WINNT >= 0x0600) int cxMin; //指定列宽最小值 int cxDefault; //默认列宽 int cxIdeal; //只读,作为列宽的理想宽度自动调整宽度大小 #endif } LVCOLUMN, *LPLVCOLUMN; //结构名称 使用方法为SendMessage(hwnd, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn) 还有LVM_GETCOLUMN LVM_SETCOLUMN LVM_DELETECOLUMN 改变项 [2] 改变项需要结构体LVITEM,定义如下: typedef struct { UINT mask; //设置成员标志,如格式等 int iItem; //项目索引 int iSubItem; //添加到的列序 UINT state; //指明项目状态,如图片,叠加图片 UINT stateMask; //指state成员的有效位 LPTSTR pszText; //项目内容 int cchTextMax; //项目最大长度 int iImage; //指向图片索引 LPARAM lParam; //特殊值,如果你用SORTITEM它就需要这个,或者别的特别的 #if (_WIN32_IE >= 0x0300) int iIndent; //图片宽度 #endif #if (_WIN32_WINNT >= 0x0501) int iGroupId; //指向所在的组id UINT cColumns; //需要展示的列数,最大为20 UINT puColumns; //返回这个项目所指向的列 #endif #if (_WIN32_WINNT >= 0x0600) int piColFmt; //返回列属性 int iGroup; //项目列 #endif } LVITEM, *LPLVITEM; 使用方法:SendMessage(hres, LVM_INSERTITEM, 0, (LPARAM)&item);