238 lines
8.2 KiB
C++
238 lines
8.2 KiB
C++
/****************************************************************************
|
|
* class : CKCBusyProgressCtrl
|
|
* author : Peter Mares / kinkycode.com (gui@ch.co.za)
|
|
* base class : CStatic (MFC)
|
|
* notes : Control to be used for progress indication when there are
|
|
* no lower and upper bounds available for a progress bar.
|
|
* Can also be used as a normal progress bar
|
|
*
|
|
* Disclaimer : Its free, it feels good and its from South Africa :)
|
|
****************************************************************************
|
|
* Version History:
|
|
*
|
|
* v0.1 (2003-04-21)
|
|
*
|
|
* - First public release
|
|
*
|
|
* v0.2 (2003-04-22)
|
|
*
|
|
* - Added support for WM_SYSCOLORCHANGE
|
|
* - Added flag for whether background colour was a system colour (true by default)
|
|
* - Modified ON_MESSAGE handlers to return LRESULT instead of void for
|
|
* VC++.NET compatibility
|
|
* - Added "Busy Type" flag to support different motion while in busy mode.
|
|
* Current modes supported are : BPC_BUSY_PINGPONG
|
|
* BPC_BUSY_LTR (left to right)
|
|
* BPC_BUSY_RTL (right to left)
|
|
* - Added "Busy Fill" flag to support different filling methods while in
|
|
* busy mode.
|
|
* Current modes supported are : BPC_BUSYFILL_BLOCK (block filling)
|
|
* BPC_BUSYFILL_SMOOTH (smooth filling)
|
|
* - Fixed bug in percentage fill calculation
|
|
*
|
|
* v0.21 (2003-04-30)
|
|
*
|
|
* - Fixed a threading bug (identified by Mark Richards - thanks)
|
|
*
|
|
* v0.3 (2003-05-02)
|
|
*
|
|
* - Added the outstanding BPM_XXXXX Messages and handlers to the control
|
|
*
|
|
****************************************************************************/
|
|
|
|
#if !defined(AFX_BUSYPROGRESSCTRL_H__BEE47141_AAF5_44A5_8408_2C4452BD764A__INCLUDED_)
|
|
#define AFX_BUSYPROGRESSCTRL_H__BEE47141_AAF5_44A5_8408_2C4452BD764A__INCLUDED_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
// BusyProgressCtrl.h : header file
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CKCBusyProgressCtrl window
|
|
|
|
//
|
|
// defines for the control's mode
|
|
#define BPC_MODE_BUSY 0x00000001
|
|
#define BPC_MODE_PROGRESS 0x00000002
|
|
|
|
//
|
|
// defines for the type of BUSY mode
|
|
#define BPC_BUSY_PINGPONG 0x00000001
|
|
#define BPC_BUSY_LTR 0x00000002
|
|
#define BPC_BUSY_RTL 0x00000004
|
|
|
|
//
|
|
// defines for the fill type of BUSY mode
|
|
#define BPC_BUSYFILL_BLOCK 0x00000001
|
|
#define BPC_BUSYFILL_SMOOTH 0x00000002
|
|
|
|
//
|
|
// custom message defines
|
|
#define BPM_SETNUMSTEPS (WM_USER+1)
|
|
#define BPM_SETCURPOS (WM_USER+2)
|
|
#define BPM_SETIBPAD (WM_USER+3)
|
|
#define BPM_SETSPEED (WM_USER+4)
|
|
#define BPM_SETRANGE (WM_USER+5)
|
|
#define BPM_SETMODE (WM_USER+6)
|
|
#define BPM_STARTBUSY (WM_USER+7)
|
|
#define BPM_ENDBUSY (WM_USER+8)
|
|
#define BPM_STEPIT (WM_USER+9)
|
|
// new in version 0.3
|
|
#define BPM_SETBUSYTYPE (WM_USER+10)
|
|
#define BPM_SETBUSYFILL (WM_USER+11)
|
|
#define BPM_SETGRANULARITY (WM_USER+12)
|
|
#define BPM_SETCOLBKG (WM_USER+13)
|
|
#define BPM_SETCOLBFACE (WM_USER+14)
|
|
#define BPM_SETCOLBEDGE (WM_USER+15)
|
|
#define BPM_SETCOLBFACEHI (WM_USER+16)
|
|
#define BPM_SETCOLBEDGEHI (WM_USER+17)
|
|
#define BPM_RECALC (WM_USER+18)
|
|
#define BPM_RESET (WM_USER+19)
|
|
#define BPM_USESYSCOL (WM_USER+20)
|
|
|
|
class CKCBusyProgressCtrl : public CStatic
|
|
{
|
|
// Construction
|
|
public:
|
|
CKCBusyProgressCtrl(int nNumSteps = 10, int nCurPos = 0);
|
|
virtual ~CKCBusyProgressCtrl();
|
|
|
|
//
|
|
// Methods
|
|
|
|
// since version 0.1
|
|
void Recalc();
|
|
void Reset();
|
|
void Start();
|
|
void End();
|
|
void StepIt();
|
|
|
|
void SetNumSteps(int nNumSteps) { m_nNumSteps = nNumSteps; Recalc(); }
|
|
int GetNumSteps() { return m_nNumSteps; }
|
|
void SetCurPos(int nCurPos) { m_nCurPos = nCurPos; Invalidate(); }
|
|
int GetCurPos() { return m_nCurPos; }
|
|
void SetInterBlockPadding(int nPadding) { m_nIBPadding = nPadding; Recalc(); }
|
|
int GetInterBlockPadding() { return m_nIBPadding; }
|
|
void SetSpeed(int nSpeed) { m_nSpeed = nSpeed; }
|
|
int GetSpeed() { return m_nSpeed; }
|
|
bool IsRunning() { return (m_pThrd != NULL); }
|
|
void SetMode(int nMode = BPC_MODE_BUSY);
|
|
int GetMode() { return m_nMode; }
|
|
void SetRange(int nLower, int nUpper) { m_nLower = nLower; m_nUpper = nUpper; }
|
|
void GetRange(int& nLower, int& nUpper) { nLower = m_nLower; nUpper = m_nUpper; }
|
|
// new in version 0.2
|
|
void UseSysColBkg(bool bUse = true);
|
|
void SetBusyType(int nType = BPC_BUSY_PINGPONG);
|
|
int GetBusyType() { return m_nBusyType; }
|
|
void SetBusyFill(int nFill = BPC_BUSYFILL_BLOCK);
|
|
int GetBusyFill() { return m_nBusyFill; }
|
|
void SetGranularity(int nGranularity = 5) { m_nGranularity = nGranularity; SetBusyFill(m_nBusyFill); }
|
|
int GetGranularity() { return m_nGranularity; }
|
|
|
|
// since version 0.1
|
|
COLORREF GetColBkg() { return m_colBkg; }
|
|
void SetColBkg(COLORREF col) { m_colBkg = col; }
|
|
COLORREF GetColBlockFace() { return m_colBlockFace; }
|
|
void SetColBlockFace(COLORREF col) { m_colBlockFace = col; }
|
|
COLORREF GetColBlockEdge() { return m_colBlockEdge; }
|
|
void SetColBlockEdge(COLORREF col) { m_colBlockEdge = col; }
|
|
COLORREF GetColBlockFaceHi() { return m_colBlockFaceHi; }
|
|
void SetColBlockFaceHi(COLORREF col) { m_colBlockFaceHi = col; }
|
|
COLORREF GetColBlockEdgeHi() { return m_colBlockEdgeHi; }
|
|
void SetColBlockEdgeHi(COLORREF col) { m_colBlockEdgeHi = col; }
|
|
|
|
// Overrides
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(CKCBusyProgressCtrl)
|
|
public:
|
|
virtual BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
|
|
protected:
|
|
virtual void PreSubclassWindow();
|
|
//}}AFX_VIRTUAL
|
|
|
|
protected:
|
|
|
|
//
|
|
// Methods
|
|
virtual void DrawBackground(CDC& dc, CRect& rect);
|
|
void DrawBlocks(CDC& dc, CRect& rect);
|
|
virtual void DrawBlock(CDC& dc, CRect& rect);
|
|
virtual void DrawHiliteBlock(CDC& dc, CRect& rect);
|
|
virtual void DrawPartialBlock(CDC& dc, CRect& rect, int nPartial);
|
|
|
|
// thread
|
|
static UINT thrdBusy(LPVOID pParam);
|
|
|
|
//
|
|
// Attributes
|
|
int m_nNumSteps;
|
|
int m_nStep;
|
|
int m_nCurPos;
|
|
CRect m_rect;
|
|
int m_nIBPadding;
|
|
double m_dBlockHeight;
|
|
double m_dBlockWidth;
|
|
CWinThread* m_pThrd;
|
|
bool m_bBusyThrd;
|
|
int m_nSpeed;
|
|
int m_nMode;
|
|
int m_nLower;
|
|
int m_nUpper;
|
|
bool m_bUseSysColBkg;
|
|
int m_nBusyType;
|
|
int m_nBusyFill;
|
|
int m_nGranularity;
|
|
int m_nNumStepsSmooth;
|
|
|
|
// colours
|
|
COLORREF m_colBkg;
|
|
COLORREF m_colBlockFace;
|
|
COLORREF m_colBlockEdge;
|
|
COLORREF m_colBlockFaceHi;
|
|
COLORREF m_colBlockEdgeHi;
|
|
|
|
// drawing stuff
|
|
CDC m_memDC;
|
|
CBitmap m_memBmp;
|
|
CBitmap* m_pOldBmp;
|
|
|
|
// Generated message map functions
|
|
//{{AFX_MSG(CKCBusyProgressCtrl)
|
|
afx_msg void OnPaint();
|
|
afx_msg void OnSize(UINT nType, int cx, int cy);
|
|
afx_msg void OnSysColorChange();
|
|
//}}AFX_MSG
|
|
afx_msg LRESULT OnSetNumSteps(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnSetCurPos(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnSetIBPad(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnSetSpeed(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnSetRange(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnSetMode(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnStartBusy(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnEndBusy(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnStepIt(WPARAM wParam, LPARAM lParam);
|
|
// new in version 0.3
|
|
afx_msg LRESULT OnSetBusyType(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnSetBusyFill(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnSetGranularity(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnSetColBkg(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnSetColBFace(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnSetColBEdge(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnSetColBFaceHi(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnSetColBEdgeHi(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnRecalc(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnReset(WPARAM wParam, LPARAM lParam);
|
|
afx_msg LRESULT OnUseSysCol(WPARAM wParam, LPARAM lParam);
|
|
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
//{{AFX_INSERT_LOCATION}}
|
|
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
|
|
|
|
#endif // !defined(AFX_BUSYPROGRESSCTRL_H__BEE47141_AAF5_44A5_8408_2C4452BD764A__INCLUDED_)
|