2024-06-23 17:36:53 +08:00

373 lines
14 KiB
C++

/******************************************************************
$Archive: /MfcExt/Source/CoolControlsManager.h $
$Workfile: CoolControlsManager.h $
$Author: Bogdan Ledwig $
$Date: 99-04-26 22:11 $
$Revision: 13 $
*******************************************************************/
/*
Written by Bogdan Ledwig
e-mail: bogdanle@opole.mtl.pl
web site: http://bogdanle.cjb.net/
Copyright © 1999 Bogdan Ledwig. All Rights Reserved.
This code may be used in compiled form in any way you wish. This
file may be redistributed unmodified by any means PROVIDING it is
not sold for profit without the authors written consent, and
providing that this notice and the authors name is included. If the
source code is used in any commercial product then a statement
along the lines of "Portions Copyright (C) 1999 Bogdan Ledwig"
must be included in the startup banner, "About" box or printed
documentation. An email letting me know that you are using it would be
nice as well.
This software is provided "as is" without express or implied warranty.
Use it at you own risk! The author accepts no liability for any damages
to your computer or data these products may cause.
History:
1.0 1999-02-24 First public release
1.1 1999-05-16 LVS_EX_HEADERDRAGDROP list control bug fixed (thanks to Vlad Bychkoff for pointing this out)
UNICODE support added
WH_CALLWNDPROCRET is no longer supported due to some weird problems with that
Added support for multiple UI threads - (thanks for Mike Walter for the code)
Class name has been changed to CCoolControlsManager (my own idea)
Added support for SysTabControl32
*/
#if !defined (__CoolControlsManager_h)
#define __CoolControlsManager_h
#include <afxtempl.h> // For CMapPtrToPtr
//////////////////////////////////////////////////////////////////////
// CCoolControlsManager class
class CCoolControlsManager {
public:
enum ButtonStatesEnum {
bsNormal,
bsHover,
bsChecked,
};
enum DrawStatesEnum {
dsNormal,
dsHover,
dsAlternate,
dsFocus = 0x04,
dsHoverMask = 0x05,
dsDisabled = 0x08,
};
// Base class for all controls and dialogs
class CCMCore {
public:
void Subclass( HWND hWnd, WNDPROC wndNewProc );
void Unsubclass();
// New window procedure (must be implemented by derived classes)
virtual LRESULT WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam ) = 0;
protected:
HWND m_hWnd; // Handle of the window
WNDPROC m_oldWndProc; // Address of original window procedure
};
// Class that holds important control informations and is
// responsible for drawing the control
class CCMControl : public CCMCore {
// Construction/destruction
public:
CCMControl();
// Operations
public:
// Main drawing routine
void DrawBorder();
// Returns TRUE if control needs repainting
virtual BOOL NeedRedraw( const POINT& point );
// Give acces to the control state
void SetState( int nFlagRemove, int nFlagAdd, BOOL bRedraw = TRUE );
int GetState() const;
// New window procedure
virtual LRESULT WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
static HWND m_hWndOld; // Previously 'hovered' or 'focused' window
// Implementation
protected:
// Paint the scrollbars if a window contains at least one
void DrawScrollBars( HDC hDC, const RECT& rc );
// Paint the scrollbar control or an embedded window scrollbar (horiz or vert)
void DrawScrollBar( HDC hDC, const RECT& rc,
int nType, BOOL bScrollbarCtrl = FALSE );
// Draw the scrollbar thumb
void DrawScrollbarThumb( HDC hDC, const RECT& rc );
// There are helper functions for drawing 3D frames
static void Draw3dBorder( HDC hDC, const RECT& rc,
int nColor1, int nColor2,
int nColor3, int nColor4 );
static void Draw3dBorder( HDC hDC, const RECT& rc,
int nColor1, int nColor2,
int nColor3, int nColor4,
int nColor5, int nColor6 );
static void FillSolidRect( HDC hDC, const RECT& rect, COLORREF clr );
static void FillSolidRect( HDC hDC, int x, int y, int cx, int cy, COLORREF clr );
static void Draw3dRect( HDC hDC, int x, int y, int cx, int cy,
COLORREF clrTopLeft, COLORREF clrBottomRight );
static void Draw3dRect( HDC hDC, const RECT& rect,
COLORREF clrTopLeft, COLORREF clrBottomRight );
// Overrides
protected:
// Prepares DC and RECT for further drawings
virtual void PrepareDraw( HDC& hDC, RECT& rc );
// Drawing code which is specific to the control
virtual void DrawControl( HDC hDC, const RECT& rc );
// Returns TRUE if control (or one of its children) has a focus
virtual BOOL IsFocused();
short m_nState; // Current control state
short m_nOldState; // Previous control state
};
// Edit windows
class CCMEdit : public CCMControl {
public:
virtual LRESULT WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
protected:
virtual void DrawControl( HDC hDC, const RECT& rc );
};
// ComboBoxes (all styles are suported)
class CCMComboBox : public CCMControl {
public:
virtual LRESULT WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
protected:
virtual void DrawControl( HDC hDC, const RECT& rc );
virtual BOOL IsFocused();
};
// Date/Time pickers
class CCMDateTime : public CCMComboBox {
protected:
virtual void DrawControl( HDC hDC, const RECT& rc );
};
// Pushbuttons
class CCMPushButton : public CCMControl {
public:
virtual LRESULT WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
protected:
virtual void DrawControl( HDC hDC, const RECT& rc );
};
// Checkboxes
class CCMCheckBox : public CCMPushButton {
protected:
virtual void DrawControl( HDC hDC, const RECT& rc );
// Check boxes and radio buttons are always drawn
// in the same way regardless of focus
virtual BOOL IsFocused() { return FALSE; }
};
// Radiobuttons
class CCMRadioButton : public CCMPushButton {
protected:
virtual void DrawControl( HDC hDC, const RECT& rc );
void DrawFrame( POINT* ptArr, int nColor,
HDC hDC, int xOff, int yOff );
virtual BOOL IsFocused() { return FALSE; }
};
// Spin Buttons
class CCMUpDown : public CCMControl {
protected:
virtual void DrawControl( HDC hDC, const RECT& rc );
void DrawButton( HDC hDC, const RECT& rc );
};
// Edit control in simple combobox
class CCMEditCombo : public CCMEdit {
protected:
virtual void PrepareDraw( HDC& hDC, RECT& rc );
};
// Stand-alone scrollbar controls
class CCMScrollBar : public CCMControl {
public:
virtual LRESULT WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
protected:
virtual void DrawControl( HDC hDC, const RECT& rc );
};
// Header control
class CCMHeaderCtrl : public CCMControl {
public:
virtual BOOL NeedRedraw( const POINT& point );
protected:
virtual void DrawControl( HDC hDC, const RECT& rc );
void DrawButton( HDC hDC, const RECT& rc, int nState );
private:
int m_nOldItem; // Recently selected item
};
// Slider control
class CCMTrackbar : public CCMControl {
protected:
virtual void DrawControl( HDC hDC, const RECT& rc );
void DrawThumb( HDC hDC, const RECT& rc );
};
// Toolbars
class CCMToolbar : public CCMControl {
public:
virtual BOOL NeedRedraw( const POINT& point );
virtual LRESULT WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
protected:
virtual void DrawControl( HDC hDC, const RECT& rc );
void DrawButton( HDC hDC, const RECT& rc, int nState );
private:
int m_nOldItem; // Recently selected item
};
// IP Address control
class CCMIPAddress : public CCMControl {
public:
virtual LRESULT WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
protected:
virtual BOOL IsFocused();
};
// Tab control
class CCMTabControl : public CCMControl {
public:
enum OrientationsEnum {
tabTop,
tabLeft,
tabRight,
tabBottom,
};
CCMTabControl()
{
m_nOldItem = -1;
}
virtual LRESULT WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
virtual BOOL NeedRedraw( const POINT& point );
protected:
virtual void DrawControl( HDC hDC, const RECT& rc );
void DrawTab( HDC hDC, const RECT& rc, int nItem, int nState );
virtual BOOL IsFocused() { return FALSE; }
OrientationsEnum GetOrientation() const;
private:
int m_nOldItem; // Recently selected item
};
// Dialog (parent of controls)
class CCMDialog : public CCMCore {
public:
virtual LRESULT WindowProc( UINT uMsg, WPARAM wParam, LPARAM lParam );
};
public:
CCoolControlsManager();
virtual ~CCoolControlsManager();
void Install( HWND hWnd ); // Installs control manager for given window only
void Uninstall( HWND hWnd ); // Removes all window controls from the map
// Installs WH_CALLWNDPROC hook, which automatically
// handles all dialogs in the givent thread. If dwThreadID = -1, then
// current thread is used
void InstallHook( DWORD dwThreadID = -1, BOOL bDialogOnly = TRUE );
// Installs WH_CALLWNDPROC hook for
// all dialogs in system (valid only for a DLL)
void InstallGlobalHook( HINSTANCE hInstance, BOOL bDialogOnly = TRUE );
// Uninstals hook
void UninstallHook( DWORD dwThreadID = -1 );
// Adds single control to the map
BOOL AddControl( HWND hWnd, LPCTSTR lpszClass = NULL );
// Removes single control from the map
BOOL RemoveControl( HWND hWnd );
void AddDialog( HWND hWnd ); // Add dialog
void RemoveDialog( HWND hWnd ); // Removes dialog window from the map
void Enable( BOOL bEnable = TRUE ); // Temporary enable/disable control manager
BOOL IsEnabled() const; // Returns TRUE if control manager is enabled
void TimerProc(); // Timer procedure
static CMapPtrToPtr m_ctrlMap; // Main control map
static CMapWordToPtr m_threadMap; // Main thread map
protected:
// Other class members
static BOOL m_bEnabled; // TRUE if control manager is enabled
BOOL m_bDialogOnly; // Process only controls in dialogs
HOOKPROC m_hkWndProc; // Old WH_WNDPROC hook procedure
UINT m_uTimerID; // Our timer identifier
static CMapPtrToPtr m_dlgMap; // Map for dialog window (in general - for owner of controls)
// Give access to the protected members for these functions
friend LRESULT CALLBACK CCM_CallWndProc( int nCode, WPARAM wParam, LPARAM lParam );
friend static LRESULT CALLBACK CCM_DialogProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
friend static LRESULT CALLBACK CCM_ControlProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
friend static void CALLBACK CCM_TimerProc( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime );
};
//////////////////////////////////////////////////////////////////////////////////////////
// CCoolControlsManager inlines
inline
void CCoolControlsManager::Enable( BOOL bEnable )
{
m_bEnabled = bEnable;
}
inline
BOOL CCoolControlsManager::IsEnabled() const
{
return m_bEnabled;
}
/////////////////////////////////////////////////////////////////////////////
// CCMControl inlines
inline
void CCoolControlsManager::CCMControl::SetState( int nFlagRemove, int nFlagAdd, BOOL bRedraw )
{
m_nState &= ~nFlagRemove;
m_nState |= nFlagAdd;
if ( bRedraw )
DrawBorder();
}
inline
int CCoolControlsManager::CCMControl::GetState() const
{
return m_nState;
}
// Gives access to the one and only CCoolControlsManager object
CCoolControlsManager& GetCtrlManager();
#endif // __CoolControlsManager_h