📄 chap6_2.htm
字号:
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// TODO: Add your control notification handler</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// code here</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">*pResult = 0;</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p> </blockquote> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">可以利用ON_NOTIFY_RANGE宏把多个ID连续的控件发出的相同消息映射到同一个处理函数上,具体形式如下,其中参数id和idLast分别说明明了一组连续的控件ID中的头一个和最后一个ID.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">相应的消息处理函数应按下面的形式声明,与普通的WM_NOTIFY消息处理函数相比,该函数多了一个参数id用来说明发送通知消息的控件ID.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">afx_msg void memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT * result );</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">ClassWizard不支持ON_NOTIFY_RANGE宏,所以需要手工建立消息映射和消息处理函数.</span></p> <b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"><font color="#3973DE">6.2.2 旋转按钮控件</font></span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">旋转按钮(Spin Button)有时也被称为上下控件(Up-Down Control).Windows 95控制面板中的日期/时间程序中就有两个典型的旋转按钮,如图6.2所示.旋转按钮由两个箭头按钮组成,用户在箭头按钮上单击鼠标可以在某一范围内增加或减少某一个值.旋转按钮一般不会单独存在,而是和编辑框或静态正文组成一个多部件控件来共同显示和控制某一个值,用户可以用旋转按钮修改编辑框中的数字,也可以直接在编辑框中修改.例如,在图6.2中,在旋转按钮的左测有一个编辑框,用户可以在编辑框中直接输入新的年份,也可以用旋转按钮来增减编辑框中的年份.通常,把与旋转按钮在一块的编辑框或静态正文称为"伙伴"(buddy).</span></p> <p ALIGN="center"><span style="font-size: 9pt"><img src="T6_2.gif" alt="T6_2.tif (164162 bytes)" WIDTH="462" HEIGHT="333"></span></p> <p ALIGN="center"><span style="font-size: 9pt">图6.2 日期/时间程序中的旋转按钮</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">MFC的CSpinButtonCtrl类封装了旋转按钮的功能.CSpinButtonCtrl的成员函数Create负责创建控件,该函数的声明为</span></p> <blockquote> <blockquote> <blockquote> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );</span></p> </blockquote> </blockquote> </blockquote> <p><span style="font-size: 9pt"> </span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">参数dwStyle是如表6.23所示的各种控件风格的组合.</span></p> <p ALIGN="JUSTIFY"><b><span style="font-size: 9pt"> </span></p> <p ALIGN="CENTER"><span style="font-size: 9pt">表6.23 旋转按钮控件的风格</span></b></p> <table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579"> <tr> <td WIDTH="36%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">控件风格</span></b></td> <td WIDTH="64%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">含义</span></b></td> </tr> <tr> <td WIDTH="36%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">UDS_HORZ</span></td> <td WIDTH="64%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">指定一个水平旋转按钮.若不指定该风格则创建一个垂直的旋转按钮.</span></td> </tr> <tr> <td WIDTH="36%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">UDS_WRAP</span></td> <td WIDTH="64%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">当旋转按钮增大到超过最大值时,自动重置为最小值,当减小至低于最小值时,自动重置为最大值.</span></td> </tr> <tr> <td WIDTH="36%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">UDS_ARROWKEYS</span></td> <td WIDTH="64%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">当用户按下向下或向上箭头键时,旋转按钮值递增或递减.</span></td> </tr> <tr> <td WIDTH="36%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">UDS_SETBUDDYINT</span></td> <td WIDTH="64%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">旋转按钮将自动更新伙伴控件中显示的数值,如果伙伴控件能接受输入,则可在伙伴控件中输入新的旋转按钮值.</span></td> </tr> <tr> <td WIDTH="36%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">UDS_NOTHOUSANDS</span></td> <td WIDTH="64%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">伙伴控件中显示的数值每隔三位没有千位分隔符.</span></td> </tr> <tr> <td WIDTH="36%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">UDS_AUTOBUDDY</span></td> <td WIDTH="64%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">自动使旋转按钮拥有一个伙伴控件.</span></td> </tr> <tr> <td WIDTH="36%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">UDS_ALIGNRIGHT</span></td> <td WIDTH="64%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">旋转按钮在伙伴控件的右侧.</span></td> </tr> <tr> <td WIDTH="36%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">UDS_ALIGNLEFT</span></td> <td WIDTH="64%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">旋转按钮在伙伴控件的左侧.</span></td> </tr> </table> <p><b><span style="font-size: 9pt"> </span></p> <p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"> </span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">除上表的风格外,一般还要为旋转按钮指定WS_CHILD和WS_VISIBLE风格.创建一个有伙伴的垂直旋转按钮控件,一般应指定的风格为WS_CHILD|WS_VISIBLE|UDS_AUTOBUDDY| UDS_SETBUDDYINT.对于用对话框模板创建的旋转按钮控件,可以在控件的属性对话框中指定上表中列出的控件风格。例如,在属性对话框中选择Auto buddy,相当于指定了UDS_AUTOBUDDY风格.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">在对话框模板中,可以方便地为旋转按钮指定一个伙伴控件.首先,应该在旋转按钮控件的属性对话框中选择Auto buddy和Set buddy integer属性,并在Alignment栏中选择Left或Right,然后就可以确定伙伴控件了.需要指出的是,旋转按钮并不是把离它最近的控件作为伙伴的.伙伴的选择是以tab顺序为参照的,伙伴控件的tab顺序必需紧挨着按钮控件且比它小.例如,如果某一控件的tab顺序是3,而旋转按钮的tab顺序是4,则不论这两个控件距离有多远,在程序运行时,旋转按钮都会自动与该控件结合在一起,形成伙伴关系.</span></p> <div align="center"><center><table border="2" cellpadding="2" cellspacing="0" width="100%" bgcolor="#97CBFF"> <tr> <td width="100%"><span style="font-size: 9pt">提示:在本章的开头说过,用ClassWizard无法为Win32控件创建数据变量.但我们可以为旋转按钮的伙伴控件(如编辑框)创建一个数据变量,该变量可看成是旋转按钮的数据变量.</span></td> </tr> </table> </center></div><p ALIGN="JUSTIFY"><span style="font-size: 9pt">通过CSpinButtonCtrl的成员函数,可以对旋转按钮进行查询和设置:</span></p> <blockquote> <blockquote> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">用GetRange和SetRange来查询和设置旋转按钮值的范围,缺省时值的范围是1-100.这两个函数的声明为<br> void GetRange( int &lower, int& upper ) const;<br> void SetRange( int nLower, int nUpper );<br> 第一个参数是最小值,该值不能小于UD_MINVAL,第二个参数是最大值,该值不能大于UD_MAXVAL.值的范围不能超过UD_MAXVAL.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">用GetPos和SetPos来查询和设置旋转按钮的当前值.函数的声明为<br> int GetPos( ) const;<br> int SetPos( int nPos );</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">用GetBase和SetBase来查询和设置旋转按钮值的计数制.函数的声明为<br> UINT GetBase( ) const;<br> int SetBase( int nBase );<br> 如果参数nBase是10,则伙伴控件中显示的数值是十进制的,如果nBase是16,则是十六进制的.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">用GetBuddy和SetBuddy来查询和设置旋转按钮的伙伴.上面已讲了在对话框模板中设置伙伴控件的方法,如果是用Create手工创建旋转按钮,则可以用SetBuddy来设置伙伴.函数的声明为<br> CWnd* GetBuddy( ) const;<br> CWnd* SetBuddy( CWnd* pWndBuddy );<br> 参数pWndBuddy是指向伙伴控件对象的CWnd型指针.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">可以用GetAccel和SetAccel来查询和设置旋转按钮的加速值.在平时,在旋转按钮上按一下只会增/减一个单位,而当按住按钮超过一定时间时,递增或递减的幅度将会加大到指定的加速值,从而加快了增减的速度.如果对缺省的加速值不满意,可以用SetAccel设置新的加速值.可以有一套以上的加速值.函数的声明为<br> UINT GetAccel( int nAccel, UDACCEL* pAccel ) const;<br> BOOL SetAccel( int nAccel, UDACCEL* pAccel );<br> 参数nAccel指定了UDACCEL结构数组的大小.参数pAccel指向一个UDACCEL结构数组.UDACCEL结构含有加速值的信息,其定义如下<br> typedef struct {</span></p> <blockquote> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int nSec; //加速值生效需要的时间(以秒为单位)</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int nInc; //加速值</span></p> </blockquote> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">} UDACCEL;</span></p> </blockquote> </blockquote> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">旋转按钮常被认为是一个简化的滚动条.除了表6.22列出的通知消息外,旋转按钮特有的滚动通知消息是通过WM_HSCROLL和WM_VSCROLL消息发出的.消息处理函数OnHScroll或OnVScroll分别用来处理水平或垂直旋转按钮的事件通知.由于伙伴控件中的内容会自动随旋转按钮变化,所以旋转按钮的通知消息意义不大.如果非要处理通知消息,一个典型的OnVscroll函数如下所示:</span></p> <blockquote> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">void CMyDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">CSpinButtonCtrl* pSpin=(CSpinButtonCtrl*)pScrollBar;</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int nPosition;</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">if(pSpin= =&m_Spin) //判断是否是该旋转按钮发来的消息</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">nPosition=m_Spin.GetPos( ); //获取旋转按钮的当前值</span></p> <p ALIGN="JUSTIFY"><b><span style="font-size: 9pt">. . . . . .</span></p> </b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p> <p ALIGN="JUSTIFY"><b><span style="font-size: 9pt">. . . . . .</span></p> </b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">}<br> </span></p> </blockquote> <b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"><font color="#3973DE">6.2.3 滑尺控件</font></span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">滑尺(Slider)有时也被称作轨道条(Trackbar),在轨道条中有一个滑尺,在轨道条上通常会标有刻度,用户通过移动滑尺,可以在一个指定的范围内选择一个不精确的值.轨道条可用来调节一个模拟量,也可以用来在一些离散值中进行选择.在Windows 95中,大量使用了轨道条控件,例如,在控制面板中的键盘和鼠标设置程序中就使用了轨道条控件,如图6.3所示.轨道条不仅接受鼠标输入,也可以接受象左右箭头键、PgUp和PgDown这样的键盘输入.</span></p> <p ALIGN="center"><span style="font-size: 9pt"><img src="T6_3.gif" alt="T6_3.tif (182219 bytes)" WIDTH="403" HEIGHT="421"></span></p> <p ALIGN="center"><span style="font-size: 9pt">图6.3 鼠标设置程序中的轨道条控件</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">与选择按钮不同,轨道条是一种模糊型的输入控件,用户不需要进行精确的选择,只要大致调整一下大小就行了.轨道条的这种特性非常符合人的行为习惯,因而在有些情况下是很有用,例如,对于音量的调节,显然用轨道条比用旋转按钮更符合人的日常习惯.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">轨道条的滑尺的移动具有离散性.例如,如果指定轨道条的范围是5,那么滑尺只能在包括轨道条两端在内的6个均匀的位置上移动.当然,如果范围很大,则用户就感觉不出是离散的了.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">轨道条控件与传统的滚动条控件有很多相似之处,实际上,前者是对后者的一种改进.除了表6.22列出的通知消息外,轨道条控件是依靠WM_HSCROLL和WM_VSCROLL来发送与滑尺有关的通知消息的,并且通知消息与滚动条极为相似.通知消息包括TB_BOTTOM、TB_LINEDOWN、TB_LINEUP、TB_TOP、TB_PAGEDOWN、TB_PAGEUP、TB_ENDTRACK、TB_THUMBPOSITION、TB_THUMBTRACK.对照滚动条的通知消息,读者不难明白这些消息码的含义.其中前四个消息只有在用键盘移动滑尺时才会发出,最后两个消息只有在用鼠标拖动滑尺时才会发出.与滚动条不同的是,Windows会自动把滑尺移动到新位置上.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">MFC的CSliderCtrl类封装了轨道条.CSliderCtrl类的Create成员函数负责控件的创建,该函数的声明为</span></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -