216 lines
4.9 KiB
C++
216 lines
4.9 KiB
C++
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//
|
|
//=============================================================================//
|
|
// ProgDlg.cpp : implementation file
|
|
// CG: This file was added by the Progress Dialog component
|
|
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
#include "ProgDlg.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include <tier0/memdbgon.h>
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CProgressDlg dialog
|
|
|
|
CProgressDlg::CProgressDlg(UINT nCaptionID)
|
|
{
|
|
m_nCaptionID = CG_IDS_PROGRESS_CAPTION;
|
|
if (nCaptionID != 0)
|
|
m_nCaptionID = nCaptionID;
|
|
|
|
m_bCancel=FALSE;
|
|
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, 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::OnCancel()
|
|
{
|
|
m_bCancel=TRUE;
|
|
}
|
|
|
|
void CProgressDlg::SetRange(int nLower,int nUpper)
|
|
{
|
|
m_nLower = nLower;
|
|
m_nUpper = nUpper;
|
|
m_Progress.SetRange(nLower,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);
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL CProgressDlg::CheckCancelButton()
|
|
{
|
|
// Process all pending messages
|
|
PumpMessages();
|
|
|
|
// Reset m_bCancel to FALSE so that
|
|
// CheckCancelButton returns FALSE until the user
|
|
// clicks Cancel again. This will allow you to call
|
|
// CheckCancelButton and still continue the operation.
|
|
// If m_bCancel stayed TRUE, then the next call to
|
|
// CheckCancelButton would always return TRUE
|
|
|
|
BOOL bResult = m_bCancel;
|
|
m_bCancel = FALSE;
|
|
|
|
return bResult;
|
|
}
|
|
|
|
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(m_nLower,m_nUpper);
|
|
m_Progress.SetStep(m_nStep);
|
|
m_Progress.SetPos(m_nLower);
|
|
|
|
CString strCaption;
|
|
VERIFY(strCaption.LoadString(m_nCaptionID));
|
|
SetWindowText(strCaption);
|
|
|
|
return TRUE;
|
|
}
|