您的位置:首页 > 其它

CListCtrl控件(1)基本操作

2010-04-28 16:46 295 查看
最近做了一个涉及数据库的软件,很自然地会遇到需要显示一个列表的情况,这时候就要用到列表控件,所以把列表控件CListCtrl类的用法整理整理。 1.动态生成列表控件。在资源页面里,点击列表控件,然后在需要放置列表的地方拖拉就可以生成一个列表,查看它的属性->样式,可以设置它的样式,例如图标,小图标,列表,报告,单个选择,自动排列,没有标签换行,编辑标签 等等。这种方法是静态生成列表控件,程序运行时列表就已经生成了,如果我们需要动态生成列表控件,让列表在我需要他生成的时候才生成,就要用CListCtrl::Create函数。BOOL Create([/b] DWORD[/b] dwStyle[/i],[/b] const[/b] RECT&[/b] rect[/i],[/b] CWnd*[/b] pParentWnd[/i],[/b] UINT[/b] nID[/i] );[/b]其中参数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 [/i]);[/b]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 [/b]nCol[/i], LPCTSTR [/b]lpszColumnHeading[/i], int [/b]nFormat[/i] = LVCFMT_LEFT, int [/b]nWidth[/i] = -1, int[/b]nSubItem[/i] = -1 );[/b]iCol:为列的位置,从零开始
lpszColumnHeading:为显示的列名
nFormat:为显示对齐方式
nWidth:为显示宽度
nSubItem:为分配给该列的列索引。这个参数有什么作用至今不懂,希望懂的朋友告诉我。例如:InsertColumn(3,"所在区域",LVCFMT_LEFT,60);即添加一个名字为“所在区域”的列,名字靠左排列,列的长度为60,这个列是第四列(从0开始算)。 4.添加行 与 删除行。添加行即是添加记录咯,一行就是一条记录。使用CListCtrl::InsertItem函数来添加行。要删除一行,使用CListCtrl::DeleteItem函数,注意,如果你删除的行不是最后一行,那么删除后下面的行会自动上移填补删除行的空间。要删除全部行,使用CListCtrl::DeleteAllItems。int InsertItem( int nItem[/i], LPCTSTR [/b]lpszItem[/i] );[/b]nItem :行的索引,从0开始计算。lpszItem :行的名称,一般为0或者""(即不需要为行添加名称)。如果为他赋值一个字符串,实际效果是该字符串 会成为该行的第一列的内容。例如 InsertItem( 5, 0) 即在行索引5的位置添加一行(即是第六行)。 5.设置某行某列的内容 与 获取某行某列的内容。如果要设置某行某列的内容。使用CListCtrl::SetItemText函数。BOOL[/b] SetItemText([/b] int[/b] nItem[/i],[/b] int[/b] nSubItem[/i],[/b] LPTSTR[/b] lpszText[/i] );[/b]nItem :行的索引,从0开始。nSubItem :列的索引,从0开始。lpszText :要填充的内容。例如 SetItemText(6,3,"hello"); 即设置第7行,第4列的内容为“hello”。 相反地,如果我们要提取某行某列的内容,使用CListCtrl::GetItemText函数。CString GetItemText( int [/b]nItem[/i], int [/b]nSubItem[/i] ) const;[/b]nItem :行的索引,从0开始。nSubItem :列的索引,从0开始。例如 CString text; text=GetItemText(6,3); 提取第7行,第4列的内容并赋给text。 6.获取一列的属性和设置一列的属性。如果要获取某列的属性,譬如说某列的列名、列的长度。就要用CListCtrl::GetColumn函数。BOOL[/b] GetColumn([/b] int[/b] nCol[/i],[/b] LVCOLUMN*[/b] pColumn[/i] ) const;[/b] nCol :列的索引,从0开始。 pColumn :指向LVCOLUMN结构体的指针。该LVCOLUMN结构体就是用来保存得到的列属性信息的。LVCOLUMN结构体有一个成员变量 mask ,你必须为这个变量赋值,用来指定你要获取什么属性,譬如说你要获取某列的长度,你就必须为mask赋值LVCF_WIDTH,如果你要获取某列的列名,就必须为mask赋值LVCF_TEXT。从MSDN中还有这样的描述:If the mask[/b] member specifies the LVCF_TEXT[/b] value, the pszText[/b] member must contain the address of the buffer that receives the item text and the cchTextMax[/b] 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[/b] SetColumn([/b] int[/b] nCol[/i],[/b] const[/b] LVCOLUMN*[/b] pColumn[/i] );[/b]参数意思和GetColumn一样,而SetColumn里的pColumn 参数保存了你将要设置的属性。下面的例子表示把第四列的列长度设置为50,列名设置为“销量”:LVCOLUMN lvc;
lvc.mask=LVCF_WIDTH | LVCF_TEXT; //同样的,你要设置什么属性,就要先给mask变量赋值响应的标志。lvc.pszText="销量";
lvc.cx=50;
m_listctrl.SetColumn(3,&lvc);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: