按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
含的 NMHDR 结构。另外,在函数返回时,ClassWizard 自动将处理结果赋 0 值。
可以利用 ON_NOTIFY_RANGE 宏把多个 ID 连续的控件发出的相同消息映射到同一个
处理函数上,具体形式如下:
ON_NOTIFY_RANGE(wNotifyCode; id; idLast; memberFxn)
其中参数 id 和 idLast 分别说明明了一组连续的控件 ID 中的头一个和最后一个 ID 。
相应的消息处理函数应按下面的形式声明:
afx_msg void memberFxn(UINT id; NMHDR* pNotifyStruct;LRESULT * result);
与普通的 WM_NOTIFY 消息处理函数相比,该函数多了一个参数 id 用来说明发送通知
消息的控件 ID 。
ClassWizard 不支持 ON_NOTIFY_RANGE 宏,所以需要手工建立消息映射和消息处理函
数。
5。8。2 列表控件的使用
列表控件用来成列地显示数据。列表视图的表项通常包括图标(Icon )和标题(Label )
·129 ·
…………………………………………………………Page 139……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
两部分,它们分别提供了对数据的形象和抽象描述。列表视图控件是对传统的列表框的重大
改进,它能够以下列 4 种格式显示数据。读者可以在资源管理器中的视图(View)菜单中切换
列表视图的显示格式,来看看 4 种格式的不同之处。
o 大图标格式(Large Icons ):可逐行显示多列表项,图标的大小可由应用程序指定,通
常是 32 ×32 像素,在图标的下面显示标题。
o 小图标格式(Small Icons):可逐行显示多列表项,图标的大小可由应用程序指定,通
常是 16×16 像素,在图标的右面显示标题。表项以行的方式组织。
o 列表格式(List )。与小图标格式类似。不同之处在于表项是逐列多列显示的。
o 报告格式(Report 或 Details ):每行仅显示一个表项,在标题的左边显示一个图标,
表项可以不显示图标而只显示标题。表项的右边可以附加若干列子项(Subitem),子
项只显示正文。在控件的顶端还可以显示一个列表头用来说明各列的类型。列表视图
的报告格式很适合显示报表(如数据库报表)。
典型的列表控件的格式如图 5…7 所示。
图 5…7 ClistCtrl 控件形式样例
在讨论如何使用列表视图控件以前,先向读者介绍一下与该控件有关的一些数据类型。
1.LV_COLUMN 结构
该结构仅用于报告式列表视图,用来描述表项的某一列。要想向表项中插入新的一列,
需要用到该结构。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;
·130 ·
…………………………………………………………Page 140……………………………………………………………
第 5 章 常用控件
2 .LV_ITEM 结构
该结构用来描述一个表项或子项,它包含了项的各种属性,其定义为如下:
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 同左 项被选择用来进行剪切和粘贴操作
LVIS_DROPHILITED 同左 项成为拖动操作的目标
LVIS_FOCUSED 同左 项具有输入焦点
LVIS_SELECTED 同左 项被选中
3 .NM_LISTVIEW 结构
该结构用于存储列表视图通知消息的有关信息,大部分列表视图的通知消息都会附带指
向该结构的指针。
NM_LISTVIEW 的定义如下:
typedef struct tagNM_LISTVIEW {
NMHDR hdr;
//标准的 NMHDR 结构
int iItem;
·131 ·
…………………………………………………………Page 141……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
//表项的索引,若为…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 在报告格式中不显示列的表头
·132 ·
…………………………………………………………Page 142……………………………………………………………
第 5 章 常用控件
续表
风格 含义
LVS_NOLABELWRAP 当显示格式是大图标时,使标题单行显示。默认时是多行显示
LVS_NOSCROLL 列表视图无滚动条
LVS_NOSORTHEADER 报告列表视图的表头不能作为排序按钮使用
LVS_OWNERDRAWFIXED 由控件的拥有者负责绘制表项
LVS_REPORT 指定报告显示格式
LVS_SHAREIMAGELISTS 使列表视图共享图像序列
LVS_SHOWSELALWAYS 即使控件失去输入焦点,仍显示出项的选择状态
LVS_SINGLESEL 指定一个单选择列表视图。默认时可以多项