ListView控件是个非常好的控件,当需要在程序中处理大量的表格或条目信息时,ListView控件无疑是首选~~~
ListView的创建
创建之前,需要加入链接库和头文件
#include"commctrl.h"
#pragma comment (lib,"comctl32.lib")
这个很简单当然是GreatWindow函数了,最要指定窗口类为WS_LISTVIEW即可,要使用这个窗口类必须要使用InitCommonControl函数加载动态运行库
在创建LIstView的时候需要指定ListView的风格和视图,这个控件有四种风格:Icon View,Small Icon View,List View,ReportView,
—下面依次:图标视图—小图标视图——列表视图——报表视图
(不同的视图有不同的效果,这里仅对ListView进行讲解)
在CreateWindow中窗口风格中使用 LVS_REPORT 就指定了列表视图,然后就是设置其他风格,比如说: LVS_SINGLESEL:选择的时候选中一行
还有其他诸如: LVS_AUTOARRANGE / LVS_NOCOLUMNHEADER / LVS_NOSCROLL / LVS_SHOWSELALWAYS
(具体参见MSDN)
LIstView的使用:
1.LIstView创建好了之后就是设置他的某些特性(有些特性没法通过指定窗口风格设置,所以还要编程设置)
设置特性就是通过SendMessage发送消息给控件的句柄
例如
<pre name="code" class="cpp">SendMessage(hWndListView, WM_SETFONT,(WPARAM)hFont1, 0); //设置子控件的字体,属性,颜色
SendMessage(hWndListView,LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDR| LVS_EX_GRIDLINES);
该控件有许多扩展风格,可以通过SendMessage发送LVW_SETEXTENDEDLISTVIEWSTYLE来设置和LVM_GETTEXTEDEDLISTVIEWSTYLE来获取
扩展风格有许多使用的用途,比如说:LVS_EX_GEIDLINES表示显示网格线,还有LVS_EX_BOXES表示显示勾选框
2.属性设置好之后就是添加表头,表头显示了一个表格的各项信息,表头是通过一个结果结构体:LVCOLUMN来定义的
<span style="font-size:18px;">typedef struct_LVCOLUMN {
UINT mask; //标记属性
int fmt; //对齐列头和子项的文本列中。 .在最左边的列对齐总是LVCFMT_LEFT,它不能改变的
int cx; //列宽
LPTSTR pszText; //列标题
int cchTextMax; //标题的大小
int iSubItem; //与列关联的子项的索引值
#if (_WIN32_IE >=0x0300)
int iImage; //从零开始的索引图像在图像列表
int iOrder; //零基列偏移
#endif
} LVCOLUMN, FAR*LPLVCOLUMN;</span>
表头可以通过这个结构来定义,然后通过SendMessage(hwnd, LVM_INSERTCOLUMN,WPARAM(pos), LPARAM(&ColInfo));来添加
其中ColInfor表示一个LVCOLUM类型的变量,pos表示新添加列的的位置下标
最方便的办法是建立一个函数,以下是添加在LIstView里添加文本的函数:
<span style="font-size:18px;">void in_it(HWNDhwnd,int iSubItem,int cx,char *text,int cchTextMax,int pos)
{
LVCOLUMN ColInfo1 = {0};
ColInfo1.mask = LVCF_TEXT | LVCF_WIDTH |LVCF_FMT;
ColInfo1.iSubItem = iSubItem;
ColInfo1.fmt = LVCFMT_CENTER;
ColInfo1.cx = cx;
ColInfo1.pszText=text;
ColInfo1.cchTextMax = cchTextMax;
SendMessage(hwnd, LVM_INSERTCOLUMN,WPARAM(pos), LPARAM(&ColInfo1));
}</span>
3.表头建立好后就该往里添加数据了,数据的添加同样需要一个结构:LVITEM
这个结构成员比较多,这里不一一列举,具体参见MSDN,为添加方便,可以写一个函数(仅可添加文本)
<span style="font-size:18px;">void set_data(HWNDhwnd,char *text,int row,int colum) //text为所添加的文本,row为所要加入的行,colum为说要加入的列
{
LVITEM item;
item.mask=LVIF_TEXT;
item.pszText=text;
item.iItem=row;
item.iSubItem=colum;
if(colm==0)
SendMessage(hwnd, LVM_INSERTITEM,0, LPARAM(&item));
else
SendMessage(hwnd, LVM_SETITEM, 0,LPARAM(&item));
}</span>