WEB开发网
开发学院软件开发VC 如何在状态栏中实现进度指示器控制 阅读

如何在状态栏中实现进度指示器控制

 2007-10-06 20:22:12 来源:WEB开发网   
核心提示:图二 绘制问题反之,当调用OnProgress(0)清除进度控制时也存在类似的问题,如何在状态栏中实现进度指示器控制(3),CProgStatusBar::OnProgress 隐藏进度控制后,状态栏第一个窗格该显示什么信息呢?一般显示“就绪”或其它的提示信息,并且假设你中途可以中断进度指示器,

图二 绘制问题

反之,当调用OnProgress(0)清除进度控制时也存在类似的问题,CProgStatusBar::OnProgress 隐藏进度控制后,状态栏第一个窗格该显示什么信息呢?一般显示“就绪”或其它的提示信息。当应用程序不做任何事情时,MFC程序总是在这个位置显示资源串AFX_IDS_IDLEMESSAGE表示的文本,其缺省值为“就绪”,但你可以在RC文件中任意修改这个值。以我个人的观点,我总是认为在这里显示就绪信息有点儿土。不管怎样,在MFC程序的状态栏中显示就绪信息很容易:

// 在 CProgStatusBar::OnProgress函数中
// WM_SETMESSAGESTRING 的定义在<afxpriv.h>文件
GetParent()->PostMessage(WM_SETMESSAGESTRING,AFX_IDS_IDLEMESSAGE);   

如果你愿意,完全可以创建不同的ID和消息,如用ID_DONE_LOADING表示“加载完成”,以此取代“就绪”。

CProgStatusBar实现了含有进度控制的状态栏。它的使用方法很简单:用CProgStatusBar代替CStatusBar声明实例,然后在任何想要显示进度控制指示的地方调用CProgStatusBar::OnProgress。详细代码请参考本文例子程序。创建CProgStatusBar很容易,它的原理与标准的状态栏CStatusBar一样——你只要明白什么时候以及在哪里调用OnProgress即可。

实际应用中要根据你的应用而定。我建议你按照例子程序的方法来使用它。不要直接暴露CProgStatusBar::OnProgress函数,例子程序的主窗口实现了一个特殊的消息——MYWM_PROGRESS,它将WPARAM传递到CProgStatusBar::OnProgress:

// MYWM_PROGRESS 在resource.h文件中定义
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_MESSAGE(MYWM_PROGRESS,OnProgress)
END_MESSAGE_MAP()
// 处理MYWM_PROGRESS消息
LRESULT CMainFrame::OnProgress(WPARAM wp, LPARAM lp)
{
  m_wndStatusBar.OnProgress(wp);
  return 0;
}   

这样想要报告进度指示的任何对象都可以通过发送一个消息到主框架来代替直接对状态栏进行调用。例如,在例子程序中,文档的Serialize函数利用Sleep函数仿真耗时加载,每隔150毫秒报告一次进度状态。通常,你肯定想让文档这样的低级对象尽可能少地包含UI代码。虽然在实践中很少有程序员遵守这一原则,但最好不用UI操作你的文档类,因为你很可能有一天想在某个服务中或命令行程序中使用它。不管怎么说,发送消息到框架总比暴露框架的内部成员要好得多。为了安全起见,文档的Serialize函数在发送消息前最好检查一下框架是否存在。如果你不想从文档发送Windows消息,可以用MFC的视图更新机制来做。你可以发明一个“暗示”代码以及一个小结构来保存进度百分比数据,并通过向框架发送MYWM_PROGRESS消息调用暗示信息。这是从文档到视图/框架传递进度控制信息的最省事的方式。

CProgStatusBar假设你报告的进度指示数据总是0到100的整数,并且假设你中途可以中断进度指示器。以便你在想要改变设置的时候,可以修改CProgStatusBar或者调用CProgStatusBar::GetProgressCtrl来直接存取进度控制状态。

上一页  1 2 3 

Tags:如何 状态 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接