最近学习的是WIN32控件ListView的使用,以下是个人的一点心得。
参考链接参考链接
ListView控件,在直观上个人认为就是表格的意思。与表格一样,ListView也有表头,表头有几个项,下面的内容行也有几个项。
使用列表控制的步骤如下:
调用CreateWindowEx函数来创建一个列表控件,指定它的类名为SysListView32。您还可以在此处指定控件初次显示时的方式。
创建和初始化用在列表控件中显示项目的图象列表(如果存在)。
向列表控件中插入列,如果显示的方式是报告方式这一步是必须的。
向控件中插入项目和自项目。
ListView的创建
创建ListView的函数是createWindow()函数,其中窗口类别参数使用 WC_LISTVIEW ,该参数定义在头文件 CommCtrl.h 中。
示例代码:
HWND hListview;
hListview = CreateWindowEx(0, TEXT("SysListView32"),
TEXT("我是一个list表"),
WS_VISIBLE | WS_CHILD | WS_BORDER |LVS_REPORT |LVS_SHOWSELALWAYS,//样式
0, 0,//坐标
350, 100, //大小
hwnd,
NULL,
hInst,
NULL);
ListView控件。
为了使用ListView控件,我们需要初始化公共控件库,我们需要在程序刚刚启动时调用InitCommonControls() 函数,如果发生链接错误,说明我们没有链接拥有该函数的库文件。
它们对应的头和库 DLL分别为 #include <commctrl.h> comctl32.lib comctl32.dll
为了使用这个控件 我们就需要知道它的窗口类,利用Spy++等文件可以找到指定进程窗口的窗口类,而一个ListView控件也是一个子窗口,所以我们可以得到它的类名为syslistview32,其他的控件,我们只需要按照同样的道理来得到类名即可。
有了类名还不够,我们还需要知道每种控件的风格,比如listView控件有以下的风格LVS_REPORT | LVS_SHOWSELALWAYS, 它表示要产生报表和总是显示。为了得到控件的风格,我们可以通过MSDN中MFC中的ListView风格来作参考。有了窗口类和风格,我们利用CreateWindow就可以创建并得到
这个控件的句柄了。有了句柄,我们就可以随便控制了,具体要怎么看你自己的了。
ListView的操作
此外为了向ListView内插入项和列,我们需要两个结构体。
LVITEM和LVCOLUMN
(1)添加分栏,即为表头
LVCOLUMNW 结构(commctrl.h)
typedef struct _LVCOLUMN {
UINT mask;
int fmt;
int cx;
LPTSTR pszText;
int cchTextMax;
int iSubItem;
#if (_WIN32_IE >= 0x0300)
int iImage;
int iOrder;
#endif
} LVCOLUMN, *LPLVCOLUMN;
参数:
Field name | Meanings |
---|---|
imask | 一组标志位标明该结构体中那些成员变量中的值有效。它的意义和上面我们提到的LV_COLUMN型结构体中向对应的成员变量基本相同。更详细的信息,可以查询WIN32 API 手册。 |
iItem | 该结构体代表的项目的索引号。索引号是从0开始编号的。该值和表单的“行”类似。 |
iSubItem | 和上一个成员变量指定的项目相连的子项目的索引号。您可以把它当作表单的“列”。譬如您想要把一个项目插入到新创建的列表视图控件,iItem的 值应为0(因为该项目是第一个项目),iSubItem的值也应当为0(我们想把该项目插到第一列)。如果你想指定一个子项目和该项目相连,iItem中 应该是您想要相连的项目的索引号,iSubItem的值应当是大于0的值,具体的值取决于您想把该子项目插在那一列。如果你的列表视图控件一共有4列的 化,第一列包含了项目,其余3列是留给子项目的。如果您想把子项目插在第四列,应当指定该值为3。 |
state | 该成员变量包含的标志位反应了项目的状态。状态的改变可能是由用户的操作引起的或是程序改变的。这些状态包括:是否有焦点/高亮度显示/被选中(由于被剪切)/被选中等。另外还包括,以1为基数的索引用来代表是否处使用重叠/状态图标。 |
stateMask | 由于上面的成员变量包含状态标志位、重叠的位图索引号、和状态位图的索引号,我们需要告诉WINDOWS我们到底需要设定或查询那一个值。该成员变量就是用来做这项工作的。 |
pszText | 当我们想设定项目的属性时,它包含项目名称的ASCII码的字符串的地址。当查询项目的属性时,该成员变量将用来接收查询返回的项目的名称。 |
cchTextMax | 仅当您用来查询项目的属性时才需要使用该值,这时它包含上一个成员变量的大小。 |
iImage | 图标在列表视图中的图象链表中的索引号。 |
lParam | 用户定义的值,当您给项目排序时使用。当您告诉列表视图对项目排序时,列表视图将成对地比较项目。 它将会把两个项目的lParam的值传给您,这样您就可以进行比较先列出那一个了。如果您现在还不太明白的话,没有系,我们稍后还要讲关于排序的问题。 |
控件通过SendMessage来发送消息来控制,常用的消息有:
SendMessage(hButton, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);
Field name | |
---|---|
LVM_INSERTCOLUMN | 加入列,wParam 为整型,指定列号,lParam 为指向LV_COLUMN结构的指针 |
LVM_SETCOLUMN | 设置列,参数同上 |
LVM_INSERTITEM | 加入项目或子项目,wParam 为0,lParam 为指向LV_ITEM结构的指针 |
LVM_SETITEM | 设置项目或子项目,参数同上 |
LVM_GETITEM | 取得项目或子项目,参数同上 |
LVM_GETNEXTITEM | 取得下一个项目或子项目,可以用来取得光标选择的项目 |
LVM_DELETEITEM | 删除项目或子项目,wParam 为整型,指定项目索引号,lParam 为0 |
LVM_DELETEALLITEMS | 删除所有项目,wParam 和 lParam 均为0 |
LVM_SETTEXTCOLOR | 设置文字颜色,wParam 为0,lParam 为颜色的RGB值 |
LVM_SETTEXTBKCOLOR | 设置文字背景色,参数同上 |
LVM_SETBKCOLOR | 设置背景色,参数同上 |
添加分栏需要使用到LVCOLUMN 结构体,示例:
LV_COLUMN lvc;//LVCOLUMN结构体,定义listview的列属性
lvc.mask = LVCF_TEXT | LVCF_WIDTH| LVCF_FMT;//指定哪些成员包含有效信息的变量。该成员可以是零
lvc.fmt = LVCFMT_CENTER; //列标题与列中子项文本的对齐方式。最左边一列的对齐方式始终是 LVCFMT_LEFT;
lvc.pszText = TEXT("姓名");//列的名称,如果正在设置列信息,则此成员是包含列标题文本的以空字符结尾的字符串的地址
lvc.cx = 80;//设置列的宽度
SendMessage(hListview, LVM_INSERTCOLUMN, 0, (long)&lvc); //LVM_INSERTCOLUMN表示添加列表示添加列,给第1列添加标体
(2)添加项,即行
添加项需要使用到LVITEM 结构体,示例:
typedef struct _LVITEM {
UINT mask;
int iItem;
int iSubItem;
UINT state;
UINT stateMask;
LPTSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
#if (_WIN32_IE >= 0x0300)
int iIndent;
#endif
#if (_WIN32_IE >= 0x560)
int iGroupId;
UINT cColumns; // tile view columns
PUINT puColumns;
#endif
有了这两个结构体,我们就可以利用SendMessage来给ListView控件发送消息来为它添加项和列。
我们分别通过下面两个消息来添加项和列。
SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
SendMessage(hButton, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);
LVM_INSERTITEM表示添加项
LVM_INSERTCOLUMN表示添加列。
为了更好的查找关于ListView的消息,我们只需要在网上或MSDN 里查找 LVM_XXXXXX 就