📄 chap6_1.htm
字号:
TRUE );<br> 该函数将滚动框移动到指定位置.参数nPos指定了新的位置.参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘之.函数返回滚动框原来的位置.若操作失败则返回0.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">void GetScrollRange( LPINT lpMinPos, LPINT lpMaxPos ) const;<br> 该函数对滚动条的滚动范围进行查询.参数lpMinPos和lpMaxPos分别指向滚动范围的最小最大值.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">void SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE );<br> 该函数用于指定滚动条的滚动范围.参数nMinPos和nMaxPos分别指定了滚动范围的最小最大值.由这两者指定的滚动范围不得超过32767.当两者都为0时,滚动条将被隐藏.参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘之.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">BOOL GetScrollInfo( LPSCROLLINFO lpScrollInfo, UINT nMask );<br> 该函数用来获取滚动条的各种状态,包括滚动范围、滚动框的位置和页尺寸.参数lpScrollInfo指向一个SCROLLINFO结构,该结构如下所示:<br> typedef struct tagSCROLLINFO { <br> UINT cbSize; //结构的尺寸(字节为单位)<br> UINT fMask; /*说明结构中的哪些参数是有效的,可以是屏蔽值的组合, 如SIF_POS|SIF_PAGE,若为SIF_ALL则整个结构都有效*/<br> int nMin; //滚动范围最大值,当fMask中包含SIF_RANGE时有效<br> int nMax; //滚动范围最小值,当fMask中包含SIF_RANGE时有效<br> UINT nPage; /*页尺寸,用来确定比例滚动框的大小,当fMask中包含 SIF_PAGE时有效*/<br> int nPos; //滚动框的位置,当fMask中包含SIF_POS有效<br> int nTrackPos; /*拖动时滚动框的位置,当fMask中包含 SIF_TRACKPOS时有效,该参数只能查询,不能设 置,最好不要用该参数来查询拖动时滚动框的位置*/<br> } SCROLLINFO; <br> typedef SCROLLINFO FAR *LPSCROLLINFO;<br> 参数nMask的意义与SCROLLINFO结构中的fMask相同.函数在获得有效值后返回TRUE,否则返回FALSE.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">BOOL SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );<br> 该函数用于设置滚动条的各种状态,一个重要用途是设定页尺寸从而实现比例滚动框.参数lpScrollInfo指向一个SCROLLINFO结构,参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘之.若操作成功,该函数返回TRUE,否则返回FALSE.</span></p> </blockquote> </blockquote> <p><span style="font-size: 9pt"> </span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">CWnd类也提供了一些函数来查询和设置所属的标准滚动条.这些函数与CScrollBar类的函数同名,且功能相同,但每个函数都多了一个参数,用来选择滚动条.例如,CWnd:: GetScrollPos 的声明为</span></p> <blockquote> <blockquote> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int GetScrollPos( int nBar ) const;<br> 参数nBar用来选择滚动条,可以为下列值:<br> SB_HORZ //指定水平滚动条<br> SB_VERT //指定垂直滚动条</span></p> </blockquote> </blockquote> <p><span style="font-size: 9pt"> </span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">无论是标准滚动条,还是滚动条控件,滚动条的通知消息都是用WM_HSCROLL和WM_VSCROLL消息发送出去的.对这两个消息的确省处理函数是CWnd::OnHScroll和CWnd::OnVScroll,它们几乎什么也不做.一般需要在派生类中对这两个函数从新设计,以实现滚动功能.这两个函数的声明为</span></p> <blockquote> <blockquote> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );<br> 参数nSBCode是通知消息码,如表6.8所示.nPos是滚动框的位置,只有在nSBCode为SB_THUMBPOSITION或SB_THUMBTRACK时,该参数才有意义.如果通知消息是滚动条控件发来的,那么pScrollBar是指向该控件的指针,如果是标准滚动条发来的,则pScrollBar为NULL.</span></p> </blockquote> </blockquote> <p><b><span style="font-size: 9pt"> </span></p> <p ALIGN="CENTER"><span style="font-size: 9pt">表6.8 滚动条的通知消息码</span></b></p> <table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579"> <tr> <td WIDTH="40%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">消息</span></b></td> <td WIDTH="60%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">含义</span></b></td> </tr> <tr> <td WIDTH="40%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SB_BOTTOM / SB_RIGHT(二者的消息码是一样的,因此可以混用,下同)</span></td> <td WIDTH="60%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">滚动到底端(右端).</span></td> </tr> <tr> <td WIDTH="40%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SB_TOP / SB_LEFT</span></td> <td WIDTH="60%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">滚动到顶端(左端).</span></td> </tr> <tr> <td WIDTH="40%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SB_LINEDOWN / SB_LINERIGHT</span></td> <td WIDTH="60%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">向下(向右)滚动一行(列).</span></td> </tr> <tr> <td WIDTH="40%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SB_LINEUP / SB_LINELEFT</span></td> <td WIDTH="60%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">向上(向左)滚动一行(列).</span></td> </tr> <tr> <td WIDTH="40%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SB_PAGEDOWN / SB_PAGERIGHT</span></td> <td WIDTH="60%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">向下(向右)滚动一页.</span></td> </tr> <tr> <td WIDTH="40%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SB_PAGEUP / SB_PAGELEFT</span></td> <td WIDTH="60%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">向上(向左)滚动一页.</span></td> </tr> <tr> <td WIDTH="40%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SB_THUMBPOSITION</span></td> <td WIDTH="60%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">滚动到指定位置.</span></td> </tr> <tr> <td WIDTH="40%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SB_THUMBTRACK</span></td> <td WIDTH="60%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">滚动框被拖动.可利用该消息来跟踪对滚动框的拖动.</span></td> </tr> <tr> <td WIDTH="40%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">SB_ENDSCROLL</span></td> <td WIDTH="60%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">滚动结束.</span></td> </tr> </table> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">6.1.8小节的例子中,读者将学会如何使用滚动条以及如何编写自己的OnHScroll函数.</span></p> <b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt"><font color="#3973DE">6.1.6 列表框控件</font></span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">列表框主要用于输入,它允许用户从所列出的表项中进行单项或多项选择,被选择的项呈高亮度显示.列表框具有边框,并且一般带有一个垂直滚动条.列表框分单选列表框和多重选择列表框两种.单选列表框一次只能选择一个列表项,而多重选择列表框可以进行多重选择.对于列表项的选择,微软公司有如下建议:</span></p> <blockquote> <blockquote> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">单击鼠标选择一个列表项,单击一个按钮来处理选择的项.</span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">双击鼠标选择一个列表项是处理选择项的快捷方法.</span></p> </blockquote> </blockquote> <p><span style="font-size: 9pt"> </span></p> <p ALIGN="JUSTIFY"><span style="font-size: 9pt">列表框会向父窗口发送如表6.9所示的通知消息.</span></p> <p ALIGN="JUSTIFY"><b><span style="font-size: 9pt"> </span></p> <p ALIGN="CENTER"><span style="font-size: 9pt">表6.9 列表框控件的通知消息</span></b></p> <table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="567"> <tr> <td WIDTH="27%"><b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">消息</span></b></td> <td WIDTH="73%"><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">LBN_DBLCLK</span></td> <td WIDTH="73%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">用户用鼠标双击了一列表项.只有具有LBS_NOTIFY的列表框才能发送该消息.</span></td> </tr> <tr> <td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">LBN_ERRSPACE</span></td> <td WIDTH="73%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">列表框不能申请足够的动态内存来满足需要.</span></td> </tr> <tr> <td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">LBN_KILLFOCUS</span></td> <td WIDTH="73%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">列表框失去输入焦点.</span></td> </tr> <tr> <td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">LBN_SELCANCEL</span></td> <td WIDTH="73%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">当前的选择被取消.只有具有LBS_NOTIFY的列表框才能发送该消息.</span></td> </tr> <tr> <td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">LBN_SELCHANGE</span></td> <td WIDTH="73%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">单击鼠标选择了一列表项.只有具有LBS_NOTIFY的列表框才能发送该消息.</span></td> </tr> <tr> <td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">LBN_SETFOCUS</span></td> <td WIDTH="73%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">列表框获得输入焦点.</span></td> </tr> <tr> <td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">WM_CHARTOITEM</span></td> <td WIDTH="73%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">当列表框收到WM_CHAR消息后,向父窗口发送该消息.只有具有LBS_WANTKEYBOARDINPUT风格的列表框才会发送该消息.</span></td> </tr> <tr> <td WIDTH="27%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">WM_VKEYTOITEM</span></td> <td WIDTH="73%"><p ALIGN="JUSTIFY"><span style="font-size: 9pt">当列表框收到WM_KEYDOWN消息后,向父窗口发送该消息.只有具有LBS_WANTKEYBOARDINPUT风格的列表框才会发送该消息.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -