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

📄 chap4_1.htm

📁 VC++编程实例。非常详细
💻 HTM
📖 第 1 页 / 共 2 页
字号:
        Resource对话框中选中Toolbar。按了OK按钮后,在Toolbar资源类下就会出现一个ID为IDR_TOOLBAR1的新资源。</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">在新工具条中加入两个按钮,如图4.5所示。每个按钮上都画了一些竖线,线稀的按钮代表低频率采样,线密的按钮代表高频率采样。</span></p>
        <p ALIGN="center"><span style="font-size: 9pt"><img src="T4_5.gif"
        alt="T4_5.tif (115754 bytes)" WIDTH="459" HEIGHT="234"></span></p>
        <p ALIGN="center"><span style="font-size: 9pt">图4.5 新创建的工具条资源</span></p>
        <p ALIGN="JUSTIFY"><span style="font-size: 9pt">分别为两个新加的按钮指定命令ID为ID_LOW_QUALITY和ID_HIGH_QUALITY。</span></p>
      </blockquote>
    </blockquote>
    <p> </p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">  要把这个新设计的工具条加入到程序中,需要在程序中加入一些与创建有关的源代码。在创建第一个工具条时,AppWizard在程序中自动加入了创建源代码,通过仿制这些代码,我们很容易创建出第二个工具条。</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">  在MFC中,工具条的功能由类CToolBar实现。工具条实际上是主框架窗口的子窗口,因此工具条对象应该依附于主框架窗口对象。在AppWizard创建的MFC程序中,主框架窗口的类名是CMainFrame,该类是MFC标准类CFrameWnd类的派生类。将项目工作区切换至类视图并展开CMainFrame类,读者会发现该类有一个名为m_wndToolbar的成员。双击该成员,则Developer 
    Studio会自动打开类CMainFrame所在的头文件,并将光标停在对m_wndToolbar成员的定义处。</span></p>
    <div align="center"><center><table border="2" cellpadding="2" cellspacing="0" width="90%"
    bgcolor="#BBFFFF">
      <tr>
        <td width="100%"><span style="font-size: 9pt"><b>提示:在类视图中双击某一个类名,则该类所在的头文件会自动打开。若双击某一个类的成员,则会自动切换到对该成员的定义处。</b></span></td>
      </tr>
    </table>
    </center></div><p ALIGN="JUSTIFY"><span style="font-size: 9pt">对m_wndToolBar的定义如下:</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">CToolBar m_wndToolBar;</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">由此可见m_wndToolBar是一个CToolBar对象,它是CMainFrame的成员。现在请紧接着该成员加入一个新的成员:</span><b></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">CToolBar m_wndToolBar1;</span></b></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">  m_wndToolBar1代表第二个工具条。读者不要以为给CMainFrame加入一个CToolBar对象就完事了。实际的创建工具条的工作不会在构造CToolBar对象时完成,只有调用了类CToolBar的一些成员函数后,创建工作才能结束。</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">  对工具条的实际创建工作在CMainFrame::OnCreate函数中完成。OnCreate函数是在创建窗口时被调用的,这时窗口的创建已部分完成,窗口对象的m_hWnd成员中存放的HWND句柄也已有效,但窗口还是不可见的。因此一般在OnCreate函数中作一些诸如创建子窗口的初始化工作。</span></p>
    <b><div align="center"><center><table border="2" cellpadding="2" cellspacing="0"
    width="90%" bgcolor="#BBFFFF">
      <tr>
        <td width="100%"></b><span style="font-size: 9pt">提示:初学者一个易犯的错误是在构造函数而不是在OnCreate中创建子窗口。在构造函数中,父窗口并没有创建,如果在这时创建子窗口,则将会因为得不到父窗口的有效HWND句柄而导致创建失败。</span></td>
      </tr>
    </table>
    </center></div><p ALIGN="JUSTIFY"><span style="font-size: 9pt">  找到CMainFrame::OnCreate函数,对该函数进行一些修改,修改的部分如清单4.1的黑体字所示。在以后,凡是程序中手工修改的部分,一般都会用黑体显示。</span><b></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">清单4.1 修改后的CMainFrame::OnCreate函数</span></b></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">int CMainFrame::OnCreate(LPCREATESTRUCT 
    lpCreateStruct)</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">if (CFrameWnd::OnCreate(lpCreateStruct) == 
    -1)</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">return -1;</span></p>
    <p ALIGN="JUSTIFY"> </p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">if (!m_wndToolBar.Create(this) ||</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">TRACE0(&quot;Failed to create 
    toolbar\n&quot;);</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">return -1; // fail to create</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
    <p ALIGN="JUSTIFY"> </p>
    <p><b> </p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">if (!m_wndToolBar1.Create(this) ||</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">!m_wndToolBar1.LoadToolBar(IDR_TOOLBAR1))</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">TRACE0(&quot;Failed to create 
    toolbar\n&quot;);</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">return -1; // fail to create</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></b></p>
    <p ALIGN="JUSTIFY"> </p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">if (!m_wndStatusBar.Create(this) ||</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">!m_wndStatusBar.SetIndicators(indicators,</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">sizeof(indicators)/sizeof(UINT)))</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">TRACE0(&quot;Failed to create status 
    bar\n&quot;);</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">return -1; // fail to create</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
    <p ALIGN="JUSTIFY"> </p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// TODO: Remove this if you don't want 
    tool tips or a resizeable toolbar</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() 
    |</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">CBRS_TOOLTIPS | CBRS_FLYBY | 
    CBRS_SIZE_DYNAMIC);</span></p>
    <p ALIGN="JUSTIFY"> </p>
    <blockquote>
      <blockquote>
        <blockquote>
          <blockquote>
            <blockquote>
              <blockquote>
                <blockquote>
                  <blockquote>
                    <b><p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_wndToolBar1.SetBarStyle(m_wndToolBar1.GetBarStyle()|CBRS_TOOLTIPS 
                    | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);</span></p>
                    </b>
                  </blockquote>
                </blockquote>
              </blockquote>
            </blockquote>
          </blockquote>
        </blockquote>
      </blockquote>
    </blockquote>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// TODO: Delete these three lines if you 
    don't want the toolbar to</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">// be dockable</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);</span></p>
    <p><b> </p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY);</span></b></p>
    <p ALIGN="JUSTIFY"> </p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">EnableDocking(CBRS_ALIGN_ANY);</span></p>
    <p ALIGN="JUSTIFY"> </p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">DockControlBar(&amp;m_wndToolBar);</span></p>
    <p><b> </p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">DockControlBar(&amp;m_wndToolBar1);</span></b></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">return 0;</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
    <b><p ALIGN="JUSTIFY"></b><span style="font-size: 9pt">  注意在CMainFrame::OnCreate函数首先调用了CFrameWnd::OnCreate。这行代码是AppWizard自动加入的,但有必要解释一下。CMainFrame是CFrameWnd类的继承类,在CMainFrame::OnCreate中首先要调用基类CFrameWnd的OnCreate函数,因为基类也要进行一些初始化工作,而基类的OnCreate函数不会自动调用,因此需要在继承类的OnCreate函数中显式调用。OnCreate实际上是WM_CREATE消息的消息处理函数,读者可能要问,为什么是派生类的OnCreate处理WM_CREATE消息,而不是基类的OnCreate呢。如果读者仔细观察OnCreate函数在CMainFrame类头文件中的说明,就会发现在该函数前有一个afx_msg前缀。afx_msg的作用与virtual关键字类似,它使得被说明的函数有虚拟函数的特性,即由继承类而不是基类的处理函数来处理消息。</span></p>
    <p ALIGN="JUSTIFY"><span style="font-size: 9pt">  读者可以看出黑体的代码是仿照第一个工具条的创建代码进行编写的。事实上,笔者不过是将原来的代码复制一份,然后在略作修改而已。</span></p>
    <b><div align="center"><center><table border="2" cellpadding="2" cellspacing="0"
    width="90%" bgcolor="#BBFFFF">
      <tr>
        <td width="100%"></b><span style="font-size: 9pt">提示: 
        读者不必为这种“抄袭”行为感到羞愧。由于Visual C++博大精深,各种类和函数成百上千,除非你有外星人一般的记忆力,否则是不可能记住所有东西的。用Visual 
        C++编程,重要的是理解而不是记忆。只要你理解了程序的来龙去脉,就可以最大限度的利用现有的成熟代码,提高程序的开发效率和可靠性。</span></td>
      </tr>
    </table>
    </center></div><p ALIGN="JUSTIFY"><span style="font-size: 9pt">  对第二个工具条的创建代码的解释是:首先,调用CToolBar::Create以创建工具条窗口,注意Create函数的参数是this指针,这是因为主框架窗口是工具条的父窗口。接着调用CToolbar::LoadToolBar(IDR_TOOLBAR1)以载入工具条资源。然后调用CToolBar::SetBarStyle指定工具条的风格,在调用该函数时先调用CToolBar::GetBarStyle取得工具条的风格,然后在原有风格的基础上又指定了CBRS_TOOLTIPS、 
    CBRS_FLYBY和CBRS_SIZE_DYNAMIC风格,这使得工具条可显示工具提示,并可以动态改变尺寸。接着调用CToolBar::EnableDocking(CBRS_ALIGN_ANY)使工具条是可以停泊的,但还需调用CFrameWnd::EnableDocking(CBRS_ALIGN_ANY),只有这样才能实现可停泊的工具条。最后调用CFrameWnd::DockControlBar以停泊工具条。</span><b></p>
    <p ALIGN="JUSTIFY"></b><span style="font-size: 9pt">  编译并运行Record看看,现在Record程序已经拥有两个工具条了。至此创建工具条的任务已经完成,下面需要对工具条编程,以使其能够发挥执行命令的功能。</span></p>
    <div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="615">
      <tr>
        <td><a href="chap4.htm"><span style="font-size: 9pt">上一页</span></a></td>
        <td><p align="right"><a href="chap4_2.htm"><span style="font-size: 9pt">下一页</span></a></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 + -