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