CListCtrl

转载 2011年01月16日 21:59:00

VC 中使用控件一直是件让我头痛的事件,从控件的创建到控件的操作管理,都得写一大堆代码,相比于 Delphi/VB ,实在是麻烦多了。其实在之前学习 SDK 的时候,就有想过专门花点儿时间来学习 VC 中控件的使用,但一直没空。最近准备写一个小工具,要用到 ListCtrl 控件,所以又不得不好好的恶补 一翻。

我是在 MFC 的对话框模式下使用 CListCtrl 控件的,其实不管在 SDK 或文档 / 视图模式下, VC 控件的使用都差不多,下面来好好的写写 CListCtrl 控件的使用笔记。

一、 CListCtrl 控件的创建

由于我是在 MFC 的对话框模式下使用 CListCtrl 控件的,所以只需要在控件栏上选择 CListCtrl 的图形按钮,接着添加到对话框中就行了。

二、 CListCtrl 控件样式的设置

第一步:在使用 CListCtrl 控件之前,首先需要为该控件关联一个变量(只针对于对话框模式):
CListCtrl m_BlogAccountList;

第二步:由于 CListCtrl 控件要做一些初始化操作,比如设置控件样式,设置控件的行列并填入一些数据。初始化操作的代码是在对话框的 OnInitDialog 事件中写入的。

默认情况下, CListCtrl 控件的样式是非常简陋的,大多情况下我们都需要对 CListCtrl 控件的样式进行修改,比如设置为报表样式,可以进行整行 选择等,如有需要还有调整 CListCtrl 控件的行高。诸如这些设置都需要用到 CListCtrl 控件的扩展样式,所以首先得了解这些扩展样式。

我在 MSDN 中没有找到 CListCtrl 控件的扩展样式资料,只好上百度百科找了找。

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//
多工作区

对话框模式下创建的 CListCtrl 控件样式只有一个,就是 WS_BORDER ,而我需要为 CListCtrl 设置为报表样式,并能选择整行,下面就可以开始写代码了:

//
通过 GetWindowLong 来获取 CListCtrl 已有的样式
DWORD dwStyle = GetWindowLong(m_BlogAccountList.m_hWnd, GWL_STYLE);

//
在原有样式的基本上,添加 LVS_REPORT 扩展样式
SetWindowLong(m_BlogAccountList.m_hWnd, GWL_STYLE, dwStyle|LVS_REPORT);



//
获取已有的扩展样式
DWORD dwStyles = m_BlogAccountList.GetExStyle();

//
取消复选框样式
dwStyles &= ~LVS_EX_CHECKBOXES;

//
添加整行选择和表格线扩展样式
m_BlogAccountList.SetExtendedStyle(dwStyles|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

通过以上四句代码,就已经能满足我的需求了。

三、为 CListCtrl 控件添加列

列的添加只需要用到 LVCOLUMN 结构体,所以需要先行了解了解。在 MSDN 中查到的 LVCOLUMN 结构体的定义如下:

typedef struct _LVCOLUMN {
    UINT mask;
    int fmt;
    int cx;
    LPTSTR pszText;
    int cchTextMax;
    int iSubItem;
#if (_WIN32_IE >= 0x0300)
    int iImage;
    int iOrder;
#endif
} LVCOLUMN, FAR *LPLVCOLUMN;

该结构体共有 8 个成员。

mask
是用来设置 LVCOLUMN 结构体中哪些成员有效,其值可以为 0 mask 可设置的值如下:

LVCF_FMT  fmt
成员有效
LVCF_IMAGE iImage
成员有效  
LVCF_ORDER  //
以下略
LVCF_SUBITEM
LVCF_TEXT
LVCF_WIDTH

fmt
成员是对 CListCtrl 控件列标题进行设置,比如列标题中文字的对齐方式,是否在列标题中显示图标等。

cx
成员是设置列宽。

pszText
成员是设置列标题文字

cchTextMax
成员是设置标题文字的缓冲区大小

iSubItem
成员是设置列索引

iImage
成员是设置 ImageList 中的图像索引。

iOrder
成员的作用未知。

下面进行添加列操作:

char *szColUmn[] = {"
帐号 ", " 密码 "};
int nColWidth[] = {100, 100};
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;
lvc.fmt = LVCFMT_LEFT; //
左对齐
for (int i = 0; i < 2; i++)
{
    lvc.pszText = szColUmn[i];
    lvc.iSubItem = i;
    lvc.iOrder = i;
    lvc.cx = nColWidth[i];
    m_BlogAccountList.InsertColumn(i, &lvc);

}

四、为 CListCtrl 控件添加行
添加行的操作需要用到 InsertItem SetItemText 属性,这个简单,就不详述了,看代码:

m_BlogAccountList.InsertItem(0, "abc");
m_BlogAccountList.SetItemText(0, 1, "abc");
m_BlogAccountList.SetItemText(1, 1, "123");

 

该函数获得有关指定窗口的信息,
函数也获得在额外窗口内存中指定偏移地址的 32 位长整型值。
LONG   GetWindowLong(HWND   hWnd,int   nindex);
hwnd:
窗口句柄及间接给出的窗口所属的窗口类。

函数功能:该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的 32 位度整型值。

       
函数原型: LONG   GetWindowLong HWND   hWnd int   nlndex );

       
参数:

        hWnd:
窗口句柄及间接给出的窗口所属的窗口类。

        nlndex
:指定要获得值的大于等于 0 的值的偏移量。有效值的范围从 0 到额外窗口内存空间的字节数一 4 例如,若指定了 12 位或多于 12 位的额外类存储空间,则应设为第三个 32 位整数的索引位 8 。要获得任意其他值,指定下列值之一:

        GWL_EXSTYLE
;获得扩展窗日风格。

        GWL_STYLE
:获得窗口风格。

        GWL_WNDPROC
:获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用 GWL_WNDPROC 函数调用窗口过程。

        GWL_HINSTANCE
:获得应用事例的句柄。

        GWL_HWNDPAAENT
:如果父窗口存在,获得父窗口句柄。

        GWL_ID:
获得窗口标识。

        GWL_USERDATA
:获得与窗口有关的 32 位值。每一个窗口均有一个由创建该窗口的应用程序使用的 32 位值。

       
hWnd 参数标识了一个对话框时也可用下列值:

        DWL_DLGPROC
:获得对话框过程的地址,或一个代表对话框过程的地址的句柄。必须使用函数 CallWindowProc 来调用对话框过程。

        DWL_MSGRESULT
:获得在对话框过程中一个消息处理的返回值。

        DWL_USER
:获得应用程序私有的额外信息,例如一个句柄或指针。

       
返回值:如果函数成功,返回值是所需的 32 位值;如果函数失败,返回值是 0 。若想获得更多错误信息请调用   GetLastError 函数。

       
备注:通过使用函数 RegisterClassEx 将结构 WNDCLASSEX 中的 cbWndExtra 单元指定为一个非 0 值来保留额外类的存储空间。

 

 

 

 

CListCtrl删除选中行和CListCtrl的用法(详)

CListCtrl删除选中行 CListCtrl选中行有两种属性情况,如果设置了Single Selection为TRUE,则只能单选,否则为多选(默认)。 方法一: int CListCtr...
  • wang15061955806
  • wang15061955806
  • 2016年10月09日 11:01
  • 637

MFC总结之CListCtrl用法及技巧

本文根据本人在项目中的应用,来谈谈CListCtrl的部分用法及技巧。当初学习时,查了很多资料,零零碎碎的作了些记录,现在主要是来做个总结,方便以后查阅。主要包括以下十三点内容:基本操作、获取选中行的...
  • sky101010ws
  • sky101010ws
  • 2016年06月15日 10:28
  • 2348

可编辑子项的CListCtrl类

转自:http://www.vckbase.com/index.php/wv/1548 文章概要: 本文对CListCtrl控件进行了一个扩展,使它即可以编辑主项(Item),...
  • fevershen
  • fevershen
  • 2014年12月04日 09:51
  • 1027

CListCtrl大数据显示

CListCtrl是个很方便的东西,但是当数据大到一个程度(比如说10万条数据),显示速度就会非常的慢。解决办法就是用虚拟列表。CListCtrl显示数据的原理是将需显示的所有数据拷贝在它内部的一块空...
  • guoguojune
  • guoguojune
  • 2015年09月24日 09:40
  • 1332

CListCtrl自绘去除闪屏

/*CListCtrl控件Owner Draw Fixed属性 :true*//*CMyListCtrl.h头文件*/#ifndef CMYLISTCTRL_H#define CMYLISTCTRL_...
  • ab7936573
  • ab7936573
  • 2014年02月27日 18:42
  • 832

设置CListCtrl单元格的颜色

pragma once// CListCtrlClclass CListCtrlCl : public CListCtrl { DECLARE_DYNAMIC(CListCtrlCl)publ...
  • aifusenwansui
  • aifusenwansui
  • 2015年08月13日 21:55
  • 1672

自定义MFC ClistCtrl控件的示例代码

Author: kagula@20150401 环境:  vs2013sp1  自定义行高、字体、颜色。 如何引用的示例代码 初始化 BOOL CTestListCtrlDlg::OnInit...
  • lee353086
  • lee353086
  • 2015年04月01日 14:52
  • 2491

VC中CListCtrl使用技巧(部分转载)

1.      CListCtrl 风格 LVS_ICON: 为每个item显示大图标      LVS_SMALLICON: 为每个item显示小图标      LVS_LIST: 显示一列带有小图...
  • qq_23992597
  • qq_23992597
  • 2016年07月26日 11:49
  • 418

防止CListCtrl闪烁的几种方法

1. 使用SetRedraw禁止窗口重绘,操作完成后,再恢复窗口重绘 m_ctlList.SetRedraw(FALSE); //以下为更新数据操作 //…… //恢复窗口重绘 m_ctlList.S...
  • jiangqin115
  • jiangqin115
  • 2015年04月06日 18:15
  • 1282

MFC总结之CListCtrl用法及技巧

主要包括以下十三点内容:基本操作、获取选中行的行号、复选框操作、动态设置选中行的字体颜色、设置选中行的背景颜色、禁止拖动表头、让第一列居中显示、设置行高与字体、虚拟列表技术、点击表头时进行归类、向上与...
  • hebbely
  • hebbely
  • 2016年05月12日 19:09
  • 1939
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CListCtrl
举报原因:
原因补充:

(最多只允许输入30个字)