1.动态生成列表控件。
在资源页面里,点击列表控件,然后在需要放置列表的地方拖拉就可以生成一个列表,查看它的属性->样式,可以设置它的样式,例如图标,小图标,列表,报告,单个选择,自动排列,没有标签换行,编辑标签 等等。
这种方法是静态生成列表控件,程序运行时列表就已经生成了,如果我们需要动态生成列表控件,让列表在我需要他生成的时候才生成,就要用CListCtrl::Create函数。
BOOL
Create( DWORD
dwStyle
, const RECT&
rect
, CWnd*
pParentWnd
, UINT
nID
);
其中参数dwStyle用来确定列表控制的风格;rect用来确定列表控制的大小和位置;pParentWnd用来确定列表控制的父窗口,通常是一个对话框;nID用来确定列表控制的标识。其中列表控制的风格可以是下列值的组合:
LVS_ALIGNLEFT 用来确定表项的大小图标以左对齐方式显示;
LVS_ALIGNTOP 用来确定表项的大小图标以顶对齐方式显示;
LVS_AUTOARRANGE 用来确定表项的大小图标以自动排列方式显示;
LVS_EDITLABELS 设置表项文本可以编辑,父窗口必须设有LVN_ENDLABELEDIT风格;
LVS_ICON 用来确定大图标的显示方式;
LVS_LIST 用来确定列表方式显示;
LVS_NOCOLUMNHEADER 用来确定在详细资料方式时不显示列表头;
LVS_NOLABELWRAP 用来确定以单行方式显示图标的文本项;
LVS_NOSCROLL 用来屏蔽滚动条;
LVS_NOSORTHEADER 用来确定列表头不能用作按钮功能;
LVS_OWNERDRAWFIXED 在详细列表方式时允许自绘窗口;
LVS_REPORT 用来确定以详细资料即报告方式显示;
LVS_SHAREIMAGELISTS用来确定共享图像列表方式;
LVS_SHOWSELALWAYS 用来确定一直显示被选中表项方式;
LVS_SINGLESEL 用来确定在某一时刻只能有一项被选中;
LVS_SMALLICON 用来确定小图标显示方式;
LVS_SORTASCENDING 用来确定表项排序时是基于表项文本的升序方式;
LVS_SORTDESCENDING 用来确定表项排序时是基于表项文本的降序方式;
LVS_ALIGNTOP 用来确定表项的大小图标以顶对齐方式显示;
LVS_AUTOARRANGE 用来确定表项的大小图标以自动排列方式显示;
LVS_EDITLABELS 设置表项文本可以编辑,父窗口必须设有LVN_ENDLABELEDIT风格;
LVS_ICON 用来确定大图标的显示方式;
LVS_LIST 用来确定列表方式显示;
LVS_NOCOLUMNHEADER 用来确定在详细资料方式时不显示列表头;
LVS_NOLABELWRAP 用来确定以单行方式显示图标的文本项;
LVS_NOSCROLL 用来屏蔽滚动条;
LVS_NOSORTHEADER 用来确定列表头不能用作按钮功能;
LVS_OWNERDRAWFIXED 在详细列表方式时允许自绘窗口;
LVS_REPORT 用来确定以详细资料即报告方式显示;
LVS_SHAREIMAGELISTS用来确定共享图像列表方式;
LVS_SHOWSELALWAYS 用来确定一直显示被选中表项方式;
LVS_SINGLESEL 用来确定在某一时刻只能有一项被选中;
LVS_SMALLICON 用来确定小图标显示方式;
LVS_SORTASCENDING 用来确定表项排序时是基于表项文本的升序方式;
LVS_SORTDESCENDING 用来确定表项排序时是基于表项文本的降序方式;
以上的风格其实就是静态生成列表控件时 “属性->样式” 标签里的内容。如果列表控件创建完之后我们需要修改他的样式,就可以用GetWindowLong来获取CListCtrl已有的样式,然后用SetWindowLong来修改样式。
2.设置扩展样式。
除了上面的哪些基本样式,CListctrl还有更多的扩展样式,如果我们要添加或删除扩展样式,就不是像基本样式那样用SetWindowLong了,CListctrl提供了一个函数CListCtrl::SetExtendedStyle,这个函数可以添加或删除扩展样式,相应的要获得CListctrl的扩展样式,应该使用CListCtrl::GetExtendedStyle,而不是GetWindowLong。
DWORD SetExtendedStyle( DWORD
dwNewStyle
);
DWORD
dwNewStyle 就是你要设置的样式咯,可以是以下值的组合(抄别人的不知道完不完整):
CListCtrl控件的扩展样式
LVS_EX_GRIDLINES //绘制表格线
LVS_EX_SUBITEMIMAGES//子项目图标列表
LVS_EX_CHECKBOXES //带复选框
LVS_EX_TRACKSELECT //自动换行
LVS_EX_HEADERDRAGDROP//报表头可以拖拽
LVS_EX_FULLROWSELECT //选择整行
LVS_EX_ON ECLICKACTIVATE//单击激活
LVS_EX_TWOCLICKACTIVATE//双击激活
LVS_EX_FLATSB//扁平滚动条
LVS_EX_REGIONAL
LVS_EX_INFOTIP
LVS_EX_UNDERLINEHOT
LVS_EX_UNDERLINECOLD
LVS_EX_MULTIWORKAREAS//多工作区
LVS_EX_GRIDLINES //绘制表格线
LVS_EX_SUBITEMIMAGES//子项目图标列表
LVS_EX_CHECKBOXES //带复选框
LVS_EX_TRACKSELECT //自动换行
LVS_EX_HEADERDRAGDROP//报表头可以拖拽
LVS_EX_FULLROWSELECT //选择整行
LVS_EX_ON
LVS_EX_TWOCLICKACTIVATE//双击激活
LVS_EX_FLATSB//扁平滚动条
LVS_EX_REGIONAL
LVS_EX_INFOTIP
LVS_EX_UNDERLINEHOT
LVS_EX_UNDERLINECOLD
LVS_EX_MULTIWORKAREAS//多工作区
3.添加列 与 删除列
列表控件创建好之后,就要为他添加列了,使用CListCtrl::InsertColumn函数为它添加列。要删除一列,使用CListCtrl::DeleteColumn函数。
int InsertColumn( int
nCol
, LPCTSTR
lpszColumnHeading
, int
nFormat
= LVCFMT_LEFT, int
nWidth
= -1, int
nSubItem
= -1 );
iCol:为列的位置,从零开始
lpszColumnHeading:为显示的列名
nFormat:为显示对齐方式
nWidth:为显示宽度
nSubItem:为分配给该列的列索引。这个参数有什么作用至今不懂,希望懂的朋友告诉我。
lpszColumnHeading:为显示的列名
nFormat:为显示对齐方式
nWidth:为显示宽度
nSubItem:为分配给该列的列索引。这个参数有什么作用至今不懂,希望懂的朋友告诉我。
例如:
InsertColumn(3,"所在区域",LVCFMT_LEFT,60);
即添加一个名字为“所在区域”的列,名字靠左排列,列的长度为60,这个列是第四列(从0开始算)。
4.添加行 与 删除行。
添加行即是添加记录咯,一行就是一条记录。使用CListCtrl::InsertItem函数来添加行。要删除一行,使用CListCtrl::DeleteItem函数,注意,如果你删除的行不是最后一行,那么删除后下面的行会自动上移填补删除行的空间。要删除全部行,使用CListCtrl::DeleteAllItems。
int InsertItem( int
nItem
, LPCTSTR
lpszItem
);
nItem :行的索引,从0开始计算。
lpszItem
:行的名称,一般为0或者""(即不需要为行添加名称)。如果为他赋值一个字符串,实际效果是该字符串 会成为该行的第一列的内容。
例如 InsertItem( 5, 0)
即在行索引5的位置添加一行(即是第六行)。
5.设置某行某列的内容 与 获取某行某列的内容。
如果要设置某行某列的内容。使用CListCtrl::SetItemText函数。
BOOL SetItemText( int
nItem
, int
nSubItem
, LPTSTR
lpszText
);
nItem :行的索引,从0开始。
nSubItem :列的索引,从0开始。
lpszText :要填充的内容。
例如 SetItemText(6,3,"hello"); 即设置第7行,第4列的内容为“hello”。
相反地,如果我们要提取某行某列的内容,使用CListCtrl::GetItemText函数。
CString GetItemText( int
nItem
, int
nSubItem
) const;
nItem :行的索引,从0开始。
nSubItem :列的索引,从0开始。
例如 CString text; text=GetItemText(6,3); 提取第7行,第4列的内容并赋给text。
6.获取一列的属性和设置一列的属性。
nCol :列的索引,从0开始。
pColumn :指向LVCOLUMN结构体的指针。该LVCOLUMN结构体就是用来保存得到的列属性信息的。
LVCOLUMN结构体有一个成员变量 mask
,你必须为这个变量赋值,用来指定你要获取什么属性,譬如说你要获取某列的长度,你就必须为mask
赋值LVCF_WIDTH,如果你要获取某列的列名,就必须为mask
赋值LVCF_TEXT。从MSDN中还有这样的描述:If the
mask member specifies the
LVCF_TEXT value, the
pszText member must contain the address of the buffer that receives the item text and the
cchTextMax member must specify the size of the buffer.
意思是说如果你要获取的属性是列名,就必须为LVCOLUMN结构体的pszText
变量指定一个buf的地址,这个buf用来接收列名,还要为LVCOLUMN结构体的cchTextMax
变量指定这个buf的大小。
下面的例子表示要获取第3列的列名和列长度:
LVCOLUMN lvc;
lvc.mask=LVCF_WIDTH | LVCF_TEXT;
char name[20];
lvc.pszText=name;
lvc.cchTextMax=20;
m_listctrl.GetColumn(2,&lvc);
lvc.mask=LVCF_WIDTH | LVCF_TEXT;
char name[20];
lvc.pszText=name;
lvc.cchTextMax=20;
m_listctrl.GetColumn(2,&lvc);
成功获取属性信息的话长度就保存在LVCOLUMN lvc的cx变量里,列名就保存在char name[20]里,当然你也可以从LVCOLUMN lvc的pszText变量里得到列名,因为pszText变量保存了char name[20]的首地址。
如果要设置某列的属性,就要用CListCtrl::SetColumn函数。
参数意思和GetColumn
一样,而SetColumn
里的
pColumn 参数保存了你将要设置的属性。下面的例子表示把第四列的列长度设置为50,列名设置为“销量”:
LVCOLUMN lvc;
lvc.mask=LVCF_WIDTH | LVCF_TEXT; //同样的,你要设置什么属性,就要先给mask变量赋值响应的标志。
lvc.mask=LVCF_WIDTH | LVCF_TEXT; //同样的,你要设置什么属性,就要先给mask变量赋值响应的标志。
lvc.cx=50;
m_listctrl.SetColumn(3,&lvc);