CListCtrl组件的使用
作者:骄傲的猫
1. 创建CListCtrl
在对话框窗体中创建的话,只要用资源编辑器在Dialog资源上添加一个CListCtrl就可以了,这里不作详述。这里主要将一下如何在非对话框窗体中使用CListCtrl类提供的Create函数创建对象。
这种情况创建对象一般分为两步,第一步构造CListCtrl类的对象,第二步调用对象的Create函数在程序界面上创建可视化组件(该方法一般在OnInitialUpdate或OnCreate事件中调用)。下面我们来看一下Create函数的原型。
virtual BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);
第一个参数dwStyle指定了创建的ListCtrl的样式,具体有哪些可选样式可以查看SDK的文档。
第二个参数rect指定创建的ListCtrl的大小和位置。
第三个参数pParentWnd指定创建的ListCtrl的父窗体。
第四个参数nID指定创建的ListCtrl的ID值。
如果Create函数调用成功则返回TRUE(非零),否则返回FALSE(零)
2. 添加显示列(Column)
如果创建的ListCtrl具有LVS_REPORT样式,则可以显示多列数据,则一节我们将讲解如何为CListCtrl组件添加列。
添加列使用CListCtrl对象的成员函数InsertColumn,该函数有两种重载形式,下面让我们看一下他们的原型。
int InsertColumn(
int nCol,
const LVCOLUMN* pColumn
);
int InsertColumn(
int nCol,
LPCTSTR lpszColumnHeading,
int nFormat = LVCFMT_LEFT,
int nWidth = -1,
int nSubItem = -1
);
参数nCol指定创建的新列的index。
参数pColumn指向一个LVCOLUMN结构体,该结构体包含创建的新列的属性。
参数lpszColumnHeading指定列名。
参数nFormat 指定列的对齐方式,它的值可以是LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_CENTER之一。
参数nWidth指定列宽。
参数nSubItem指定与改列关联的子项的index。
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, *LPLVCOLUMN;
mask成员指定该结构提可以指定哪些成员有效:
LVCF_FMT: fmt成员有效
LVCF_IMAGE: iImage成员有效
LVCF_ORDER: iOrder成员有效
LVCF_SUBITEM: iSubItem成员有效
LVCF_TEXT: pszText成员有效
LVCF_WIDTH: cx成员有效
fmt成员指定列表头的对齐方式
cx指定列宽
pszText指定显示的列表头
cchTextMax指定pszText指向的缓存的大小,如果不返回列的信息,该成员可以忽略
iSubItem与列关联的subitem的index
iImage与CListCtrl关联的CImageList对象用一个图象的index。
iOrder该列显示在第几列。
下面是在CListCtrl中插入列的示例代码。
LVCOLUMN col;
col.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT | LVCF_ORDER;
col.fmt = LVCFMT_LEFT;
col.cx = 75;
col.pszText = _T("File Name");
col.iOrder = 2;
m_pListCtr.InsertColumn(0, &col);
col.fmt = LVCFMT_RIGHT;
col.cx = 50;
col.pszText = _T("Finished");
col.iOrder = 0;
m_pListCtr.InsertColumn(1, &col);
col.cx = 50;
col.pszText = _T("Size");
col.iOrder = 3;
m_pListCtr.InsertColumn(2, &col);
col.cx = 50;
col.pszText = _T("Speed");
col.iOrder = 1;
m_pListCtr.InsertColumn(3, &col);
3. 添加显示行(Item)
CListCtrl中用InsertItem添加行,并用SetItem为该Item设置子项(SubItem)。首先让我们看一下InsertItem函数,它的的原型如下。
int InsertItem(
const LVITEM* pItem
);
int InsertItem(
int nItem,
LPCTSTR lpszItem
);
int InsertItem(
int nItem,
LPCTSTR lpszItem,
int nImage
);
从上面的代码可以看出InsertItem用到了一个结构体LVITEM,在该结构体中保存将要创建的Item的属性,LVITEM的定义如下。
typedef struct _LVITEM {
UINT mask;
int iItem;
int iSubItem;
UINT state;
UINT stateMask;
LPTSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
#if (_WIN32_IE >= 0x0300)
int iIndent;
#endif
int iGroupId;
} LVITEM;
mask成员同LVCOLUMN中的mask成员功能相同,我们用它来指定在LVITEM中哪些成员是有效的。
iItem指定新建的Item的index。
iSubItem指定新建的Item在一列上对应的SubItem的Index。
pszText指定该Item显示的内容
iImage指定该Item显示的图片
示例
LVITEM lvi; lvi.mask = LVIF_TEXT; lvi.iItem = 0; lvi.iSubItem = 0; lvi.pszText = _T("Hell.zip"); int i = m_pListCtr.InsertItem(&lvi); m_pListCtr.SetItemText(i, 1, _T("50%")); m_pListCtr.SetItemText(i, 2, _T("100M")); m_pListCtr.SetItemText(i, 3, _T("40K/S"));