专题:添加进度条

当打开一个.vec类型的文件时,在状态栏处显示进度:

第一步:

 新建一个类 CProgStatusBar  继承CStatusBar状态栏类;

第二步:

在MainFrm主框架类,添加进度条状态栏,

//在MainFrm.h中:   

     添加头文件:
     #include"ProgStatusBar.h"

  添加进度条:

     CProgStatusBar  m_wndStatusBar;   //在MainFrm.cpp将CStatusBar修改为 CProgStatusBar

第三步:

//在CProgStatusBar类中
        添加头文件:
        #include"afxpriv.h"


       定义进度条   

       CProgressCtrl m_wndProgBar;      

第四步:

//在CProgStatusBar类中

      添加WM_CREATE 和WM_SIZE 消息:


       int CProgStatusBar::OnCreate(LPCREATESTRUCT lpCreateStruct)  //状态栏第一次创建时接受控制创建进度条并出使化为一 个子窗口
       {
           lpCreateStruct->style |= WS_CLIPCHILDREN;                 //不绘制子窗口以下的区域,减少屏幕闪烁
           VERIFY(CStatusBar::OnCreate(lpCreateStruct)==0);
           VERIFY(m_wndProgBar.Create(WS_CHILD, CRect(), this, 1));
           m_wndProgBar.SetRange(0,100);
       }


      void CProgStatusBar::OnSize(UINT nType, int cx, int cy)
      {
             CStatusBar::OnSize(nType, cx, cy);
             CRect rc;        
             GetItemRect(0, &rc);    //获取状态条的第一个尺寸 
             m_wndProgBar.MoveWindow(&rc,FALSE);                  
     } 

第五步:

//在CProgStatusBar类中
     添加成员函数(头文件):
     CProgressCtrl& GetProgressCtrl() {
      return m_wndProgBar;
 }
     void OnProgress(UINT pct);

    实现函数(.cpp文件):
    void CProgStatusBar::OnProgress(UINT pct)               
     {
        CProgressCtrl& pc = m_wndProgBar;
       DWORD dwOldStyle = pc.GetStyle();
       DWORD dwNewStyle = dwOldStyle;
      if (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)
         {
             GetParent()->PostMessage(WM_SETMESSAGESTRING, AFX_IDS_IDLEMESSAGE);         //回到就绪
        }
   }

第六步:

//在MainFrm.cpp中添加消息映射
       ON_MESSAGE(MYWM_PROGRESS,OnProgress)
//在MainFrm.h中声明:

      LRESULT OnProgress(WPARAM wp, LPARAM lp);       //MainFrm.h

//在MainFrm.cpp中
      LRESULT CMainFrame::OnProgress(WPARAM wp, LPARAM lp)
      {
             m_wndStatusBar.OnProgress(wp);                 // pass to progstatusbar
             return 0;
      }

第七步:
// 在头文件的资源文件Resource.h中
        #define MYWM_PROGRESS (WM_USER+1)                       //自定义一个资源

第八步:
     // 在CVectorDoc.cpp 序列化函数中

void CVectorDoc::Serialize(CArchive& ar)
{

//--------------------------------------------------------------------------------------------
 CWnd* pFrame = AfxGetMainWnd();
//--------------------------------------------------------------------------------------------

 CItem *pItem;
 int nCount;
 
 if (ar.IsStoring())
 {
  //写文件
  nCount = m_objItem.GetCount();
  ar<<nCount;
  for (int i=0; i<nCount; i++)
  {
   pItem = (CItem*)(m_objItem.GetAt(i));
   ar<<pItem;
  }
 }
 else
 {

//--------------------------------------------------------------------------------------------
   //实现进度条
   for (int pct=10; pct<=100; pct+=10)
       {
         Sleep(150);
         if (pFrame)
            {
           pFrame->SendMessage(MYWM_PROGRESS, pct);
            }
       }
   //--------------------------------------------------------------------------------------------
  //读文件,建立各个图形对象
  ar>>nCount;
  for (int i=0; i<nCount; i++)
  {
   ar>>pItem;
   m_objItem.Add(pItem);
  }

  //读完文件后进行图形绘制
  POSITION pos = GetFirstViewPosition();
  CVectorView *pView = (CVectorView*)GetNextView(pos);
  pView->DrawAll();
  pView->Invalidate(0);
//--------------------------------------------------------------------------------------------

  if (pFrame)
         {
           pFrame->SendMessage(MYWM_PROGRESS, 0);  //当文件导入完毕时不显示状态条
         }

//--------------------------------------------------------------------------------------------
 }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值