📄 chap6_2.htm
字号:
<html>
<head>
<title>6.2 新的Win32控件</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>
<body link="#3973DE" alink="#3973DE" background="../../bg.gif">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="85%" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF">
<tr>
</b><td><div align="center"><center><table border="0" width="615" cellpadding="0"
cellspacing="0" height="20">
<tr>
<td width="377" bgcolor="#15397D" height="20"></td>
<td width="238" bgcolor="#000000" height="20"><p align="right"></font><a
href="../../vc.htm"><span style="text-decoration: none"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></span></a></td>
</tr>
</table>
</center></div><font FACE="Times New Roman" SIZE="3"><b><p ALIGN="CENTER"></b></font><font
color="#3973DE" FACE="Times New Roman" SIZE="3">6.2</font><font color="#3973DE"><font
SIZE="3"> 新的</font><font FACE="Times New Roman" SIZE="3">Win32</font><font SIZE="3">控件</font></font><font
FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><span style="font-size: 9pt"> 从Windows 95和Windows NT
3.51版开始,Windows提供了一些先进的Win32控件.这些新控件弥补了传统控件的某些不足之处,并使Windows的界面丰富多彩且更加友好.MFC的新控件类封装了这些控件,新控件及其对应的控件类如表6.21所示.</span></p>
<b><p ALIGN="CENTER"><span style="font-size: 9pt">表6.21 新的Win32控件及其控件类</span></b></p>
<table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579">
<tr>
<td WIDTH="27%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">控件名</span></b></td>
<td WIDTH="50%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">功能</span></b></td>
<td WIDTH="23%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">对应的控件类</span></b></td>
</tr>
<tr>
<td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">动画(Animate)</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">可播放avi文件.</span></td>
<td WIDTH="23%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CAnimateCtrl</span></td>
</tr>
<tr>
<td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">热键(Hot Key)</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">使用户能选择热键组合.</span></td>
<td WIDTH="23%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CHotKeyCtrl</span></td>
</tr>
<tr>
<td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">列表视图(List View)</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">能够以列表、小图标、大图标或报告格式显示数据.</span></td>
<td WIDTH="23%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CListCtrl</span></td>
</tr>
<tr>
<td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">进度条(Progress Bar)</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">用于指示进度.</span></td>
<td WIDTH="23%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CProgressCtrl</span></td>
</tr>
<tr>
<td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">滑尺(Slider)</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">也叫轨道条(Trackbar),用户可以移动滑尺来在某一范围中进行选择.</span></td>
<td WIDTH="23%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CSliderCtrl</span></td>
</tr>
<tr>
<td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">旋转按钮(Spin Button)</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">有时被称为上下控件.有一对箭头按钮,用来调节某一值的大小.</span></td>
<td WIDTH="23%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CSpinButtonCtrl</span></td>
</tr>
<tr>
<td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">标签(Tab)</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">用来作为标签使用.</span></td>
<td WIDTH="23%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CTabCtrl</span></td>
</tr>
<tr>
<td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">树形视图(Tree View)</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">以树状结构显示数据.</span></td>
<td WIDTH="23%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">CTreeCtrl</span></td>
</tr>
</table>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">本节将主要介绍列表视图、树形视图、进度条、旋转按钮和滑尺控件,动画控件将在第十二章介绍.</span></p>
<b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"><font color="#3973DE">6.2.1 Win32控件的通知消息</font></span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 较之传统的Windows 3.x控件,新的Win32控件更加复杂和先进.在新控件发送通知消息的同时,往往还需要附加一些数据来描述控件的状态.传统的WM_COMMAND消息通知机制显然不能完成这一任务,因为WM_COMMAND消息的wParam和lParam已经被占满了(见6.1.1),无法容纳新的数据.</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 在Win32中,采用新的WM_NOTIFY消息来实现新控件的消息通知机制.在该消息的wParam中含有控件的ID,lParam中则有一个指针,这个指针指向一个结构.这个结构要么是NMHDR结构,要么是一个以NMHDR结构作为第一个成员的扩充结构.通过NMHDR结构及其扩充结构可以传递附加数据.从理论上讲,可以通过扩充结构传送任意多的数据.需要指出的是,由于NMHDR结构是扩充结构的第一个成员,因此lParam中的指针即可以认为是指向NMHDR结构的,也可以认为指向包含NMHDR结构的扩充结构的.</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">NMHDR结构如下所示:</span></p>
<blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">typedef struct tagNMHDR {</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">HWND hwndFrom; //控件窗口的句柄</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">UINT idFrom; //控件的ID</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">UINT code; //控件的通知消息码</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">} NMHDR;</span></p>
</blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">一个典型的扩充结构如下所示,该结构用于列表视图控件的LVN_KEYDOWN通知消息.</span></p>
<blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">typedef struct tagLV_KEYDOWN {</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">NMHDR hdr; //NMHDR结构作为第一个成员</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">WORD wVKey; </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">UINT flags; </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">} LV_KEYDOWN;</span></p>
</blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">有些控件通知消息是所有Win32控件共有的,这些消息在表6.22中列出.</span></p>
<p ALIGN="JUSTIFY"><b><span style="font-size: 9pt"> </span></p>
<p ALIGN="CENTER"><span style="font-size: 9pt">表6.22 Win32控件共有的通知消息</span></b></p>
<table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579">
<tr>
<td WIDTH="50%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">通知消息码</span></b></td>
<td WIDTH="50%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">含义</span></b></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">NM_CLICK</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">用户在控件上单击鼠标左键.</span></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">NM_DBLCLK</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">用户在控件上双击鼠标左键.</span></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">NM_RCLICK</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">用户在控件上单击鼠标右键.</span></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">NM_RDBLCLK</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">用户在控件上双击鼠标右键.</span></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">NM_RETURN</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">用户在控件上按回车键.</span></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">NM_SETFOCUS</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">控件获得输入焦点.</span></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">NM_KILLFOCUS</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">控件失去输入焦点.</span></td>
</tr>
<tr>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">NM_OUTOFMEMORY</span></td>
<td WIDTH="50%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">内存不够.</span></td>
</tr>
</table>
<p><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">WM_NOTIFY的消息映射由宏ON_NOTIFY负责,该消息映射宏具有如下形式:</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">ON_NOTIFY( wNotifyCode, id, memberFxn )</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">参数wNotifyCode说明了通知消息码,参数id是控件的ID,第三个参数则是消息处理函数名.消息处理函数应该按下面的形式声明,其中参数pNotifyStruct指向NMHDR及其扩充结构,参数result指向一个处理结果.</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">afx_msg void memberFxn( NMHDR *
pNotifyStruct, LRESULT * result );</span></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -