欢迎来到天天文库
浏览记录
ID:7781489
大小:73.50 KB
页数:9页
时间:2018-02-25
《4.2工具条的编程技术》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、4.2工具条的编程技术 本节将讨论一些与工具条有关的编程技术,主要包括命令处理、命令更新、按钮风格和工具条的隐藏/显示等技术。4.2.1命令处理 要使菜单和工具条执行命令,光为它们指定命令ID是不行的,必须为每个命令ID定义命令处理函数。如果不为命令定义命令处理函数或下面将要提到的命令更新处理函数,则框架将自动使该命令对应的菜单项和按钮禁止(灰化),这就是4.1节中的工具条按钮和菜单项灰化的原因。 利用ClassWizard可以很方便地加入命令处理函数,请读者按以下步骤操作:按Ctrl+W键进入ClassWizard。图4.6ClassWizard对话
2、框如图4.6所示,在Classname栏中选择CMainFrame,在ObjectIDs栏中选择ID_RECORD_START,在Messages栏中双击COMMAND项,则ClassWizard会弹出一个对话框询问命令处理函数的名字,使用其提供的函数名即可。按OK按钮后,函数OnRecordStart就被加入到了Memberfunctions栏中。仿照第2步,为ID_RECORD_STOP定义一个命令处理函数。按OK按钮关闭ClassWizard对话框。这时读者会发现CMainFrame类多了两个成员函数,OnRecordStart和OnRecordSto
3、p。现在要在这两个命令处理函数中插入相应的源代码以实现其功能。当然,这里不会真的实现开始录音和停止录音的功能。我们只是让这两个函数发出一个声音,象征性地表示功能的执行,具体代码如清单4.2所示。 清单4.2OnRecordStart和OnRecordStop函数voidCMainFrame::OnRecordStart(){//TODO:Addyourcommandhandlercodehere MessageBeep((UINT)(-1));}voidCMainFrame::OnRecordStop(){//TODO:Addyourcommandhandl
4、ercodehere MessageBeep((UINT)(-1));} 编译并运行Record,可以看到Start和Stop命令已经可以执行了。4.2.2命令更新 虽然Start和Stop命令可以执行了,但是还有一个不足之处。在没有开始录音之前,Stop命令应该是禁止的,也即对应的菜单项和按钮应是禁止的,这是因为此时没有必要执行该命令。录音开始后,Stop命令应该允许,而Start命令则应变为禁止。我们可以利用MFC的命令更新机制实现此逻辑功能。 在菜单下拉之前,或在工具条按钮处在空闲循环期间,MFC会发一个更新命令,这将导致命令更新处理函数的调用。
5、命令更新处理函数可以根据情况,使用户接口对象(主要指菜单项和工具条按钮)允许或禁止。定义命令更新处理函数的方法如下:按Ctrl+W键进入ClassWizard。图4.7ClassWizard对话框如图4.7所示,在Classname栏中选择CMainFrame,在ObjectIDs栏中选择ID_RECORD_START,在Messages栏中双击UPDATE_COMMAND_UI项,则ClassWizard会弹出一个对话框询问命令更新处理函数的名字,使用其提供的函数名即可。按OK按钮后,函数OnUpdateRecordStart就被加入到了Memberfun
6、ctions栏中。仿照步2,为ID_RECORD_STOP定义一个命令更新处理函数。按OK按钮关闭ClassWizard对话框。这时读者会发现CMainFrame类多了两个成员函数,OnUpdateRecordStart和OnUpdateRecordStop。 命令更新处理函数有一个参数是CCmdUI类的指针,通过调用CCmdUI类的成员函数Enable(TRUE)或Enable(FALSE)可以使用户接口对象允许或禁止。需要给CMainFrame加一个布尔型成员变量以表明是否正在录音,这样命令更新处理函数可根据这个变量来决定用户接口对象的状态。请读者在C
7、MainFrame类内加入下面一行代码:BOOLm_bWorking;接下来请读者按清单4.3进行修改。清单4.3命令更新处理CMainFrame::CMainFrame(){//TODO:addmemberinitializationcodehere m_bWorking=FALSE;}voidCMainFrame::OnRecordStart(){//TODO:AddyourcommandhandlercodehereMessageBeep((UINT)(-1)); m_bWorking=TRUE;}voidCMainFrame::OnRecordSto
8、p(){//TODO:Addyourcommandh
此文档下载收益归作者所有