📄 01_9_12_5.asp.html
字号:
m_nMaxWidth = 0;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 现在可以改动新加入的AddString()了。先应该调用基类AddString(),并用nRet记录其返回值: </td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
int nRet = CListBox::AddString(lpszItem);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 接下来调用GetScrollInfo()以获得垂直滚动条的相关信息。这些信息是通过一个SCROLLINFO结构传递的,下面是对该结构初始化并调用GetScrollInfo()的代码:
</td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
SCROLLINFO scrollInfo;</td></tr></table><table width=100% ><tr><td class=a14>
memset(&scrollInfo, 0, sizeof(SCROLLINFO));</td></tr></table><table width=100% ><tr><td class=a14>
scrollInfo.cbSize = sizeof(SCROLLINFO);</td></tr></table><table width=100% ><tr><td class=a14>
scrollInfo.fMask = SIF_ALL;</td></tr></table><table width=100% ><tr><td class=a14>
GetScrollInfo(SB_VERT, &scrollInfo, SIF_ALL);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 在调试器内观察SCROLLINFO,可以发现要获得nMax和nPage的正确数值,列表框至少应含有一个字符串。SCROLLINFO的成员nPage保存了列表框“每页”能够显示的项目数,nMax是列表框内项目总数。当nMax大于或等于nPage,就出现了垂直滚动条。我们需要知道垂直滚动条的宽度以正确计算列表框的有效显示宽度。这里使用一个初始值为0的整数nScrollWidth表示,并在垂直滚动条显示时将它赋值:
</td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
int nScrollWidth = 0;</td></tr></table><table width=100% ><tr><td class=a14>
if(GetCount() > 1 && ((int)scrollInfo.nMax </td></tr></table><table width=100% ><tr><td class=a14>
> = (int)scrollInfo.nPage))</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
nScrollWidth = GetSystemMetrics(SM_CXVSCROLL);</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 接下来声明一个SIZE变量sSize,并实例化对话框的CClientDC: </td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
SIZE sSize;</td></tr></table><table width=100% ><tr><td class=a14>
CClientDC myDC(this);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 对话框所采用的字体,有可能是缺省字体,也有可能是有目的的选择。在对话框编辑器中右击对话框,并选择Properties可以查看当前值。虽然MyDC是从列表框取得的,但列表框字体信息并未包含在MyDC中。也就是说,对话框创建时所用字体并没有“选入”CClientDC。要从GetTextExtentPoint32()获得真正的字符串大小,应该先调用GetFont()获得列表框的字体信息,然后将此字体选入MyDC,代码为:
</td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
CFont* pListBoxFont = GetFont();</td></tr></table><table width=100% ><tr><td class=a14>
if(pListBoxFont != NULL)</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
CFont* pOldFont = </td></tr></table><table width=100% ><tr><td class=a14>
myDC.SelectObject(pListBoxFont);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 现在可以调用GetTextExtendPoint32()函数来获得字符串的宽度了。字符串的宽度由sSize结构的cx成员返回,将该值和已有最大宽度相比较:
</td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
GetTextExtentPoint32(myDC.m_hDC, </td></tr></table><table width=100% ><tr><td class=a14>
lpszItem, strlen(lpszItem), &sSize);</td></tr></table><table width=100% ><tr><td class=a14>
m_nMaxWidth = max(m_nMaxWidth, (int)sSize.cx);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 剩下的重要工作之一,就是设置水平滚动条的大小了。这可以通过调用SetHorizontalExtent()完成。如果传递给它的整形参数比列表框本身宽度小,则水平滚动条被隐藏。
</td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 这里有一个容易被忽略的地方。如果仔细观察CListBox,可以发现文本左边有一栏小小的空白,它的大小为3 。这部分宽度应该加到文本宽度上。如果希望在文本右边也同样空出一栏,则可以在文本宽度上再加3。
</td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
SetHorizontalExtent(m_nMaxWidth + 3);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 在结束之前,我们需要为MyDC选入原有字体。原有字体保存在pOldFont中: </td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
myDC.SelectObject(pOldFont); }</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
return nRet;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 编译并执行新的代码,可以看到水平滚动条终于能够自动显示了。 </td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table>
<table width=100% >
<tr>
<td class=a14><b> 三、其它问题 </b></td>
</tr>
</table>
<table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> 在实际应用中,凡是改变列表框内容的函数都可能影响水平滚动条的显示要求,因而也必须加以定制。但其基本过程——计算文本宽度并按指定大小显示滚动条等,和上述讨论过程是相似的。
</td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> CListBox类能够改变列表内容的方法除AddString()外,还有DeleteString(),InsertString(),ResetContent()。其中InsertString()用于在指定位置插入字符串,在本文讨论的主题内它和AddString()是一样的。
</td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> DeleteString()删除一个字符串,在派生类中其参考代码如下: </td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
int CDJListBox::DeleteString(UINT nIndex)</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
RECT lRect;</td></tr></table><table width=100% ><tr><td class=a14>
GetWindowRect(&lRect);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
int nRet = CListBox::DeleteString(nIndex);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
int nBoxWidth = lRect.right - lRect.left;</td></tr></table><table width=100% ><tr><td class=a14>
m_nMaxWidth = nBoxWidth;</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
SIZE sSize;</td></tr></table><table width=100% ><tr><td class=a14>
CClientDC myDC(this);</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
int i;</td></tr></table><table width=100% ><tr><td class=a14>
char szEntry[257];</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
for (i = 0; i nBoxWidth) // 显示水平滚动条</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
ShowScrollBar(SB_HORZ, TRUE);</td></tr></table><table width=100% ><tr><td class=a14>
SetHorizontalExtent(m_nMaxWidth);</td></tr></table><table width=100% ><tr><td class=a14>
} </td></tr></table><table width=100% ><tr><td class=a14>
else </td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
ShowScrollBar(SB_HORZ, FALSE);</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
return nRet;</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr>
<td class=a14> ResetContent()用于清除列表框的全部内容。在派生类中其参考代码如下: </td>
</tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
void CDJListBox::ResetContent()</td></tr></table><table width=100% ><tr><td class=a14>
{</td></tr></table><table width=100% ><tr><td class=a14>
CListBox::ResetContent();</td></tr></table><table width=100% ><tr><td class=a14>
</td></tr></table><table width=100% ><tr><td class=a14>
m_nMaxWidth = 0;</td></tr></table><table width=100% ><tr><td class=a14>
SetHorizontalExtent(0);</td></tr></table><table width=100% ><tr><td class=a14>
}</td></tr>
</table><br>
<style>.a1{font-size:1}</style>
<table width=100% ><tr><td align=right>(网页编辑:<a href='mailto:liu_yang@ccw.com.cn'>风之翼</a>)</td></tr></table>
</td><td class=a1 bgcolor=#f46240> </td>
<td valign=top width=138 align=right><table width=98% ><tr><td>
<form action='/app/gsearch1.asp' name=pdn><table width=100% ><tr><td>应用与方案
频道全文检索</td></tr>
<tr><td><input type="text" name="textfile" size=15 value=频道内检索 onfocus="this.value=''">
<input border=0 src="../../../../../images/jian.gif" name="I1" type="image" align=absmiddle>
</td></tr>
</table>
</form>
<form name=srch action="/search/which.asp" method=post onsubmit="JavaScript:return chk()">
<table width=100% >
<tr><td><select size="1" name="func">
<option selected value="2">主题检索</option>
<option value="1">周报全文检索</option>
<option value="3">模糊词检索</option>
</select></td></tr>
<tr><td><input type="text" name="SrchStr" size=15 value="输入待检索的词"
onfocus="this.value=''">
<input src="../../../../../images/jian.gif" name="I1" type="image" align="absMiddle" border=0>
</td></tr>
</table>
<script language="JavaScript">
function chk()
{if (!document.srch.SrchStr.value){
alert("请输入需检索的词!");
document.srch.SrchStr.focus();
return false;
}
else{if (document.srch.SrchStr.value.length>30){
alert("检索的词请不要超过30个字符!");
document.srch.SrchStr.focus();
return false;
}
}
}
</script></form>
<table width=100% ><tr><td class=f colspan=2><b>相关文章</b></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_12_4.asp.html'>制作VC表格控件</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_12_3.asp.html'>Visual C++中位图按钮的新颖设计</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='01_9_12_2.asp.html'>改变Push Button背景色</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='../jiangzuo/01_9_12_6.asp.html'>6.3 利用WinSock进行有连接的通信</a></td></tr>
<tr><td valign=top><IMG SRC=../../../../../img2/jiao.gif></td><td><a href='../jiangzuo/01_9_12_5.asp.html'>6.2 利用WinSock进行无连接的通信</a></td></tr>
</table>
</td></tr></table></td></tr></table><br>
<table align=center width=680><tr><td align=right>
<form name=mail method=post action='/pub/subMail.asp' onsubmit='JavaScript: return chkField(this)'>
<INPUT type='hidden' name='rec' value='23967'>
您的姓名:<INPUT type="text" name=myName size=10>
您朋友的E-mail:<INPUT type="text" name=friendMail size=10>
<INPUT type="submit" value="推荐给好友">
</form>
</td></tr>
<tr><td align=right>
<b>[<a href="javascript:window.close()">关闭窗口</a>]</b>
</td></tr>
</table>
<script language="javascript">
function chkField(fmObj)
{if (!fmObj.friendMail.value){
alert("请输入您朋友的E-mail!");
fmObj.friendMail.focus();
return false;
}
return true;
}
</script>
<table align=center width=680>
<tr><td><hr size=1 width=660 color=#f46240></td></tr>
</table><br>
<p align=center>Copyright(C) ccw.com.cn,All rights reserved</p>
<p align=center><b>中国计算机世界出版服务公司版权所有</b></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -