⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap4_3.htm

📁 vc教程,真正的程序员用Visual C++。如果你想当程序员
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<html>

<head>
<title>4.3&nbsp; 状态栏的设计与实现</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" background="../../bg.gif">
<font SIZE="5"><b><div align="center"><center>

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -