第 31 章
的顶端还可以显示一个列表头用来说明各列的类型。列表视图
的报告格式很适合显示报表(如数据库报表)。
典型的列表控件的格式如图5-7 所示。
图5-7 ClistCtrl 控件形式样例
在讨论如何使用列表视图控件以前,先向读者介绍一下与该控件有关的一些数据类型。
1.LV_COLUMN 结构
该结构仅用于报告式列表视图,用来描述表项的某一列。要想向表项中chā入新的一列,
需要用到该结构。LV_COLUMN 结构的定义为:
typedef struct _LV_COLUMN{
UINT mask;
//屏蔽位的组合(见下面括号),表明哪些成员是有效的
int fmt;
//该列的表头和子项的标题显示格式(LVCF_FMT)。可以是LVCFMT_CENTER、LVCFMT_LEFT
//或LVCFMT_RIGHT
int cx; //以像素为单位的列的宽度(LVCF_FMT)
LPTSTR pszText; //指向存放列表头标题正文的缓冲区(LVCF_TEXT)
int cchTextMax; //标题正文缓冲区的长度(LVCF_TEXT)
int iSubItem; //说明该列的索引(LVCF_SUBITEM)
}LV_COLUMN;
枫叶文学网www.fywxw.com
第5 章 常用控件
·131·
2.LV_ITEM 结构
该结构用来描述一个表项或子项,它包含了项的各种属xìng,其定义为如下:
typedef struct _LV_ITEM {
UINT mask;
//屏蔽位的组合(见下面括号),表明哪些成员是有效的
int iItem;
//从0 开始编号的表项索引(行索引)
int iSubItem;
//从1 开始编号的子项索引(列索引),若值为0 则说明该成员无效,结构描述的是一个表项而不
是子项
UINT state;
//项的状态(LVIF_STATE)
UINT stateMask;
//项的状态屏蔽
LPTSTR pszText;
//指向存放项的正文的缓冲区(LVIF_TEXT)
int cchTextMax;
//正文缓冲区的长度(LVIF_TEXT)
int iImage;
//图标的索引(LVIF_IMAGE)
LPARAM lParam;
//32 位的附加数据(LVIF_PARAM)
}LV_ITEM;
其中lParam 成员可用来存储与项相关的数据,这在有些情况下是很有用的。state 和
stateMask 的值如表5-19 所示,stateMask 用来说明要获取或设置哪些状态。
表5-19 列表视图的状态
状态 对应的状态屏蔽 含义
LVIS_CUT 同左 项被选择用来进行剪切和粘贴cāo作
LVIS_DROPHILITED 同左 项成为拖动cāo作的目标
LVIS_FOCUSED 同左 项具有输入焦点
LVIS_SELECTED 同左 项被选中
3.NM_LISTVIEW 结构
该结构用于存储列表视图通知消息的有关信息,大部分列表视图的通知消息都会附带指
向该结构的指针。NM_LISTVIEW 的定义如下:
typedef struct tagNM_LISTVIEW {
NMHDR hdr;
//标准的NMHDR 结构
int iItem;
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·132·
//表项的索引,若为-1 则无效
int iSubItem;
//子项的索引,若为0 则无效
UINT uNewState;
//项的新状态
UINT uOldState;
//项原来的状态
UINT uChanged;
//取值与LV_ITEM 的mask 成员相同,用来表明哪些状态发生了变化
POINT ptAction;
//事件发生时鼠标的客户区坐标
LPARAM lParam;
//32 位的附加数据
}NM_LISTVIEW;
4.LV_DISPINFO 结构
该结构包含了与项的显示有关的信息,其定义为:
typedef struct tagLV_DISPINFO {
NMHDR hdr;
LV_ITEM item;
}LV_DISPINFO;
//LV_KEYDOWN 结构,该结构包含一些与键盘有关的信息,其定义为
typedef struct tagLV_KEYDOWN {
NMHDR hdr;
WORD wVKey; //虚拟键盘码
UINT flags; //总为0
} LV_KEYDOWN;
MFC 的CListCtrl 类封装了列表视图控件。该类的Create 函数负责创建控件,函数的声
明为:
BOOL Create(DWORD dwStyle,const RECT& rect, CWnd* pParentWnd,UINT nID );
其中参数dwStyle 是如表5-20 所示的控件风格的组合。
表5-20 列表视图的风格
风格 含义
LVS_ALIGNLEFT
显示格式是大图标或小图标时,标题放在图标的左边。默认情况下标题
放在图标的下面
LVS_ALIGNTOP 当显示格式是大图标或小图标时,标题放在图标的上边
LVS_AUTOARRANGE 当显示格式是大图标或小图标时,自动排列控件中的表项
LVS_EDITLABELS 用户可以修改标题
LVS_ICON 指定大图标显示格式
LVS_LIST 指定列表显示格式
LVS_NOCOLUMNHEADER 在报告格式中不显示列的表头
枫叶文学网www.fywxw.com
第5 章 常用控件
·133·
续表
风格 含义
LVS_NOLABELWRAP 当显示格式是大图标时,使标题单行显示。默认时是多行显示
LVS_NOSCROLL 列表视图无滚动条
LVS_NOSORTHEADER 报告列表视图的表头不能作为排序按钮使用
LVS_OWNERDRAWFIXED 由控件的拥有者负责绘制表项
LVS_REPORT 指定报告显示格式
LVS_SHAREIMAGELISTS 使列表视图共享图像序列
LVS_SHOWSELALWAYS 即使控件失去输入焦点,仍显示出项的选择状态
LVS_SINGLESEL 指定一个单选择列表视图。默认时可以多项选择
LVS_SMALLICON 指定小图标显示格式
LVS_SORTASCENDING 按升序排列表项
LVS_SORTDESCENDING 按降序排列表项
除上表的风格外,一般还要指定WS_CHILD 和WS_VISIBLE 窗口风格。风格组合
WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_AUTOARRANGE|LVS_EDITLABLES 将指定
一个自动排列的、可编辑标题的、单选择报告式列表视图控件。要指定大图标、小图标或列
表式的列表视图控件,则应该把LVS_REPORT 换成LVS_ICON、LVS_SMALLICON 或
LVS_LIST。
对于用对话框模板创建的列表视图控件,可以在控件的属xìng对话框中指定上表中列出的
控件风格。例如,在属xìng对话框的Styles 页的View 栏中选择Icon,相当于指定了LVS_ICON
风格。
5.8.3 ClistCtrl 类的主要成员函数
CListCtrl 类提供了大量的成员函数。在这里结合实际应用来介绍一些常用的函数。
1.InsertColumn()函数
在以报告格式显示列表视图时,一般会显示一列表项和多列子项。在初始化列表视图时,
先要调用InsertColumn chā入各个列,该函数的声明如下:
int InsertColumn(int nCol,const LV_COLUMN* pColumn);
其中参数nCol 是新列的索引,参数pColumn 指向一个LV_COLUMN 结构,函数根据该
结构来创建新的列。若chā入成功,函数返回新列的索引,否则返回-1。
2.DeleteColumn()函数
要删除某列,应调用DeleteColumn()函数,其声明如下:
BOOL DeleteColumn(int nCol);
3.InsertItem()函数
要chā入新的表项,应调用InsertItem()函数。如果要显示图标,则应该先创建一个
CImageList 对象并使该对象包含用作显示图标的位图序列。然后调用SetImageList 来为列表
视图设置位图序列。函数的声明为
int InsertItem(const LV_ITEM* pItem);
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·134·
参数pItem 指向一个LV_ITEM 结构,该结构提供了对表项的描述。若chā入成功则函数
返回新表项的索引,否则返回-1。
4.SetImageList()函数
该成员函数声明如下:
CImageList* SetImageList(CImageList* pImageList,int nImageList);
参数pImageList 指向一个CImageList 对象,参数nImageList 用来指定图标的类型,若其
值为LVSIL_NORMAL,则位图序列用作显示大图标;若值为LVSIL_SMALL,则位图序列
用作显示小图标。可用该函数同时指定一套大图标和一套小图标。
5.DeleteItem()函数
要删除某表项,应调用DeleteItem()函数,要删除所有的项,应调用DeleteAllItems()函数。
一旦表项被删除,其子项也被删除。该函数的声明如下:
BOOL DeleteItem(int nItem );
BOOL DeleteAllItems();
6.GetItemText()和SetItemText()函数
调用GetItemText()和SetItemText()函数来查询和设置表项及子项显示的正文。SetItemText
的一个重要用途是对子项进行初始化。该函数的声明如下:
int GetItemText(int nItem,int nSubItem, LPTSTR lpszText, int nLen) const;
CString GetItemText(int nItem, int nSubItem) const;
BOOL SetItemText(int nItem,int nSubItem,LPTSTR lpszText);
其中参数nItem 是表项的索引(行索引),nSubItem 是子项的索引(列索引),若nSubItem
为0 则说明函数是针对表项的。参数lpszText 指向正文缓冲区,参数nLen 说明了缓冲区的大
小。第二个版本的GetItemText 返回一个含有项的正文的Cstring 对象。
7.GetItem()和SetItem()函数
调用GetItem()和SetItem()函数来查询和设置指定项的属xìng。用这两个函数几乎可以查询
和设置指定项的所有属xìng,包括正文、图标及选择状态。该函数的声明如下:
BOOL GetItem(LV_ITEM* pItem) const;
BOOL SetItem(const LV_ITEM* pItem);
参数pItem 是指向LV_ITEM 结构的指针,函数是通过该结构来查询或设置指定项的,
在调用函数前应该使该结构的iItem 或iSubItem 成员有效以指定表项或子项。CListCtrl 还提
供了一系列函数完成GetItem()和SetItem()的功能,其中GetItemState()、GetItemText()和
GetItemData()函数用于查询,SetItemState()、SetItemTex()t 和SetItemData()函数用于设置。
8.GetNextItem()函数
要寻找与指定表项相关的表项,或寻找具有某种状态的表项,应该调用GetNextItem()函
数。该函数的一个重要用处是搜索被选择的表项。该函数的声明如下:
int GetNextItem(int nItem, int nFlags) const;
枫叶文学网www.fywxw.com
第5 章 常用控件
·135·
参数nItem 是指定项的索引,参数nFlags 是如表5-21 所示的标志,用来指定查询的关系。
函数返回搜索到的表项的索引,若未找到则返回-1。
表5-21 参数nFlags 的值
标志 含义
LVNI_ABOVE 返回位于指定表项上方的表项
LVNI_ALL 默认标志,返回指定表项的下一个表项(以索引为序)
LVNI_BELOW 返回位于指定表项下方的表项
LVNI_TOLEFT 返回位于指定表项左边的表项
LVNI_TORIGHT 返回位于指定表项右边的表项
LVNI_DROPHILITED 返回拖动cāo作的目标表项
LVNI_FOCUS
松语文学免费小说阅读_www.16sy.com
的报告格式很适合显示报表(如数据库报表)。
典型的列表控件的格式如图5-7 所示。
图5-7 ClistCtrl 控件形式样例
在讨论如何使用列表视图控件以前,先向读者介绍一下与该控件有关的一些数据类型。
1.LV_COLUMN 结构
该结构仅用于报告式列表视图,用来描述表项的某一列。要想向表项中chā入新的一列,
需要用到该结构。LV_COLUMN 结构的定义为:
typedef struct _LV_COLUMN{
UINT mask;
//屏蔽位的组合(见下面括号),表明哪些成员是有效的
int fmt;
//该列的表头和子项的标题显示格式(LVCF_FMT)。可以是LVCFMT_CENTER、LVCFMT_LEFT
//或LVCFMT_RIGHT
int cx; //以像素为单位的列的宽度(LVCF_FMT)
LPTSTR pszText; //指向存放列表头标题正文的缓冲区(LVCF_TEXT)
int cchTextMax; //标题正文缓冲区的长度(LVCF_TEXT)
int iSubItem; //说明该列的索引(LVCF_SUBITEM)
}LV_COLUMN;
枫叶文学网www.fywxw.com
第5 章 常用控件
·131·
2.LV_ITEM 结构
该结构用来描述一个表项或子项,它包含了项的各种属xìng,其定义为如下:
typedef struct _LV_ITEM {
UINT mask;
//屏蔽位的组合(见下面括号),表明哪些成员是有效的
int iItem;
//从0 开始编号的表项索引(行索引)
int iSubItem;
//从1 开始编号的子项索引(列索引),若值为0 则说明该成员无效,结构描述的是一个表项而不
是子项
UINT state;
//项的状态(LVIF_STATE)
UINT stateMask;
//项的状态屏蔽
LPTSTR pszText;
//指向存放项的正文的缓冲区(LVIF_TEXT)
int cchTextMax;
//正文缓冲区的长度(LVIF_TEXT)
int iImage;
//图标的索引(LVIF_IMAGE)
LPARAM lParam;
//32 位的附加数据(LVIF_PARAM)
}LV_ITEM;
其中lParam 成员可用来存储与项相关的数据,这在有些情况下是很有用的。state 和
stateMask 的值如表5-19 所示,stateMask 用来说明要获取或设置哪些状态。
表5-19 列表视图的状态
状态 对应的状态屏蔽 含义
LVIS_CUT 同左 项被选择用来进行剪切和粘贴cāo作
LVIS_DROPHILITED 同左 项成为拖动cāo作的目标
LVIS_FOCUSED 同左 项具有输入焦点
LVIS_SELECTED 同左 项被选中
3.NM_LISTVIEW 结构
该结构用于存储列表视图通知消息的有关信息,大部分列表视图的通知消息都会附带指
向该结构的指针。NM_LISTVIEW 的定义如下:
typedef struct tagNM_LISTVIEW {
NMHDR hdr;
//标准的NMHDR 结构
int iItem;
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·132·
//表项的索引,若为-1 则无效
int iSubItem;
//子项的索引,若为0 则无效
UINT uNewState;
//项的新状态
UINT uOldState;
//项原来的状态
UINT uChanged;
//取值与LV_ITEM 的mask 成员相同,用来表明哪些状态发生了变化
POINT ptAction;
//事件发生时鼠标的客户区坐标
LPARAM lParam;
//32 位的附加数据
}NM_LISTVIEW;
4.LV_DISPINFO 结构
该结构包含了与项的显示有关的信息,其定义为:
typedef struct tagLV_DISPINFO {
NMHDR hdr;
LV_ITEM item;
}LV_DISPINFO;
//LV_KEYDOWN 结构,该结构包含一些与键盘有关的信息,其定义为
typedef struct tagLV_KEYDOWN {
NMHDR hdr;
WORD wVKey; //虚拟键盘码
UINT flags; //总为0
} LV_KEYDOWN;
MFC 的CListCtrl 类封装了列表视图控件。该类的Create 函数负责创建控件,函数的声
明为:
BOOL Create(DWORD dwStyle,const RECT& rect, CWnd* pParentWnd,UINT nID );
其中参数dwStyle 是如表5-20 所示的控件风格的组合。
表5-20 列表视图的风格
风格 含义
LVS_ALIGNLEFT
显示格式是大图标或小图标时,标题放在图标的左边。默认情况下标题
放在图标的下面
LVS_ALIGNTOP 当显示格式是大图标或小图标时,标题放在图标的上边
LVS_AUTOARRANGE 当显示格式是大图标或小图标时,自动排列控件中的表项
LVS_EDITLABELS 用户可以修改标题
LVS_ICON 指定大图标显示格式
LVS_LIST 指定列表显示格式
LVS_NOCOLUMNHEADER 在报告格式中不显示列的表头
枫叶文学网www.fywxw.com
第5 章 常用控件
·133·
续表
风格 含义
LVS_NOLABELWRAP 当显示格式是大图标时,使标题单行显示。默认时是多行显示
LVS_NOSCROLL 列表视图无滚动条
LVS_NOSORTHEADER 报告列表视图的表头不能作为排序按钮使用
LVS_OWNERDRAWFIXED 由控件的拥有者负责绘制表项
LVS_REPORT 指定报告显示格式
LVS_SHAREIMAGELISTS 使列表视图共享图像序列
LVS_SHOWSELALWAYS 即使控件失去输入焦点,仍显示出项的选择状态
LVS_SINGLESEL 指定一个单选择列表视图。默认时可以多项选择
LVS_SMALLICON 指定小图标显示格式
LVS_SORTASCENDING 按升序排列表项
LVS_SORTDESCENDING 按降序排列表项
除上表的风格外,一般还要指定WS_CHILD 和WS_VISIBLE 窗口风格。风格组合
WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_AUTOARRANGE|LVS_EDITLABLES 将指定
一个自动排列的、可编辑标题的、单选择报告式列表视图控件。要指定大图标、小图标或列
表式的列表视图控件,则应该把LVS_REPORT 换成LVS_ICON、LVS_SMALLICON 或
LVS_LIST。
对于用对话框模板创建的列表视图控件,可以在控件的属xìng对话框中指定上表中列出的
控件风格。例如,在属xìng对话框的Styles 页的View 栏中选择Icon,相当于指定了LVS_ICON
风格。
5.8.3 ClistCtrl 类的主要成员函数
CListCtrl 类提供了大量的成员函数。在这里结合实际应用来介绍一些常用的函数。
1.InsertColumn()函数
在以报告格式显示列表视图时,一般会显示一列表项和多列子项。在初始化列表视图时,
先要调用InsertColumn chā入各个列,该函数的声明如下:
int InsertColumn(int nCol,const LV_COLUMN* pColumn);
其中参数nCol 是新列的索引,参数pColumn 指向一个LV_COLUMN 结构,函数根据该
结构来创建新的列。若chā入成功,函数返回新列的索引,否则返回-1。
2.DeleteColumn()函数
要删除某列,应调用DeleteColumn()函数,其声明如下:
BOOL DeleteColumn(int nCol);
3.InsertItem()函数
要chā入新的表项,应调用InsertItem()函数。如果要显示图标,则应该先创建一个
CImageList 对象并使该对象包含用作显示图标的位图序列。然后调用SetImageList 来为列表
视图设置位图序列。函数的声明为
int InsertItem(const LV_ITEM* pItem);
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·134·
参数pItem 指向一个LV_ITEM 结构,该结构提供了对表项的描述。若chā入成功则函数
返回新表项的索引,否则返回-1。
4.SetImageList()函数
该成员函数声明如下:
CImageList* SetImageList(CImageList* pImageList,int nImageList);
参数pImageList 指向一个CImageList 对象,参数nImageList 用来指定图标的类型,若其
值为LVSIL_NORMAL,则位图序列用作显示大图标;若值为LVSIL_SMALL,则位图序列
用作显示小图标。可用该函数同时指定一套大图标和一套小图标。
5.DeleteItem()函数
要删除某表项,应调用DeleteItem()函数,要删除所有的项,应调用DeleteAllItems()函数。
一旦表项被删除,其子项也被删除。该函数的声明如下:
BOOL DeleteItem(int nItem );
BOOL DeleteAllItems();
6.GetItemText()和SetItemText()函数
调用GetItemText()和SetItemText()函数来查询和设置表项及子项显示的正文。SetItemText
的一个重要用途是对子项进行初始化。该函数的声明如下:
int GetItemText(int nItem,int nSubItem, LPTSTR lpszText, int nLen) const;
CString GetItemText(int nItem, int nSubItem) const;
BOOL SetItemText(int nItem,int nSubItem,LPTSTR lpszText);
其中参数nItem 是表项的索引(行索引),nSubItem 是子项的索引(列索引),若nSubItem
为0 则说明函数是针对表项的。参数lpszText 指向正文缓冲区,参数nLen 说明了缓冲区的大
小。第二个版本的GetItemText 返回一个含有项的正文的Cstring 对象。
7.GetItem()和SetItem()函数
调用GetItem()和SetItem()函数来查询和设置指定项的属xìng。用这两个函数几乎可以查询
和设置指定项的所有属xìng,包括正文、图标及选择状态。该函数的声明如下:
BOOL GetItem(LV_ITEM* pItem) const;
BOOL SetItem(const LV_ITEM* pItem);
参数pItem 是指向LV_ITEM 结构的指针,函数是通过该结构来查询或设置指定项的,
在调用函数前应该使该结构的iItem 或iSubItem 成员有效以指定表项或子项。CListCtrl 还提
供了一系列函数完成GetItem()和SetItem()的功能,其中GetItemState()、GetItemText()和
GetItemData()函数用于查询,SetItemState()、SetItemTex()t 和SetItemData()函数用于设置。
8.GetNextItem()函数
要寻找与指定表项相关的表项,或寻找具有某种状态的表项,应该调用GetNextItem()函
数。该函数的一个重要用处是搜索被选择的表项。该函数的声明如下:
int GetNextItem(int nItem, int nFlags) const;
枫叶文学网www.fywxw.com
第5 章 常用控件
·135·
参数nItem 是指定项的索引,参数nFlags 是如表5-21 所示的标志,用来指定查询的关系。
函数返回搜索到的表项的索引,若未找到则返回-1。
表5-21 参数nFlags 的值
标志 含义
LVNI_ABOVE 返回位于指定表项上方的表项
LVNI_ALL 默认标志,返回指定表项的下一个表项(以索引为序)
LVNI_BELOW 返回位于指定表项下方的表项
LVNI_TOLEFT 返回位于指定表项左边的表项
LVNI_TORIGHT 返回位于指定表项右边的表项
LVNI_DROPHILITED 返回拖动cāo作的目标表项
LVNI_FOCUS
松语文学免费小说阅读_www.16sy.com