二、编程步骤
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);//显示文本文件的内容; }
|
四、小结
本例虽然是介绍的如何在状态条中包含进度条,但是读者朋友们可以从中受到启发,开拓思路,将该思想应用到类似的应用当中去,例如在状态条中实现显示图像等。 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
2/2 首页 上一页 1 2 |