科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VC技巧:在程序的状态栏中实现进度条

VC技巧:在程序的状态栏中实现进度条

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本例提供了一个范例程序prgsbar,它演示了在编辑视图里显示文本文件,在加载文本文件时,在界面的状态条中的进度指示器仿真显示文件的加载过程。

作者:刘涛 来源:天极开发 2007年10月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
二、编程步骤

  1、 启动Visual C++6.0,生成一个单文档应用程序prgsbar,项目的视图类的基类选择CEdit类;

  2、 在程序的Resource.h文件中添加自定义消息的定义:

#define MYWM_PROGRESS (WM_USER+1)

  3、 在程序的主框架窗口CMainFrame类的头文件中声明MYWM_PROGRESS的消息响应函数afx_msg LRESULT OnProgress(WPARAM wp, LPARAM lp),在该类的实现中添加消息映射ON_MESSAGE(MYWM_PROGRESS,OnProgress);

  4、 将CMainFrame类中的工具条对象改为CProgStatusBar m_wndStatusBar;

  5、 重载CPrgsbarDoc::Serialize(CArchive& ar)函数,用来处理读取文件时的进度条仿真;

  6、 添加代码,编译运行程序。

  三、程序代码

////////////////////////////////////////////CprogStatusBar类的头文件;
// Status bar with progress control.
class CProgStatusBar : public CStatusBar {
public:
 CProgStatusBar();
 virtual ~CProgStatusBar();
 CProgressCtrl& GetProgressCtrl() {
  return m_wndProgBar;
 }
 void OnProgress(UINT pct);
protected:
 CProgressCtrl m_wndProgBar; // the progress bar
 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 afx_msg void OnSize(UINT nType, int cx, int cy);
 DECLARE_MESSAGE_MAP()
 DECLARE_DYNAMIC(CProgStatusBar)
};
///////////////////////////////////////////////////////////////////////////// CprogStatusBar类的实现文件;
#include "StdAfx.h"
#include "ProgBar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNAMIC(CProgStatusBar, CStatusBar)
BEGIN_MESSAGE_MAP(CProgStatusBar, CStatusBar)
ON_WM_CREATE()
ON_WM_SIZE()
END_MESSAGE_MAP()
////////////////////////////////////////////////////////////////
CProgStatusBar::CProgStatusBar()
{}
CProgStatusBar::~CProgStatusBar()
{}
////////////////////////////////////////创建状态条时也创建进程条
int CProgStatusBar::OnCreate(LPCREATESTRUCT lpcs)
{
 lpcs->style |= WS_CLIPCHILDREN;
 VERIFY(CStatusBar::OnCreate(lpcs)==0);
 VERIFY(m_wndProgBar.Create(WS_CHILD, CRect(), this, 1));
 m_wndProgBar.SetRange(0,100); //设置进程条的范围;
 return 0;
}
////////////////////////////////////////////////////使进程度条的尺寸与状态条的尺寸同步变化;
void CProgStatusBar::OnSize(UINT nType, int cx, int cy)
{
 CStatusBar::OnSize(nType, cx, cy);
 CRect rc;
 GetItemRect(0, &rc);
 m_wndProgBar.MoveWindow(&rc,FALSE);
}
////////////////////////////////////////////////////////////根据pct的当前值对进程条进行设置
void CProgStatusBar::OnProgress(UINT pct)
{
 CProgressCtrl& pc = m_wndProgBar;
 DWORD dwOldStyle = pc.GetStyle();
 DWORD dwNewStyle = dwOldStyle;
 if (pct>0) //如果pct>0,将显示进度条
  dwNewStyle |= WS_VISIBLE;
 else //否则隐藏进度条;
  dwNewStyle &= ~WS_VISIBLE;
  if (dwNewStyle != dwOldStyle) {
   SetWindowText(NULL); //显示进度条前清空状态条;
   SetWindowLong(pc.m_hWnd, GWL_STYLE, dwNewStyle);
   //设置进度条处于显示状态;
  }
  // 设置进度条的当前位置;
  pc.SetPos(pct);
  if (pct==0)
   // 如果pct等于0,通知主框架窗口显示空闲信息;
   GetParent()->PostMessage(WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE);
 }
 /////////////////////////////////////////////////////////////////////////文档装载处理函数;
 void CPrgsbarDoc::Serialize(CArchive& ar)
 {
  CWnd* pFrame = AfxGetMainWnd();
  if (!ar.IsStoring()) {
   for (int pct=10; pct<=100; pct+=10) {//对文档装载进行仿真处理;
    Sleep(150);
    if (pFrame)
     pFrame->SendMessage(MYWM_PROGRESS, pct);
   }
  }
  if (pFrame)
   pFrame->SendMessage(MYWM_PROGRESS, 0);
   ((CEditView*)m_viewList.GetHead())->SerializeRaw(ar);//显示文本文件的内容;
}

  四、小结

  本例虽然是介绍的如何在状态条中包含进度条,但是读者朋友们可以从中受到启发,开拓思路,将该思想应用到类似的应用当中去,例如在状态条中实现显示图像等。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章