设为首页 加入收藏

TOP

5.4.4 工具条的编程技术
2013-10-06 23:59:07 来源: 作者: 【 】 浏览:69
Tags:5.4.4 工具 编程 技术

5.4.4  工具条的编程(www.cppentry.com)技术
本节将讨论一些与工具条有关的编程(www.cppentry.com)技术,主要包括命令处理、命令更新、按钮风格和工具条的隐藏/显示等技术。
【实例5-4】  工具条的编程(www.cppentry.com)技术
光盘路径   /05/record/
实例目的   工具条的编程(www.cppentry.com)技术
本实例通过创建一个录音的窗口,在窗口上添加录音的基本工具按钮来学习工具条的编程(www.cppentry.com)技术。
1.创建工程
启动Microsoft Visual Studio 6.0,在IDE中依次选择“FileNew”菜单命令,或直接按快捷键“Ctrl+N”,打开“New”对话框。
在“New”对话框中单击“Projects”选项卡,在列表框中选择“MFC AppWizard(.exe)”项,在“Project name”文本框中输入“record”,其他使用默认值,单击“OK”按钮,弹出“MFC AppWizard-Step1”对话框。
在“MFC AppWizard-Step1”对话框中,选中“Multiple Document”单选按钮,其他使用默认值,然后单击“Finish”按钮,在弹出的“New Project Information”对话框中单击“OK”按钮,就可以完成工程的创建。
2.添加资源
在工作区中选择的Resource View标签,转到资源编辑窗口,双击“Toolbar IDR_MAINFRAME”条目打开该菜单资源的编辑界面。
双击对后面的空白虚线框,为其添加一个工具按钮,其ID为:ID_RECORD_ START。
用 2 的方法添加另一个工具按钮,其ID为:ID_RECORD_STOP。完成添加后的界面,如图5-50所示。


图5-50  添加工具

3.添加响应函数
要使菜单和工具条执行命令,光为它们指定命令ID是不行的,必须为每个命令ID定义命令处理函数。如果不为命令定义命令处理函数或下面将要提到的命令更新处理函数,则框架将自动使该命令对应的菜单项和按钮禁止(灰化)。
在IDE主菜单项中依次选择“View”→“ClassWizard”,打开“MFC ClassWizard”对话框,选择“Member Maps”选项卡。
在“Project”下拉列表框中选择“record”,在“Class name”栏中选择“CMainFrame”,在“Object IDs”栏中选择“ID_RECORD_START”,在Messages栏中双击“COMMAND”项,则ClassWizard会弹出一个对话框询问命令处理函数的名字,使用其提供的函数名即可。单击“OK”按钮后,函数OnRecordStart就被加入到了Member functions栏中。
仿照第   步,为ID_RECORD_STOP定义一个命令处理函数。单击“OK”按钮关闭ClassWizard对话框。这时读者会发现CMainFrame类多了两个成员函数,OnRecordStart和OnRecordStop。创建后的界面如图5-51所示。


图5-51  “MFC ClassWizard”对话框

4.添加代码
现在要在这两个命令处理函数中插入相应的源代码以实现其功能。当然,这里不会真的实现开始录音和停止录音的功能。我们只是让这两个函数发出一个声音,象征性地表示功能的执行,具体代码如下所示。
OnRecordStart和OnRecordStop函数:
 
编译并运行record,可以看到Start和Stop命令已经可以执行了,如图5-52所示。


图5-52  运行程序结果

5.命令更新
虽然Start和Stop命令可以执行了,但是还有一个不足之处。在没有开始录音之前,Stop命令应该是禁止的,也即对应的菜单项和按钮应是禁止的,这是因为此时没有必要执行该命令。录音开始后,Stop命令应该允许,而Start命令则应变为禁止。我们可以利用MFC的命令更新机制实现此逻辑功能。
在菜单下拉之前,或在工具条按钮处在空闲循环期间,MFC会发一个更新命令,这将导致命令更新处理函数的调用。命令更新处理函数可以根据情况,使用户接口对象(主要指菜单项和工具条按钮)允许或禁止。定义命令更新处理函数的方法如下。
在IDE主菜单项中依次选择“View”→“ClassWizard”,或按快捷键“Ctrl+W”,打开“MFC ClassWizard”对话框,选择“Member Maps”选项卡。
在Class name栏中选择CMainFrame,在Object IDs栏中选择ID_RECORD_START,在Messages栏中双击UPDATE_COMMAND_UI项,则ClassWizard会弹出一个对话框询问命令更新处理函数的名字,使用其提供的函数名即可。单击“OK”按钮后,函数OnUpdateRecordStart就被加入到了Member functions栏中。
仿照步骤  ,为ID_RECORD_STOP定义一个命令更新处理函数。完成后的界面如图5-53所示。


图5-53 “MFC ClassWizard”对话框

单击“OK”按钮关闭MFC ClassWizard对话框。这时读者会发现CMainFrame类多了两个成员函数,OnUpdateRecordStart和OnUpdateRecordStop。
命令更新处理函数有一个参数是CCmdUI类的指针,通过调用CCmdUI类的成员函数Enable(TRUE)或Enable(FALSE)可以使用户接口对象允许或禁止。需要给CMainFrame加一个布尔型成员变量以表明是否正在录音,这样命令更新处理函数可根据这个变量来决定用户接口对象的状态。请读者在CMainFrame类内加入下面一行代码:
 
接下来请读者按下面代码进行修改。
 
 
m_bWorking的初值应是FALSE,对它的初始化工作在CMainFrame的构造函数中完成。m_bWorking的值在处理Start和Stop命令时会被更新以反映当前的状态。两个命令更新处理函数都调用了CCmdUI::Enable,该函数根据m_bWorking的值来更新命令接口对象。
编译并运行Record,现在Start和Stop命令的逻辑功能已经实现了,如图5-54所示。


图5-54  程序运行结果

在图5-54中我们看出,在没有开始录音之前,Start命令是允许的,Stop命令是禁止的,也即对应的菜单项和按钮应是禁止的,完成了命令的更新功能。
6.按钮风格
在record程序中,用户可以选择两种采样频率来录音。用户接口对象应该能反映出当前的采样频率。普通的工具条按钮在按下后会立刻弹起来,我们希望Record程序的频率选择按钮具有单选按钮的风格,即当用户选择了一种采样频率时,该采样频率对应的按钮一直处于按下的状态,而另一个频率选择按钮应处于弹起状态。
我们可以利用CCmdUI::SetCheck函数来实现这一功能,在命令更新函数中调用CCmdUI::SetCheck(TRUE)或CCmdUI::SetCheck(FALSE)可将用户接口对象设定为选中或不选中状态,当一个用户接口对象被选中时,相应的工具按钮会处于按下的状态,并且相应的菜单项的前面会加上一个选中标记。这里需要给CMainFrame类加一个布尔型成员变量以表明当前的采样频率。请读者在CMainFrame类内加入下面一行代码:
 
接下来请读者按如下代码进行修改。
 
m_bHighQuality的初值是TRUE,即缺省时是高频采样,对它的初始化工作在CMainFrame的构造函数中完成。m_bHighQuality的值在处理High quality和Low quality命令时会被更新以反映当前的状态。两个命令更新处理函数都调用了CCmdUI::SetCheck,该函数根据m_bHighQuality的值来更新命令接口对象,从而使工具条按钮具有了单选按钮的风格。
编译并运行Record,读者可以看到具有新风格的工具条按钮。当选择采样频率时,相应的菜单项前会出现一个选中标记,相应的工具条按钮会被按下,如图5-55所示。


图5-55  程序运行结果

7.实现工具条的隐藏/显示
读者可能已经试过了record程序的“查看”菜单的功能。通过该菜单用户可以隐藏/显示工具条和状态栏,这个功能是由AppWizard自动实现的。由于第二个工具条是手工建立的,因此它不会自动具备隐藏/显示功能。但我们可以通过编程(www.cppentry.com)来实现第二个工具条的隐藏/显示。
打开IDR_MAINFRAME菜单资源。在“查看”菜单中加入一个名为“工具”的菜单项,指定其ID为ID_VIEW_TOOLBAR,并在Prompt栏中输入“显示或隐藏工具栏\n显隐工具栏”。
按“Ctrl+W”键进入ClassWizard。在“Class name”栏中选择“CMainFrame”,在“Object IDs”栏中选择“ID_VIEW_TOOLBAR”,并为该命令ID定义命令处理函数OnViewToolbar和命令更新处理函数OnUpdateViewToolbar。
按下面内容进行修改程序。
 
调用CWnd::ShowWindow(SW_SHOW)或CWnd::ShowWindow(SW_HIDE)可以显示或隐藏窗口。由于工具条也是窗口,CToolBar是CWnd类的继承类,故该函数也是CToolBar的成员。在命令处理函数OnViewToolbar中,我们调用CToolBar::ShowWindow来显示/隐藏工具条,在调用时会利用CWnd::IsWindowVisible函数做出判断,如果工具条是可见的,就传给ShowWindow函数SW_HIDE参数以隐藏工具条,否则,就传SW_SHOW参数显示工具条。接着要调用CMainFrame::RecalcLayout以重新调整主框架窗口的布局。
命令更新处理函数OnUpdateViewToolbar会根据工具条是否可见使“查看”→“工具”菜单项选中或不选中。
8.编译并运行程序
编译并运行record程序,其结果如图5-56所示。


图5-56  程序运行结果

单击“查看”菜单下的“工具”菜单项,我们就会发现刚创建的工具条被隐藏起来,如图5-57所示。


图5-57  隐藏工具条

再次单击“工具”菜单项,刚刚隐藏的工具条又会显示出来。

【责任编辑:杨硕 TEL:(010)68476636-8001】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇5.4 状态栏和工具栏 下一篇5.3.2 位图资源的创建与使用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: