📄 chap4_3.htm
字号:
<p><font size="3"><span style="font-size: 9pt">m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_CLOCK),s);</span></font></b></p>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
</blockquote>
<p><font size="3"><span style="font-size: 9pt">CFrameWnd::OnTimer(nIDEvent);</span></font></p>
<p><font size="3"><span style="font-size: 9pt">}</span></font></p>
<p><font size="3"><span style="font-size: 9pt">void CMainFrame::OnClose() </span></font></p>
<p><font size="3"><span style="font-size: 9pt">{</span></font></p>
<p><font size="3"><span style="font-size: 9pt">// TODO: Add your message handler code here
and/or call default</span></font></p>
<p><b> </p>
<p><font size="3"><span style="font-size: 9pt">KillTimer(1);</span></font></b></p>
<p><font size="3"><span style="font-size: 9pt">CFrameWnd::OnClose();</span></font></p>
<p><font size="3"><span style="font-size: 9pt">}</span></font></p>
<p><font size="3"><span style="font-size: 9pt"> 在CMainFrame::OnCreate函数内调用了CWnd::SetTimer以安装一个计时器,SetTimer的第一个参数指定计时器ID为1,第二个参数则规定了计时器的时间间隔为1000毫秒即1秒。这样,每隔1秒OnTimer函数就会被调用一次。</span></font></p>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt"> 在OnTimer函数中,首先构建了一个CTime对象,接着调用CTime的静态成员函数GetCurrentTime以获得当前的系统时间,然后利用CTime::Format函数返回一个按时:分:秒的格式表示的字符串,最后调用CStatusBar::SetPaneText来更新时间窗格显示的正文。SetPaneText的第一个参数是窗格的索引,对于某一个窗格ID,可调用CStatusBar::CommandToIndex来获得索引。</span></font></p>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt"> 在撤销主框架窗口时应关闭计时器,因此在CMainFrame::OnClose函数内调用了KillTimer函数。</span></font></p>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt"> 现在让我们来看一下CMainFrame的消息映射,在CMainFrame类所在CPP文件的开始部分可以找到该类的消息映射,如清单4.9所示。</span></font><b></p>
<p><font size="3"><span style="font-size: 9pt">清单4.9</span></font></b></p>
<p><font size="3"><span style="font-size: 9pt">BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)</span></font></p>
<p><font size="3"><span style="font-size: 9pt">//{{AFX_MSG_MAP(CMainFrame)</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_WM_CREATE()</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_COMMAND(ID_RECORD_STOP, OnRecordStop)</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_COMMAND(ID_RECORD_START, OnRecordStart)</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_UPDATE_COMMAND_UI(ID_RECORD_START,
OnUpdateRecordStart)</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_UPDATE_COMMAND_UI(ID_RECORD_STOP,
OnUpdateRecordStop)</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_COMMAND(ID_HIGH_QUALITY, OnHighQuality)</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_COMMAND(ID_LOW_QUALITY, OnLowQuality)</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_UPDATE_COMMAND_UI(ID_HIGH_QUALITY,
OnUpdateHighQuality)</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_UPDATE_COMMAND_UI(ID_LOW_QUALITY,
OnUpdateLowQuality)</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_COMMAND(ID_VIEW_TOOLBAR1,
OnViewToolbar1)</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR1,
OnUpdateViewToolbar1)</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_WM_TIMER()</span></font></p>
<p><font size="3"><span style="font-size: 9pt">ON_WM_CLOSE()</span></font></p>
<p><font size="3"><span style="font-size: 9pt">//}}AFX_MSG_MAP</span></font></p>
<p><font size="3"><span style="font-size: 9pt">END_MESSAGE_MAP()</span></font></p>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt"> 读者可以看到,在消息映射表中,ClassWizard为消息处理函数和命令处理函数自动加入了消息映射。自动加入的部分呈灰色显示,位于注释行//{{AFX_MSG_MAP和//}}AFX_MSG_MAP
之间。命令处理函数由ON_COMMAND宏来映射,命令更新处理函数由ON_UPDATE_COMMAND_UI,而WM_消息的处理函数由ON_WM_消息宏来映射。</span></font><b></p>
<div align="center"><center><table border="2" cellpadding="2" cellspacing="0" width="90%"
bgcolor="#85A9EB">
<tr>
<td width="100%"></b><font size="3"><span style="font-size: 9pt">提示:今后只要看到//{{AFX_...的注释对,则说明它们之间的部分是ClassWizard自动加入的,这部分呈灰色显示。请不要随便修改它们,更不能把手工加入的部分放在//{{AFX_...注释对内,否则有可能导致ClassWizard出错。</span></font></td>
</tr>
</table>
</center></div><p ALIGN="JUSTIFY"> </p>
<p><font size="3"><span style="font-size: 9pt"> 编译并运行Record
,可以看到状态栏的新变化,最终的界面如图4.8所示。</span></font></p>
<p align="center"><font size="3"><span style="font-size: 9pt"><img src="T4_8.gif"
alt="T4_8.tif (116548 bytes)" WIDTH="398" HEIGHT="268"></span></font><b></p>
<p align="center"></b><font size="3"><span style="font-size: 9pt">图4.8 最终的Record程序</span></font></p>
<p ALIGN="CENTER"><b><font size="3"><span style="font-size: 9pt">小 结</span></font></p>
<p ALIGN="CENTER"></b> </p>
<blockquote>
<p><font size="3"><span style="font-size: 9pt">本章主要向读者介绍了工具条和状态栏的一些实用技术。要点如下:</span></font></p>
</blockquote>
<blockquote>
<blockquote>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt">在MFC中,创建一个窗口一般分两步:1.构建一个窗口对象。构建的方法是定义一个对象或用new操作符动态创建之。2.调用窗口类的Create成员函数。该函数把实际的窗口作出来,并将其HWND保存在窗口的公共数据成员m_hWnd中。</span></font></p>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt">创建工具条和状态栏的工作是在CMainFrame::OnCreate函数中完成的,OnCreate函数是在创建窗口时被调用的,这时窗口的创建已部分完成,窗口对象的HWND句柄也已有效,但窗口还是不可见的。因此一般在OnCreate函数中作一些诸如创建子窗口的初始化工作。</span></font></p>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt">afx_msg前缀保证了正确版本的消息处理函数被调用。</span></font></p>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt">工具条有两个要素:工具条资源和工具条类CToolBar。若用户只需要一个工具条,可利用AppWizard自动生成,然后再修改之。若需要多个工具条,则必须手工创建。</span></font></p>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt">如果不为命令定义命令处理函数或命令更新处理函数,则框架将自动使该命令对应的用户接口对象(主要指菜单项和按钮)禁止。利用ClassWizard可以十分方便的加入命令处理函数和命令更新处理函数。</span></font></p>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt">在菜单下拉之前,或在工具条按钮处在空闲循环期间,MFC会发一个更新命令,这将导致命令更新处理函数的调用。命令更新处理函数利用CCmdUI类来更新用户接口对象。调用CCmdUI::Enable可使用户接口对象允许或禁止,调用CCmdUI::SetCheck可使用户接口对象选中或不选中。</span></font></p>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt">调用CWnd::ShowWindow可以隐藏/显示一个窗口。</span></font></p>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt">要在状态栏中插入新的窗格,需要在indicator数组中插入新的字符串ID。而状态栏将根据这个字符串的长度来确定新窗格的缺省宽度。</span></font></p>
<p ALIGN="JUSTIFY"><font size="3"><span style="font-size: 9pt">调用CStatusBar::
SetPaneText可更新状态栏窗格显示的正文。</span></font></p>
</blockquote>
</blockquote>
<div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="615">
<tr>
<td><font size="3"><span style="font-size: 9pt"><a href="chap4_2.htm">上一页</a></span></font></td>
<td></td>
</tr>
</table>
</center></div><font SIZE="5"><hr noshade color="#3973DE" size="1">
<p align="center"></font><font size="2" color="#000000">本教程由<a
href="http://vcdynasty.yeah.net">Visual C++王朝(Where programmers come together)</a>协助制作<br>
未经许可,请勿以任何形式复制</font></td>
<b>
</tr>
</table>
</center></div></b>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -