友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
VC语言6.0程序设计从入门到精通-第29部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
pDC…》SetTextColor(RGB(255;10;10));
hbr = (HBRUSH)GetStockObject(HOLLOW_BRUSH);
}
else
{
hbr = CDialog::OnCtlColor(pDC;pWnd;nCtlColor);
}
}
break;
default:
break;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
BOOL CRMBDlg::OnEraseBkgnd(CDC* pDC)
{
CBitmap bmp;
bmp。LoadBitmap(IDB_BG);
·127 ·
…………………………………………………………Page 137……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
CBrush brush(&bmp);
CRect rc;
GetClientRect(&rc);
pDC…》FillRect(rc; &brush);
return true;
}
程序运行界面如图 5…6 所示。
图 5…6 定制外衣后对话框的用户界面
5。8 列表(List Ctrl )控件
5。8。1 Win32 新型控件概述
列表控件是一种 Win32 控件,这和前面提到的传统控件在某些方面存在不同。Win32 控
件采用新的 WM_NOTIFY 消息来实现新控件的消息通知机制。在该消息的 wParam 中含有控
件的 ID,lParam 中则有一个指针,这个指针指向一个结构。这个结构要么是 NMHDR 结构,
要么是一个以 NMHDR 结构作为第一个成员的扩充结构。通过 NMHDR 结构及其扩充结构可
以传递附加数据。从理论上讲,可以通过扩充结构传送任意多的数据。需要指出的是,由于
NMHDR 结构是扩充结构的第一个成员,因此 lParam 中的指针即可以认为是指向 NMHDR
结构的,也可以认为是指向包含 NMHDR 结构的扩充结构的。
1.NMHDR 结构
NMHDR 结构如下:
typedef struct tagNMHDR
{
HWND hwndFrom; //控件窗口的句柄
UINT idFrom; //控件的 ID
UINT code; //控件的通知消息码
}NMHDR;
一个典型的扩充结构如下,该结构用于列表视图控件的 LVN_KEYDOWN 通知消息。
typedef struct tagLV_KEYDOWN{
NMHDR hdr; //NMHDR 结构作为第一个成员
·128 ·
…………………………………………………………Page 138……………………………………………………………
第 5 章 常用控件
WORD wVKey;
UINT flags;
}LV_KEYDOWN;
2 .WM_NOTIFY 消息处理
WM_NOTIFY 的消息映射由宏 ON_NOTIFY 负责,该消息映射宏具有如下形式:
ON_NOTIFY(wNotifyCode;id;memberFxn)
参数 wNotifyCode 说明了通知消息码,参数 id 是控件的 ID,第三个参数则是消息处理
函数名。消息处理函数应该按下面的形式声明,其中参数 pNotifyStruct 指向 NMHDR 及其扩
充结构,参数 result 指向一个处理结果:
afx_msg void memberFxn(NMHDR* pNotifyStruct; LRESULT * result);
利用 ClassWizard 可以很方便地加入 WM_NOTIFY 消息映射及其处理函数,一个典型的
WM_NOTIFY 消息映射如下,其中 LVN_KEYDOWN 是 IDC_LIST1 列表视图控件发出的通
知消息:
ON_NOTIFY(LVN_KEYDOWN; IDC_LIST1;OnKeydownList1)
消息处理函数 OnKeydownList1 的定义如下:
void CMyDlg::OnKeydownList1(NMHDR* pNMHDR; LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
// TODO: Add your control notification handler
// code here
*pResult = 0;
}
在函数中 ClassWizard 自动把 pNHHDR 指针强制转换成 LV_KEYDOWN 型并赋给
pLVKeyDow 指针,这样,在函数中可通过这两个指针访问 LV_KEYDOWN 扩充结构及其所
含的 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
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!