42工具条的编程技术.doc_第1页
42工具条的编程技术.doc_第2页
42工具条的编程技术.doc_第3页
42工具条的编程技术.doc_第4页
42工具条的编程技术.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4.2工具条的编程技术本节将讨论一些与工具条有关的编程技术,主要包括命令处理、命令更新、按钮风格和工具条的隐藏/显示等技术。4.2.1命令处理要使菜单和工具条执行命令,光为它们指定命令ID是不行的,必须为每个命令ID定义命令处理函数。如果不为命令定义命令处理函数或下面将要提到的命令更新处理函数,则框架将自动使该命令对应的菜单项和按钮禁止(灰化),这就是4.1节中的工具条按钮和菜单项灰化的原因。利用ClassWizard可以很方便地加入命令处理函数,请读者按以下步骤操作:按Ctrl+W键进入ClassWizard。图4.6 ClassWizard对话框如图4.6所示,在Class name栏中选择CMainFrame,在Object IDs栏中选择ID_RECORD_START,在Messages栏中双击COMMAND项,则ClassWizard会弹出一个对话框询问命令处理函数的名字,使用其提供的函数名即可。按OK按钮后,函数OnRecordStart就被加入到了Member functions栏中。仿照第2步,为ID_RECORD_STOP定义一个命令处理函数。按OK按钮关闭ClassWizard对话框。这时读者会发现CMainFrame类多了两个成员函数,OnRecordStart和OnRecordStop。现在要在这两个命令处理函数中插入相应的源代码以实现其功能。当然,这里不会真的实现开始录音和停止录音的功能。我们只是让这两个函数发出一个声音,象征性地表示功能的执行,具体代码如清单4.2所示。清单4.2 OnRecordStart和OnRecordStop函数void CMainFrame:OnRecordStart() / TODO: Add your command handler code hereMessageBeep(UINT)(-1);void CMainFrame:OnRecordStop() / TODO: Add your command handler code hereMessageBeep(UINT)(-1);编译并运行Record,可以看到Start和Stop命令已经可以执行了。4.2.2命令更新虽然Start和Stop命令可以执行了,但是还有一个不足之处。在没有开始录音之前,Stop命令应该是禁止的,也即对应的菜单项和按钮应是禁止的,这是因为此时没有必要执行该命令。录音开始后,Stop命令应该允许,而Start命令则应变为禁止。我们可以利用MFC的命令更新机制实现此逻辑功能。在菜单下拉之前,或在工具条按钮处在空闲循环期间,MFC会发一个更新命令,这将导致命令更新处理函数的调用。命令更新处理函数可以根据情况,使用户接口对象(主要指菜单项和工具条按钮)允许或禁止。定义命令更新处理函数的方法如下:按Ctrl+W键进入ClassWizard。图4.7 ClassWizard对话框如图4.7所示,在Class name栏中选择CMainFrame,在Object IDs栏中选择ID_RECORD_START,在Messages栏中双击UPDATE_COMMAND_UI项,则ClassWizard会弹出一个对话框询问命令更新处理函数的名字,使用其提供的函数名即可。按OK按钮后,函数OnUpdateRecordStart就被加入到了Member functions栏中。仿照步2,为ID_RECORD_STOP定义一个命令更新处理函数。按OK按钮关闭ClassWizard对话框。这时读者会发现CMainFrame类多了两个成员函数,OnUpdateRecordStart和OnUpdateRecordStop。命令更新处理函数有一个参数是CCmdUI类的指针,通过调用CCmdUI类的成员函数Enable(TRUE)或Enable(FALSE)可以使用户接口对象允许或禁止。需要给CMainFrame加一个布尔型成员变量以表明是否正在录音,这样命令更新处理函数可根据这个变量来决定用户接口对象的状态。请读者在CMainFrame类内加入下面一行代码:BOOL m_bWorking;接下来请读者按清单4.3进行修改。清单4.3 命令更新处理CMainFrame:CMainFrame()/ TODO: add member initialization code herem_bWorking=FALSE; void CMainFrame:OnRecordStart() / TODO: Add your command handler code hereMessageBeep(UINT)(-1);m_bWorking=TRUE;void CMainFrame:OnRecordStop() / TODO: Add your command handler code hereMessageBeep(UINT)(-1);m_bWorking=FALSE;void CMainFrame:OnUpdateRecordStart(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code herepCmdUI-Enable(!m_bWorking); void CMainFrame:OnUpdateRecordStop(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code herepCmdUI-Enable(m_bWorking) ;m_bWorking的初值应是FALSE,对它的初始化工作在CMainFrame的构造函数中完成。m_bWorking的值在处理Start和Stop命令时会被更新以反映当前的状态。两个命令更新处理函数都调用了CCmdUI:Enable,该函数根据m_bWorking的值来更新命令接口对象。编译并运行Record,现在Start和Stop命令的逻辑功能已经实现了。4.2.3按钮风格在Record程序中,用户可以选择两种采样频率来录音。用户接口对象应该能反映出当前的采样频率。普通的工具条按钮在按下后会立刻弹起来,我们希望Record程序的频率选择按钮具有单选按钮的风格,即当用户选择了一个采样频率时,该采样频率对应的按钮一直处于按下的状态,而另一个频率选择按钮应处于弹起状态。我们可以利用CCmdUI:SetCheck函数来实现这一功能,在命令更新函数中调用CCmdUI:SetCheck(TRUE)或CCmdUI:SetCheck(FALSE)可将用户接口对象设定为选中或不选中状态,当一个用户接口对象被选中时,相应的工具按钮会处于按下的状态,并且相应的菜单项的前面会加上一个选中标记。这里需要给CMainFrame类加一个布尔型成员变量以表明当前的采样频率。请读者在CMainFrame类内加入下面一行代码:BOOL m_bHighQuality;接下来请读者按清单4.4进行修改。清单4.4 CMainFrame:CMainFrame()/ TODO: add member initialization code herem_bWorking=FALSE; m_bHighQuality=TRUE;void CMainFrame:OnHighQuality() / TODO: Add your command handler code herem_bHighQuality=TRUE; void CMainFrame:OnLowQuality() / TODO: Add your command handler code herem_bHighQuality=FALSE; void CMainFrame:OnUpdateHighQuality(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code herepCmdUI-SetCheck(m_bHighQuality); void CMainFrame:OnUpdateLowQuality(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code herepCmdUI-SetCheck(!m_bHighQuality); m_bHighQuality的初值是TRUE,即缺省时是高频采样,对它的初始化工作在CMainFrame的构造函数中完成。m_bHighQuality的值在处理High quality和Low quality命令时会被更新以反映当前的状态。两个命令更新处理函数都调用了CCmdUI:SetCheck,该函数根据m_bHighQuality的值来更新命令接口对象,从而使工具条按钮具有了单选按钮的风格。编译并运行Record,读者可以看到具有新风格的工具条按钮。当选择采样频率时,相应的菜单项前会出现一个选中标记,相应的工具条按钮会被按下。4.2.4工具条的隐藏/显示读者可能已经试过了Record程序的View菜单的功能。通过该菜单用户可以隐藏/显示工具条和状态栏,这个功能是由AppWizard自动实现的。由于第二个工具条是手工建立的,因此它不会自动具备隐藏/显示功能。但我们可以通过编程来实现第二个工具条的隐藏/显示:打开IDR_MAINFRAME菜单资源在View菜单中加入一个名为Toolbar1的菜单项,指定其ID为ID_VIEW_TOOLBAR1,并在Prompt栏中输入Show or hide the toolbar1nToggle ToolBar1。按Ctrl+W键进入ClassWizard。在Class name栏中选择CMainFrame,在Object IDs栏中选择ID_VIEW_TOOLBAR1,并为该命令ID定义命令处理函数OnViewToolbar1和命令更新处理函数OnUpdateViewToolbar1。按清单4.5修改程序。清单4.5 显示/隐藏工具条void CMainFrame:OnViewToolbar1() / TODO: Add your command handler code herem_wndToolBar1.ShowWindow(m_wndToolBar1.IsWindowVisible()?SW_HIDE:SW_SHOW); RecalcLayout();void CMainFrame:OnUpdateViewToolbar1(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code herepCmdUI-SetCheck(m_wndToolBar1.IsWindowVisible(); 调用CWnd:ShowWindow(SW_SHOW)或CWnd:ShowWindow(SW_HIDE)可以显示或隐藏窗口。由于工具条也是窗口,CToolBar是CWnd类的继承类,故该函数也是CToolBar的成员。在命令处理函数OnViewToolbar1中,我们调用CToolBar:ShowWindow来显示/隐藏工具条,在调用时会利用CWnd:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论