leocad/win/progdlg.cpp
2011-09-07 21:06:51 +00:00

184 lines
3.4 KiB
C++

// ProgDlg.cpp : implementation file
//
#include "stdafx.h"
#include "leocad.h"
#include "ProgDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CProgressDlg dialog
CProgressDlg::CProgressDlg(LPCTSTR pszTitle)
{
//{{AFX_DATA_INIT(CProgressDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_nMinValue = 0;
m_nMaxValue = 100;
m_nPrevPos = 0;
m_nPrevPercent = 0;
m_strTitle = pszTitle;
m_bCancel = FALSE;
m_bParentDisabled = FALSE;
}
CProgressDlg::~CProgressDlg()
{
if(m_hWnd != NULL)
DestroyWindow();
}
BOOL CProgressDlg::Create(CWnd* pParent)
{
m_pParentWnd = CWnd::GetSafeOwner(pParent);
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_PRGDLG_PROGRESS, m_Progress);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CProgressDlg, CDialog)
//{{AFX_MSG_MAP(CProgressDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CProgressDlg message handlers
void CProgressDlg::OnCancel()
{
m_bCancel = TRUE;
}
BOOL CProgressDlg::CheckCancelButton()
{
// Process all pending messages
PumpMessages();
BOOL bResult = m_bCancel;
m_bCancel = FALSE;
return bResult;
}
void CProgressDlg::PumpMessages()
{
// Must call Create() before using the dialog
ASSERT(m_hWnd!=NULL);
MSG msg;
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if(!IsDialogMessage(&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
int CProgressDlg::StepIt()
{
PumpMessages();
return SetPos(m_nPrevPos + 1);
}
int CProgressDlg::SetPos(int nPos)
{
CString strTitle;
int nPercentage;
m_nPrevPos = nPos;
if (m_nMaxValue > m_nMinValue)
nPercentage = (nPos*100)/(m_nMaxValue - m_nMinValue);
else
nPercentage = 0;
if ((nPercentage != m_nPrevPercent) || (nPos == 1))
{
m_nPrevPercent = nPercentage;
strTitle.Format(_T("%s [%d%%]"), m_strTitle, nPercentage);
SetWindowText(strTitle);
}
return m_Progress.SetPos(nPos);
}
void CProgressDlg::SetRange(int nLower, int nUpper)
{
ASSERT(0 <= nLower && nLower <= 65535);
ASSERT(0 <= nUpper && nUpper <= 65535);
m_Progress.SetRange(nLower, nUpper);
m_nMaxValue = nUpper;
m_nMinValue = nLower;
}
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::OnInitDialog()
{
CDialog::OnInitDialog();
m_Progress.ModifyStyle(0, PBS_SMOOTH);
m_Progress.SetRange(m_nMinValue, m_nMaxValue);
m_Progress.SetStep(1);
SetPos(m_nMinValue);
return TRUE;
}
void CProgressDlg::SetStatus(LPCTSTR lpszMessage)
{
ASSERT(m_hWnd);
CWnd *pWndStatus = GetDlgItem(IDC_PRGDLG_TEXT);
ASSERT(pWndStatus != NULL);
pWndStatus->SetWindowText(lpszMessage);
}
void CProgressDlg::SetSubStatus(LPCTSTR lpszMessage)
{
ASSERT(m_hWnd);
CWnd *pWndStatus = GetDlgItem(IDC_PRGDLG_TEXT2);
ASSERT(pWndStatus != NULL);
pWndStatus->SetWindowText(lpszMessage);
}