列表框
  列表框允许用户从多个对象中选择一项或多项,这些对象可以是文本、文件和位图等。当列表框的项不能全部显示出来时,可以用滚动条来滚动显示。
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);