// StatusBarEx.cpp : implementation file
//
#include "stdafx.h"
#include "StatusBarEx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStatusBarEx
CStatusBarEx::CStatusBarEx()
{
}
CStatusBarEx::~CStatusBarEx()
{
}
BEGIN_MESSAGE_MAP(CStatusBarEx, CStatusBar)
//{{AFX_MSG_MAP(CStatusBarEx)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStatusBarEx message handlers
BOOL CStatusBarEx::Create(CWnd * pParentWnd, DWORD dwStyle, UINT nID)
{
BOOL result = CStatusBar::Create(pParentWnd, dwStyle, nID);
if (result)
{
CRect rc;
GetItemRect(0, &rc);
result = m_ctlProgress.Create(WS_CHILD, rc, this, nID);
}
return result;
}
void CStatusBarEx::ShowProgress(LPCTSTR pszMessage /*=NULL*/)
{
CRect rc;
GetItemRect (0, &rc);
CPoint cent = rc.CenterPoint();
// initialize the status message
UINT offset=0;
if (pszMessage != NULL)
{
CClientDC dc(this);
CSize sz = dc.GetTextExtent(pszMessage, _tcslen(pszMessage));
offset = sz.cx-20;
SetPaneText(0, pszMessage, TRUE);
}
else
SetPaneText(0, _T(""), TRUE);
UpdateWindow();
// get the progress control into position & show it
int width = rc.Width();
int height = rc.Height();
rc.left = offset;
width = max(50, min(200, width-rc.left));
height = max(4, height-6);
rc.right = rc.left + width;
rc.top = cent.y - height/2;
rc.bottom = cent.y + height/2;
m_ctlProgress.MoveWindow(rc.left, rc.top, width, height, TRUE);
m_ctlProgress.SetPos(0);
m_ctlProgress.SetRange(0, 100);
m_ctlProgress.ShowWindow(SW_SHOW);
}
void CStatusBarEx::SetProgress(UINT pos)
{
m_ctlProgress.SetPos(pos);
m_ctlProgress.UpdateWindow();
}
void CStatusBarEx::ShowProgress(UINT idsMessage)
{
TRY {
CString s;
VERIFY(s.LoadString(idsMessage));
ShowProgress(s);
}
CATCH_ALL(e)
{
//TCHAR msg[1024];
//e->GetErrorMessage(msg, sizeof msg);
//AfxMessageBox(msg, MB_ICONSTOP);
}
END_CATCH_ALL;
}
void CStatusBarEx::HideProgress()
{
SetPaneText(0, _T(""), TRUE);
m_ctlProgress.ShowWindow(SW_HIDE);
}
CProgressCtrl * CStatusBarEx::GetProgressCtrl()
{
return &m_ctlProgress;
}
void CStatusBarEx::SetProgressRange(int nMin, int nMax)
{
m_ctlProgress.SetRange(nMin,nMax);
}