/****************************************************************** $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 // 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