trl 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);//显示文本文件的内容;
}
四、小结
本例虽然是介绍的如何在状态条中包含进度条,但是读者朋友们可以从中受到启发,开拓思路,将该思想应用到类似的应用当中去,例如在状态条中实现显示图像等。