📄 chap4_1.htm
字号:
</center></div></b></font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY"></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">Start</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">Stop</font><font SIZE="3">菜单项及按钮都是灰色的。这个现象是正常的,其原因将在</font><font FACE="Times New Roman" SIZE="3">4.2</font><font SIZE="3">节解释。有趣的是工具条可以被拖动(请在工具条的空白地方拖动)并停泊在主框架窗口的任何其它边上,并且工具条是可以浮动的,即当用鼠标双击工具条的空白处时,工具条变成了一个浮动窗口,可被拖动到屏幕上的任意地方。这些有趣的现象将在</font><font FACE="Times New Roman" SIZE="3">4.2</font><font SIZE="3">节解释。不管怎么说,创建和修改工具条的任务已经完成了。</font><font FACE="Times New Roman" SIZE="3"></p>
<b><p ALIGN="JUSTIFY"></b></font><font color="#3973DE" FACE="Times New Roman" SIZE="3">4.1.2</font><font SIZE="3" color="#3973DE">手工创建</font><font FACE="Times New Roman" SIZE="3"></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">Record</font><font SIZE="3">程序的声音采样频率有</font><font FACE="Times New Roman" SIZE="3">11KHZ</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">44KHZ</font><font SIZE="3">两档选择,现在我们的任务是再创建一个工具条,可让用户对这两种档次进行选择。本来这样的功能应该位于第一个工具条内,但为了演示工具条的手工创建,这里不妨来个多此一举。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></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">Developer Studio</font><font SIZE="3">中,请选择命令</font><font FACE="Times New Roman" SIZE="3">File->Open Workspace</font><font SIZE="3">打开</font><font FACE="Times New Roman" SIZE="3">Record</font><font SIZE="3">工程。首先要对原来的菜单进行修改,步骤如下:</p>
<blockquote>
<ol>
<li><p ALIGN="JUSTIFY">打开<font FACE="Times New Roman" SIZE="3">IDR_MAINFRAME</font>菜单资源</p>
</li>
<li><p ALIGN="JUSTIFY">双击<font FACE="Times New Roman" SIZE="3">Record</font>菜单底端的空白项,在其属性窗口中选中<font FACE="Times New Roman" SIZE="3">Separator</font>,这样就加入了一条分隔线。</p>
</li>
<li><p ALIGN="JUSTIFY">在分隔线下面加入两个菜单项,其属性如表<font FACE="Times New Roman" SIZE="3">4.1</font>所示。</p>
</li>
</ol>
</blockquote>
</font><p> <b><font SIZE="3"></p>
<p ALIGN="CENTER">表</font><font FACE="Times New Roman" SIZE="3">4.1 </font><font SIZE="3">菜单项的属性</font></b></p>
<table BORDER="1" CELLSPACING="1" CELLPADDING="1" WIDTH="579">
<tr>
<td WIDTH="33%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="CENTER">Caption</font></td>
<td WIDTH="33%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="CENTER">ID</font></td>
<td WIDTH="33%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="CENTER">Prompt</font></td>
</tr>
<tr>
<td WIDTH="33%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="CENTER">&Low quality</font></td>
<td WIDTH="33%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="CENTER">ID_LOW_QUALITY</font></td>
<td WIDTH="33%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="CENTER">Low
quality(11k)\n11k</font></td>
</tr>
<tr>
<td WIDTH="33%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="CENTER">&High quality</font></td>
<td WIDTH="33%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="CENTER">ID_HIGH_QUALITY</font></td>
<td WIDTH="33%"><font FACE="Times New Roman" SIZE="3"><p ALIGN="CENTER">High
quality(44k)\n44k</font></td>
</tr>
</table>
<font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY"></font><font SIZE="3">接着要创建一个新的工具条资源,请按以下步骤进行:</p>
<blockquote>
<blockquote>
<p ALIGN="JUSTIFY">选择</font><font FACE="Times New Roman" SIZE="3">Insert->Resource</font><font SIZE="3">命令,然后在</font><font FACE="Times New Roman" SIZE="3">Insert Resource</font><font SIZE="3">对话框中选中</font><font FACE="Times New Roman" SIZE="3">Toolbar</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">Toolbar</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">IDR_TOOLBAR1</font><font SIZE="3">的新资源。</p>
<p ALIGN="JUSTIFY">在新工具条中加入两个按钮,如图</font><font FACE="Times New Roman" SIZE="3">4.5</font><font SIZE="3">所示。每个按钮上都画了一些竖线,线稀的按钮代表低频率采样,线密的按钮代表高频率采样。</p>
<p ALIGN="center"><img src="T4_5.gif" alt="T4_5.tif (115754 bytes)" WIDTH="459" HEIGHT="234"></p>
<p ALIGN="center">图</font><font FACE="Times New Roman" SIZE="3">4.5 </font><font SIZE="3">新创建的工具条资源</p>
<p ALIGN="JUSTIFY">分别为两个新加的按钮指定命令</font><font FACE="Times New Roman" SIZE="3">ID</font><font SIZE="3">为</font><font FACE="Times New Roman" SIZE="3">ID_LOW_QUALITY</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">ID_HIGH_QUALITY</font><font SIZE="3">。</font></p>
</blockquote>
</blockquote>
<p> <font FACE="Times New Roman" SIZE="3"></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"></p>
<p ALIGN="JUSTIFY"></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">CToolBar</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">MFC</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">MFC</font><font SIZE="3">标准类</font><font FACE="Times New Roman" SIZE="3">CFrameWnd</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">m_wndToolbar</font><font SIZE="3">的成员。双击该成员,则</font><font FACE="Times New Roman" SIZE="3">Developer Studio</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">m_wndToolbar</font><font SIZE="3">成员的定义处。</font><font FACE="Times New Roman" SIZE="3"></p>
<div align="center"><center><table border="2" cellpadding="2" cellspacing="0" width="90%" bgcolor="#BBFFFF">
<tr>
<td width="100%"></font><b><font SIZE="3"><font SIZE="3">提示</font></font><font FACE="Times New Roman" SIZE="3">:</font><font SIZE="3"><font SIZE="3">在类视图中双击某一个类名,则该类所在的头文件会自动打开。若双击某一个类的成员,则会自动切换到对该成员的定义处。</font></font></b><font FACE="Times New Roman" SIZE="3"></td>
</tr>
</table>
</center></div><p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">对</font><font FACE="Times New Roman" SIZE="3">m_wndToolBar</font><font SIZE="3">的定义如下:</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">CToolBar m_wndToolBar;</p>
<p ALIGN="JUSTIFY"></font><font SIZE="3">由此可见</font><font FACE="Times New Roman" SIZE="3">m_wndToolBar</font><font SIZE="3">是一个</font><font FACE="Times New Roman" SIZE="3">CToolBar</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"><b></p>
<p ALIGN="JUSTIFY">CToolBar m_wndToolBar1;</b></p>
<p ALIGN="JUSTIFY">m_wndToolBar1</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">CToolBar</font><font SIZE="3">对象就完事了。实际的创建工具条的工作不会在构造</font><font FACE="Times New Roman" SIZE="3">CToolBar</font><font SIZE="3">对象时完成,只有调用了类</font><font FACE="Times New Roman" SIZE="3">CToolBar</font><font SIZE="3">的一些成员函数后,创建工作才能结束。</font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></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">OnCreate</font><font SIZE="3">函数是在创建窗口时被调用的,这时窗口的创建已部分完成,窗口对象的</font><font FACE="Times New Roman" SIZE="3">m_hWnd</font><font SIZE="3">成员中存放的</font><font FACE="Times New Roman" SIZE="3">HWND</font><font SIZE="3">句柄也已有效,但窗口还是不可见的。因此一般在</font><font FACE="Times New Roman" SIZE="3">OnCreate</font><font SIZE="3">函数中作一些诸如创建子窗口的初始化工作。</font><font FACE="Times New Roman" SIZE="3"></p>
</font><font SIZE="3"><b><div align="center"><center><table border="2" cellpadding="2" cellspacing="0" width="90%" bgcolor="#BBFFFF">
<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">OnCreate</font><font SIZE="3">中创建子窗口。在构造函数中,父窗口并没有创建,如果在这时创建子窗口,则将会因为得不到父窗口的有效</font><font FACE="Times New Roman" SIZE="3">HWND</font><font SIZE="3">句柄而导致创建失败。<b></td>
</tr>
</table>
</center></div></b></font><font FACE="Times New Roman" SIZE="3"><p ALIGN="JUSTIFY"></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.1</font><font SIZE="3">的黑体字所示。在以后,凡是程序中手工修改的部分,一般都会用黑体显示。</font><b><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY"></font> <font SIZE="3"></p>
<p ALIGN="JUSTIFY">清单</font><font FACE="Times New Roman" SIZE="3">4.1 </font><font SIZE="3">修改后的</font><font FACE="Times New Roman" SIZE="3">CMainFrame::OnCreate</font><font SIZE="3">函数</font></b><font FACE="Times New Roman" SIZE="3"></p>
<p ALIGN="JUSTIFY">int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">if (CFrameWnd::OnCreate(lpCreateStruct) == -1)</p>
<p ALIGN="JUSTIFY">return -1;</p>
<p ALIGN="JUSTIFY"> </p>
<p ALIGN="JUSTIFY">if (!m_wndToolBar.Create(this) ||</p>
<p ALIGN="JUSTIFY">!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))</p>
<p ALIGN="JUSTIFY">{</p>
<p ALIGN="JUSTIFY">TRACE0("Failed to create toolbar\n");</p>
<p ALIGN="JUSTIFY">return -1; // fail to create</p>
<p ALIGN="JUSTIFY">}</p>
<p ALIGN="JUSTIFY"> </p>
<p> <b></p>
<p ALIGN="JUSTIFY">if (!m_wndToolBar1.Create(this) ||</p>
<p ALIGN="JUSTIFY">!m_wndToolBar1.LoadToolBar(IDR_TOOLBAR1))</p>
<p ALIGN="JUSTIFY">{</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -