20200220MFC 之CListCtrl(二)

本文详细介绍了CListCtrl在MFC中的使用,包括基本操作如设置显示方式、插入删除行与列,获取/设置属性,以及复选框操作。特别讨论了动态设置选中行字体颜色和背景颜色的实现,利用Custom Draw技术实现视觉效果。
摘要由CSDN通过智能技术生成

本文根据本人在项目中的应用,来谈谈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),在该函数下来编写代码获取鼠标点击的行号。
有两种方法来获取行号:第一种是使用GetFirstSelectedItemPositionGetNextSelectedItem配合来获取;第二种是先获取鼠标位置信息,然后调用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;
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值