// ProgDlg.h : header file // CG: This file was added by the Progress Dialog component
///////////////////////////////////////////////////////////////////////////// // CProgressDlg dialog
#ifndef __PROGDLG_H__ #define __PROGDLG_H__ #include "resource.h" //LT class CProgressDlg : public CDialog { // Construction / Destruction public: CProgressDlg(UINT nCaptionID = 0); // standard constructor ~CProgressDlg();
BOOL Create(CWnd *pParent=NULL);
// Progress Dialog manipulation void SetStatus(LPCTSTR lpszMessage); void SetRange(int nLower,int nUpper); int SetStep(int nStep); int SetPos(int nPos); int OffsetPos(int nPos); int StepIt(); // Dialog Data //{{AFX_DATA(CProgressDlg) enum { IDD = CG_IDD_PROGRESS }; CAnimateCtrl m_Trans_AnimateCtrl; CProgressCtrl m_Progress; //}}AFX_DATA
// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CProgressDlg) public: virtual BOOL DestroyWindow(); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation protected: UINT m_nCaptionID; int m_nLower; int m_nUpper; int m_nStep; BOOL m_bParentDisabled;
void ReEnableParent();
virtual void OnCancel(); virtual void OnOK() {}; void UpdatePercent(int nCurrent); void PumpMessages();
// Generated message map functions //{{AFX_MSG(CProgressDlg) virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() };
#endif // __PROGDLG_H__ // ProgDlg.cpp : implementation file // CG: This file was added by the Progress Dialog component
#include "stdafx.h" #include "resource.h" #include "ProgDlg.h"
#ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif
///////////////////////////////////////////////////////////////////////////// // CProgressDlg dialog
CProgressDlg::CProgressDlg(UINT nCaptionID) { m_nCaptionID = CG_IDS_PROGRESS_CAPTION; if (nCaptionID != 0) m_nCaptionID = nCaptionID;
m_nLower=0; m_nUpper=100; m_nStep=10; //{{AFX_DATA_INIT(CProgressDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_bParentDisabled = FALSE; }
CProgressDlg::~CProgressDlg() { if(m_hWnd!=NULL) DestroyWindow(); }
BOOL CProgressDlg::DestroyWindow() { ReEnableParent(); return CDialog::DestroyWindow(); }
void CProgressDlg::ReEnableParent() { if(m_bParentDisabled && (m_pParentWnd!=NULL)) m_pParentWnd->EnableWindow(TRUE); m_bParentDisabled=FALSE; }
BOOL CProgressDlg::Create(CWnd *pParent) { // Get the true parent of the dialog m_pParentWnd = CWnd::GetSafeOwner(pParent);
// m_bParentDisabled is used to re-enable the parent window // when the dialog is destroyed. So we don't want to set // it to TRUE unless the parent was already enabled.
if((m_pParentWnd!=NULL) && m_pParentWnd->IsWindowEnabled()) { m_pParentWnd->EnableWindow(FALSE); m_bParentDisabled = TRUE; }
if(!CDialog::Create(CProgressDlg::IDD,pParent)) { ReEnableParent(); return FALSE; }
return TRUE; }
void CProgressDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CProgressDlg) DDX_Control(pDX, IDC_TRANS_ANIMATE, m_Trans_AnimateCtrl); DDX_Control(pDX, CG_IDC_PROGDLG_PROGRESS, m_Progress); //}}AFX_DATA_MAP }
BEGIN_MESSAGE_MAP(CProgressDlg, CDialog) //{{AFX_MSG_MAP(CProgressDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP()
void CProgressDlg::SetStatus(LPCTSTR lpszMessage) { ASSERT(m_hWnd); // Don't call this _before_ the dialog has // been created. Can be called from OnInitDialog CWnd *pWndStatus = GetDlgItem(CG_IDC_PROGDLG_STATUS);
// Verify that the static text control exists ASSERT(pWndStatus!=NULL); pWndStatus->SetWindowText(lpszMessage); }
void CProgressDlg::OnCancel() { }
void CProgressDlg::SetRange(int nLower,int nUpper) { m_nLower = nLower; m_nUpper = nUpper; m_Progress.SetRange((short)nLower,(short)nUpper); } int CProgressDlg::SetPos(int nPos) { PumpMessages(); int iResult = m_Progress.SetPos(nPos); UpdatePercent(nPos); return iResult; }
int CProgressDlg::SetStep(int nStep) { m_nStep = nStep; // Store for later use in calculating percentage return m_Progress.SetStep(nStep); }
int CProgressDlg::OffsetPos(int nPos) { PumpMessages(); int iResult = m_Progress.OffsetPos(nPos); UpdatePercent(iResult+nPos); return iResult; }
int CProgressDlg::StepIt() { PumpMessages(); int iResult = m_Progress.StepIt(); UpdatePercent(iResult+m_nStep); return iResult; }
void CProgressDlg::PumpMessages() { // Must call Create() before using the dialog ASSERT(m_hWnd!=NULL);
MSG msg; // Handle dialog messages while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if(!IsDialogMessage(&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } }
void CProgressDlg::UpdatePercent(int nNewPos) { CWnd *pWndPercent = GetDlgItem(CG_IDC_PROGDLG_PERCENT); int nPercent; int nDivisor = m_nUpper - m_nLower; ASSERT(nDivisor>0); // m_nLower should be smaller than m_nUpper
int nDividend = (nNewPos - m_nLower); ASSERT(nDividend>=0); // Current position should be greater than m_nLower
nPercent = nDividend * 100 / nDivisor;
// Since the Progress Control wraps, we will wrap the percentage // along with it. However, don't reset 100% back to 0% if(nPercent!=100) nPercent %= 100;
// Display the percentage CString strBuf; strBuf.Format(_T("%d%c"),nPercent,_T('%'));
CString strCur; // get current percentage pWndPercent->GetWindowText(strCur);
if (strCur != strBuf) pWndPercent->SetWindowText(strBuf); } ///////////////////////////////////////////////////////////////////////////// // CProgressDlg message handlers
BOOL CProgressDlg::OnInitDialog() { CDialog::OnInitDialog(); m_Progress.SetRange((short)m_nLower,(short)m_nUpper); m_Progress.SetStep(m_nStep); m_Progress.SetPos(m_nLower);
// CString strCaption; // VERIFY(strCaption.LoadString(m_nCaptionID)); // SetWindowText(strCaption);
m_Trans_AnimateCtrl.Open("filemove.avi"); return TRUE; } 调用方法: 在需要使用的文件中#include"ProgDlg.h" CProgressDlg progressdlg;//定义变量 progressdlg.Create(NULL);//初始化 progressdlg.SetRange(0,200);//设定进度条起点和终点范围 progressdlg.SetPos(0);//设定进度条起点位置 progressdlg.SetStep(1);//设定进度条每步进度 progressdlg.SetStatus("提示信息"); progressdlg.StepIt();//进度条前进一步 progressdlg.SetWindowText("对话框标题");

|