📄 chap4_3.htm
字号:
<html>
<head>
<title>4.3 状态栏的设计与实现</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">
<font SIZE="5"><b><div align="center"><center>
<table border="0" width="615" cellspacing="0" cellpadding="0">
<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><span style="text-decoration: none"><a href="../../index.htm"><font color="#FFFFFF">电脑报Visual
C++网络教程</font></a></span></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="4">4.3</font><font color="#3973DE" size="4">
状态栏的设计与实现</font><font FACE="Times New Roman" size="4"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">状态栏实际上是个窗口,一般分为几个窗格,每个窗格显示不同的信息。</font><font FACE="Times New Roman" SIZE="3">AppWizard</font><font SIZE="3">会为应用程序自动创建一个状态栏,该状态栏包括几个窗格,分别用来显示状态栏提示和</font><font FACE="Times New Roman" SIZE="3">CAPS LOCK</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">NUM LOCK </font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">SCROLL LOCK</font><font SIZE="3">键的状态。在</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">中,状态栏的功能由</font><font FACE="Times New Roman" SIZE="3">CStatusBar</font><font SIZE="3">类实现。</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">创建一个状态栏需要以下几个步骤:</p>
<blockquote>
<blockquote>
<p>构建一个</font><font FACE="Times New Roman" SIZE="3">CStatusBar</font><font SIZE="3">对象。</p>
<p>调用</font><font FACE="Times New Roman" SIZE="3">CStatusBar::Create</font><font SIZE="3">创建状态栏窗口。</p>
<p>调用</font><font FACE="Times New Roman" SIZE="3">CStatusBar::SetIndicators</font><font SIZE="3">函数分配窗格,并将状态栏的每一个窗格与一个字符串</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">相联系。</font></p>
</blockquote>
</blockquote>
<p> <font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">相应的代码读者可以在</font><font FACE="Times New Roman" SIZE="3">Record</font><font SIZE="3">工程的</font><font FACE="Times New Roman" SIZE="3">CMainFrame::OnCreate</font><font SIZE="3">成员函数中找到。如清单</font><font FACE="Times New Roman" SIZE="3">4.6</font><font SIZE="3">所示。<b></p>
<p>清单</font><font FACE="Times New Roman" SIZE="3">4.6 </font><font SIZE="3">创建状态栏</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">…</font><font FACE="Times New Roman" SIZE="3"></p>
<p>if (!m_wndStatusBar.Create(this) ||</p>
<p>!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)))</p>
<p>{</p>
<p>TRACE0("Failed to create status bar\n");</p>
<p>return -1; // fail to create</p>
<p>}</p>
<p></font><font SIZE="3">…</font><font FACE="Times New Roman" SIZE="3"></p>
<p>SetIndicators</font><font SIZE="3">函数的第一个参数</font><font FACE="Times New Roman" SIZE="3">indicators</font><font SIZE="3">是一个</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">数组,在</font><font FACE="Times New Roman" SIZE="3">CMainFrame</font><font SIZE="3">类所在的</font><font FACE="Times New Roman" SIZE="3">CPP</font><font SIZE="3">文件的开头部分可以找到该数组,如清单</font><font FACE="Times New Roman" SIZE="3">4.7</font><font SIZE="3">所示。<b></p>
<p>清单</font><font FACE="Times New Roman" SIZE="3">4.7 ID</font><font SIZE="3">数组</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p>static UINT indicators[] =</p>
<p>{</p>
<p>ID_SEPARATOR, // status line indicator</p>
<p>ID_INDICATOR_CAPS,</p>
<p>ID_INDICATOR_NUM,</p>
<p>ID_INDICATOR_SCRL,</p>
<p>};</p>
<p> <b></p>
<p></b> </p>
<p ALIGN="JUSTIFY">indicator</font><font SIZE="3">数组提供了状态栏窗格的分配信息,它的第一项一般为</font><font FACE="Times New Roman" SIZE="3">ID_SEPARATOR</font><font SIZE="3">,该</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">对应的窗格用来显示命令提示信息,后三项都是字符串</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">,读者可以在</font><font FACE="Times New Roman" SIZE="3">String Table</font><font SIZE="3">字符串资源中找到这三个字符串分别是</font><font FACE="Times New Roman" SIZE="3">CAP</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">NUM</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">SCRL</font><font SIZE="3">。它们对应的三个窗格用来显示键盘的状态。</p>
<p ALIGN="JUSTIFY">现在让我们来给状态栏再加一个时间窗格,它将用来显示系统时间。显示的格式是</font><font FACE="Times New Roman" SIZE="3">hh:mm:ss</font><font SIZE="3">,即时</font><font FACE="Times New Roman" SIZE="3">:</font><font SIZE="3">分</font><font FACE="Times New Roman" SIZE="3">:</font><font SIZE="3">秒。</p>
<p ALIGN="JUSTIFY">首先在</font><font FACE="Times New Roman" SIZE="3">indicators</font><font SIZE="3">数组的</font><font FACE="Times New Roman" SIZE="3">ID_SEPARATOR</font><font SIZE="3">项之后插入一个名为</font><font FACE="Times New Roman" SIZE="3">ID_INDICATOR_CLOCK</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">。然后找到并双击名为</font><font FACE="Times New Roman" SIZE="3">String Table</font><font SIZE="3">的字符串资源,打开字符串资源编辑窗口。接着在编辑窗口内按</font><font FACE="Times New Roman" SIZE="3">Insert</font><font SIZE="3">键以插入一个新的字符串,请指定字符串的</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">ID_INDICATOR_CLOCK</font><font SIZE="3">,内容为</font><font FACE="Times New Roman" SIZE="3">00:00:00</font><font SIZE="3">。状态栏将根据字符串的长度来确定相应窗格的缺省宽度,所以指定为</font><font FACE="Times New Roman" SIZE="3">00:00:00</font><font SIZE="3">就为时间的显示预留了空间。<b></p>
<div align="center"><center><table border="2" cellpadding="2" cellspacing="0" width="90%" bgcolor="#A3BDEF">
<tr>
<td width="100%"></b>提示</font><font FACE="Times New Roman" SIZE="3">:</font><font SIZE="3">上述方法不能动态改变窗格宽度,并且有时是不精确的,当系统字体改变时,这种做法可能会导致一些误差。考虑到该方法简单直观,且一般情况下问题不大,故本文用它来举例。如果读者对动态、精确地指定窗格感兴趣,请参看</font><font FACE="Times New Roman" SIZE="3">Visual C++ 5.0</font><font SIZE="3">随光盘提供的一个名为</font><font FACE="Times New Roman" SIZE="3">NPP</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">例子(在</font><font FACE="Times New Roman" SIZE="3">samples\mfc\general\npp</font><font SIZE="3">目录下)。<b></td>
</tr>
</table>
</center></div><p></b></font> <font SIZE="3"></p>
<p ALIGN="JUSTIFY">时间窗格显示的时间必须每隔一秒钟更新一次。更新时间窗格的正文可调用</font><font FACE="Times New Roman" SIZE="3">CStatusBar:: SetPaneText</font><font SIZE="3">函数,要定时更新,则应利用</font><font FACE="Times New Roman" SIZE="3">WM_TIMER</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">WM_TIMER</font><font SIZE="3">消息,而这个时间间隔可由用户指定。</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">的</font><font FACE="Times New Roman" SIZE="3">Window</font><font SIZE="3">类提供了</font><font FACE="Times New Roman" SIZE="3">WM_TIMER</font><font SIZE="3">消息处理函数</font><font FACE="Times New Roman" SIZE="3">OnTimer</font><font SIZE="3">,我们应在该函数内进行更新时间窗格的工作。</p>
<p ALIGN="JUSTIFY">请读者利用</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">给</font><font FACE="Times New Roman" SIZE="3">CMainFrame</font><font SIZE="3">类加入</font><font FACE="Times New Roman" SIZE="3">WM_TIMER</font><font SIZE="3">的消息处理函数</font><font FACE="Times New Roman" SIZE="3">OnTimer</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">WM_CLOSE</font><font SIZE="3">消息的处理函数</font><font FACE="Times New Roman" SIZE="3">OnClose</font><font SIZE="3">,具体方法是在</font><font FACE="Times New Roman" SIZE="3">Class name</font><font SIZE="3">栏中选择</font><font FACE="Times New Roman" SIZE="3">CMainFrame</font><font SIZE="3">,在</font><font FACE="Times New Roman" SIZE="3">Object IDs</font><font SIZE="3">栏中选择</font><font FACE="Times New Roman" SIZE="3">CMainFrame</font><font SIZE="3">,在</font><font FACE="Times New Roman" SIZE="3">Messages</font><font SIZE="3">栏中找到</font><font FACE="Times New Roman" SIZE="3">WM_TIMER</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">WM_CLOSE</font><font SIZE="3">项,分别双击之然后按</font><font FACE="Times New Roman" SIZE="3">OK</font><font SIZE="3">按钮退出</font><font FACE="Times New Roman" SIZE="3">ClassWizard</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3">CMainFrame::OnClose</font><font SIZE="3">函数是在关闭主框架窗口是被调用的,程序可以在该函数中做一些清除工作。</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3">接下来请按清单</font><font FACE="Times New Roman" SIZE="3">4.8</font><font SIZE="3">修改程序。<b></p>
<p>清单</font><font FACE="Times New Roman" SIZE="3">4.8 CMainFrame</font><font SIZE="3">类的部分代码</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p>int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</p>
<p>{</p>
<p></font><font SIZE="3">…</font><font FACE="Times New Roman" SIZE="3"></p>
<p></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"><b></p>
<p>SetTimer(1,1000,NULL);</b></p>
<p>return 0;</p>
<p>}</p>
<p>void CMainFrame::OnTimer(UINT nIDEvent) </p>
<p>{</p>
<p>// TODO: Add your message handler code here and/or call default</p>
<p> <b></p>
<p>CTime time;</p>
<p>time=CTime::GetCurrentTime();</p>
<p>CString s=time.Format("%H:%M:%S");</p>
<blockquote>
<blockquote>
<blockquote>
<blockquote>
<blockquote>
<blockquote>
<blockquote>
<blockquote>
<blockquote>
<p>m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_CLOCK),s);</b></p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -