当打开一个.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); //当文件导入完毕时不显示状态条
}
//--------------------------------------------------------------------------------------------
}
}