利用VC++进行工具条的显示更新

翻译|其它|编辑:郝浩|2006-07-28 16:59:00.000|阅读 2759 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


   Microsoft Visual C++(以下简称VC)是一种非常方便的Windows编程工具, 利用其附带的MFC类库,可以十分简便地支持各种Windows控件。例如:Windows 95中新增了许多通用控件,诸如工具条、状态栏、树形视窗、动画等,而以上这些控件, 在MFC类库中均可以找到相应的预定义类。应用程序只需增加一些必要的说明,就可以支持这些控件。本文谈谈比较常见的工具条控件编程。

工具条编制
   确切地说,Windows通用控件都是由通用控制库所支持的一组窗口, 工具条也不例外。从MFC类库的角度来看,工具条又是CToolBar类的一个对象。凭借MFC类库,应用程序可以实现浮动工具条、 工具条提示等用Windows SDK不易实现的内容。当我们使用VC建立一个工程文件时,如果指定工具条选项, VC的AppWizard就会在应用程序的主框架窗口中添加支持工具条的代码,这些代码在缺省情况下位于 MAINFRM.CPP 和MAINFRM.H中。

   一般来说,工具条的构造、析构及其窗口的创建都由应用程序的主框架窗口所管理,当用户点击菜单栏的弹出式菜单时, Windows就要向应用程序发送WM_INITMENUPOPUP消息,以便应用程序在菜单显示之前对菜单项进行添加或修改。 当使用MFC类库编程时,只要针对某一具体的菜单项进行了消息映射,并加入了相应的消息处理函数, MFC类库就会发送更新用户接口命令(UPDATE_COMMAND_UI) 消息,使得在菜单弹出时,应用程序的消息处理函数能对该菜单项进行处理,以确定此菜单项是被禁止、变灰或其它。与之类似,工具条也有UPDATE_COMMANDU I消息。 不过,由于工具条总是处于显示状态,因此对其消息处理函数的调用是在应用程序的空闲状态处理过程中进行的,这一点与菜单项不同。

   但是,如果程序执行过程中需要进行较大的计算,应用程序就要长时间占用处理器资源。因此,对于应用程序的主框架窗口来说,它就无暇进入空闲状态处理,应用程序中相应的更新命令消息处理函数也就得不到调用。这就要求应用程序自身在较长时间的计算过程中,对工具条的显示更新进行维护,例如,使工具条上某些按钮处于检查、可执行或变灰等状态。如果不执行这一措施,则在应用程序执行过程中,就有可能出现工具条按钮标识状态与实际过程不一致的情况。下面我们通过实例来说明。下述编码的功能是在窗口中画若干个大小和颜色随机的矩形,以此来模拟较长时间的计算过程。本例所用的VC版本为4.2,操作系统为Windows 95。操作步骤如下:
  ①用VC的AppWizard生成一工程项目ToolBar,生成过程中指定SDI(单文本项目)和Dockn g ToolBar选项;
  ②对该项目的资源文件进行修改,在菜单栏中添加一弹出式菜单Test,在其下附加Star 及Stop菜单选项;
  ③在工具条位图中添加两个按钮,分别对应Start及Stop菜单选项;
  ④用ClassWizard增加针对Start和Stop的消息映射入口及其相应的处理函数和UPDATEC OMMAND_UI消息处理函数;
  ⑤在CToolBarView类中加入两个变量及一个画图函数和一个检查应用程序消息队列的函数:
private:
BOOL m_bContinue, m_bStart;
void DrawRect(CDC *pDC);
//在窗口中画一个大小和颜色随机的矩形
void CheckMsgQueue();
//检查消息队列中有无消息
下面是完整的代码:
void CToolBarView::OnTestStart()
{
   m_bStart = FALSE;
   m_bContinue = TRUE;
   const int nItemsNum = 4096;
   CClientDC dc(this);
   for (int i = 0; m_bContinue && (i GetControlBar(AFX_IDW_TOOLBAR));
   // 再取得该工具条的控制对象指针
   CToolBarCtrl *pToolBarCtrl = &(pToolBar->
   GetToolBarCtrl());
   pToolBarCtrl->EnableButton(ID_TEST_START,FALSE);
   //禁止Start按钮
   pToolBarCtrl->EnableButton(ID_TEST_STOP,TRUE); //使能Stop按钮
这样一来, 工具条上Start和Stop按钮就同相应菜单项的显示状态一致了。顺便提一句,Windows通用控制库COMCTL32.DLL中关于工具条控制有一个Bug,就是当工具条上的一个按钮被按下之后紧接着被设置为禁止状态(Disabled),那么即使松开鼠标按键, 该按钮也并不弹起,即它仍然保持被按下且为禁止状态。在MFC类库中通过设置有关标志位, 解决了这个Bu, 使得按钮被设置为禁止状态后恢复为弹起状态。

类CToolBarCtrl提供了Windows工具条通用控制的各项功能, 但这些功能仅在Windows9 5或Windows NT 3.51及以上环境下有效。 利用这一控制,可以使用户方便地设置工具条,比如改变工具条上的按钮状态、删除或增加工具条按钮等。关于类CToolBarCtrl, VC++4.2附带提供了一个比较详细的编程实例CMNCTRLS,可以作为参考.
 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP