最近做了一个涉及数据库的软件,很自然地会遇到需要显示一个列表的情况,这时候就要用到列表控件,所以把列表控件CListCtrl类的用法整理整理。
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 用来确定表项排序时是基于表项文本的降序方式;
以上的风格其实就是静态生成列表控件时 “属性->样式” 标签里的内容。如果列表控件创建完之后我们需要修改他的样式,就可以用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_ONECLICKACTIVATE//单击激活
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, intnSubItem = -1 );
iCol:为列的位置,从零开始
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.获取一列的属性和设置一列的属性。
如果要获取某列的属性,譬如说某列的列名、列的长度。就要用CListCtrl::GetColumn函数。
BOOL GetColumn( int nCol, LVCOLUMN* pColumn ) const;
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);
成功获取属性信息的话长度就保存在LVCOLUMN lvc的cx变量里,列名就保存在char name[20]里,当然你也可以从LVCOLUMN lvc的pszText变量里得到列名,因为pszText变量保存了char name[20]的首地址。
如果要设置某列的属性,就要用CListCtrl::SetColumn函数。
BOOL SetColumn( int nCol, const LVCOLUMN* pColumn );
参数意思和GetColumn一样,而SetColumn里的pColumn 参数保存了你将要设置的属性。下面的例子表示把第四列的列长度设置为50,列名设置为“销量”:
LVCOLUMN lvc;
lvc.mask=LVCF_WIDTH | LVCF_TEXT; //同样的,你要设置什么属性,就要先给mask变量赋值响应的标志。
lvc.pszText="销量";
lvc.cx=50;
m_listctrl.SetColumn(3,&lvc);