本文根据本人在项目中的应用,来谈谈CListCtrl的部分用法及技巧。当初学习时,查了很多资料,零零碎碎的作了些记录,现在主要是来做个总结,方便以后查阅。主要包括以下十三点内容:基本操作、获取选中行的行号、复选框操作、动态设置选中行的字体颜色、设置选中行的背景颜色、禁止拖动表头、让第一列居中显示、设置行高与字体、虚拟列表技术、点击表头时进行归类、向上与向下移动、动态调整大小问题、避免闪烁问题。
1、基本操作
分别从下面四点来介绍CListCtrl的基本操作:
`①设置列表视图显示方式
Ⅰ. CListCtrl有四种样式:LVS_ICON、LVS_SMALLICON、LVS_LIST、LSV_REPORT,可通过控件属性来设置。本文所述均为LSV_REPORT属性。
Ⅱ. 扩展样式: 常用的扩展样式有三种:LVS_EX_FULLROWSELECT、LVS_EX_GRIDLINES、LVS_EX_CHECKBOXES,分别对应作用 选中某行时使正行高亮、设置网格线、item前生成Ckeckbox控件。
使用SetExtendedStyle(style)函数设置扩展样式,使用GetExtendedStyle()函数获取样式,
如: m_listInfo.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
Ⅲ. 使用CListView时,需要在PreCreateWindow()函数中添加 cs.style | = LVS_REPORT; 来将其设置为LVS_REPORT风格,否则插入无效。还用另一种方法来设置风格,即在OnInitialUpate()中获取CListCtrl控制权,然后修改风格,如下所示: CListCtrl &theCtrl =GetListCtrl(); theCtrl.ModifyStyle(0, LVS_REPORT);
②
插入操作
先插入列:
int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat, int nWidth, int nSubItem)
插入列时,可指明列号、列名称、列名称显示样式,列宽等信息。对于列号为0的那一列,始终是靠左显示,后面会有修改使其剧中显示的方法,其他列通过设置nFormat属性可以居中显示。
插入行:
int InsertItem( int nItem, LPCTSTRlpszItem )
直接插入一行,nItem指明行号,lpszItem指明该行第0列的信息。
设置信息: BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText ) 设置第nItem行nSubItem列的信息(nItem:0,1,2,3……; nSubItem:1,2,3……)
③删除操作
有三个操作函数:
BOOL DeleteAllItems() -------删除所有的行
BOOL DeleteItem(nItem) --------删除某一行
BOOL DeleteColumn(nCol) -----删除某一列
④获取/设置属性函数
有很多函数了,就不一一介绍了。
常用的有
int GetItemCount() -------- 获取已插入信息的行数
BOOL SetItemState(int iLink, UINTstate, UINTstateMask ) ---------设置行状态,如高亮显示等 等等
2、获取选中行的行号
获取选中行的行号,然后对该行进行相关处理,这点在编程中用的非常多。
当鼠标单击item时,控件向父窗口发送NM_CLICK消息,其响应函数为OnNMClickXXXX(NMHDR *pNMHDR, LRESULT *pResult),在该函数下来编写代码获取鼠标点击的行号。
有两种方法来获取行号:第一种是使用GetFirstSelectedItemPosition和GetNextSelectedItem配合来获取;第二种是先获取鼠标位置信息,然后调用HitTest函数来找出行号。示例分别如下: 第一种方法,该示例截自MSDN,可作修改后使用。`
第一种方法
POSITION pos = pList->GetFirstSelectedItemPosition();
if (pos == NULL)
TRACE0("No items were selected!\n");
else
{
while (pos)
{
int nItem = pList->GetNextSelectedItem(pos);
TRACE1("Item %d was selected!\n", nItem);
// you could do your own processing on nItem here
}
}
第二种方法
//获取单击所在的行号
//找出鼠标位置
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_listCtrl.ScreenToClient(&point);
//定义结构体
LVHITTESTINFO lvinfo;
lvinfo.pt = point;