www.pudn.com > ObjectInspector_demo.rar > ObjectInspector.h
#if !defined(AFX_OBJECTINSPECTOR_H__DB3F042A_B838_4CB7_B9AA_82DB7E7C82C6__INCLUDED_) #define AFX_OBJECTINSPECTOR_H__DB3F042A_B838_4CB7_B9AA_82DB7E7C82C6__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "float.h" #include#include #include using namespace std; #define CLASS_OBJECTINSPECTOR "ObjectInspectorCtrl" #define IDC_SCROLLBAR 999 #define IDC_INPLACECONTROL 998 // Notification codes : #define OIVN_ITEMCHANGED LVN_ITEMCHANGED // Inplacecontrol lost focus // and the associated property has been changed #define OIVN_ITEMCHANGING LVN_ITEMCHANGING // Value has been changed #define IsCtrlDown() ( (GetKeyState(VK_CONTROL) & (1 << (sizeof(SHORT)*8-1))) != 0 ) ///////////////////////////////////////////////////////////////////////////// // CObjectInspector class CObjectInspector : public CWnd { public: enum EBorderStyle { bsNone, bsSingle, bsLowered, bsRaised }; enum EPropertyType { ptGroup, ptShort, ptInteger, ptFloat, ptDouble, ptBool, ptDate, ptColor, ptStringList}; enum ESortDirection { sdUp, sdDown }; class CProperty { friend CObjectInspector; private : vector m_Childs; // vector of child items CRect m_rtPropertyRect; // bounding rectangle of the property cell CRect m_rtValueRect; // bounding rectangle of the value cell CRect m_rtGroupRect; // bounding rectangle of the group's plus/minus sign CWnd* m_pInplaceControl; // Currently active Inplace-Control CFont* m_pControlFont; // Controlfont CProperty* m_pParent; // Parent property bool m_bExpanded; // true if item is expanded bool m_bVisible; // true if item is visible (i.e. the parent is expanded) bool m_bUseTime; // used for COleDateTime properties. If true only the time portion will be shown bool m_bRadio; // used for bool properties. If true property is part of a radio group bool m_bRadioDummy; DWORD m_dwComboBoxStyle; CString m_cFloatFormat; // used for formatting a float or double value. Set this for customizing float/double display ////////////////////////////// CWnd* CreateControlFromType(); // Create control depending on the property type bool GetValueInternal(); // Get a property value from the inplace control void SetValueInternal(); // Set a property value void SendNotification(int nMsg = OIVN_ITEMCHANGED); // Sends notification to the OI's parent window protected : CString m_cName; // property name // Property values : short* m_psValue; // int* m_pnValue; float* m_pfValue; double* m_pdblValue; bool* m_pbValue; COleDateTime* m_pdtValue; COLORREF* m_pclValue; CString* m_pszValue; CStringList* m_pStringList; LPARAM m_pItemData; double m_dblMin; // Limits (min,max) for all numeric properties double m_dblMax; // ... int m_nMaxStringLen; // Max. string length for string properties int m_nImage; // Index of the image to be shown in front of the propty's name int m_nIndex; // Index of the property in the parent's child vector EPropertyType m_ptType; // Property type CWnd* m_pParentWnd; // parent window (CObjectInspector) bool m_bFocused; // True if currently focused, i.e. hottracked bool m_bEditing; // True if currently in edit mode void BeginEdit(); // Create the appropr. inplace control and put property in edit mode bool EndEdit(); // destroy the appropr. inplace control and put property in non-edit mode void CreateInplaceControl(); void DestroyInplaceControl(); void SetRectangles(CRect rtProperty, CRect rtValue); // Sets the bounding rectangles for both the property and the value cell void Create(CString cName, EPropertyType ptType); void RangeError(int nMin, int nMax); // Range checking stuff for numeric properties void RangeError(float fMin, float fMax); // ... void RangeError(double dblMin, double dblMax); // .... CWnd* GetInplaceControl(); // Returns pointer to the currently active inplace control CRect GetPropertyRect(); CRect GetValueRect(); CString GetValueAsText(); public : CProperty (CString cName) { Create (cName, ptGroup); } CProperty (CString cName, short *psValue, short sMin = SHRT_MIN, short sMax = SHRT_MAX) { m_dblMin = (double) sMin; m_dblMax = (double) sMax; m_psValue = psValue; Create(cName, ptShort); } CProperty (CString cName, bool bRadio, int *pnValue) { m_bRadioDummy = false; m_pbValue = &m_bRadioDummy; m_pnValue = pnValue; Create(cName, ptBool); m_bRadio = true; } CProperty (CString cName, int *pnValue, int nMin = INT_MIN, int nMax = INT_MAX) { m_dblMin = (double) nMin; m_dblMax = (double) nMax; m_pnValue = pnValue; Create(cName, ptInteger); } CProperty (CString cName, float *pfValue, float fMin = FLT_MIN, float fMax = FLT_MAX) { m_dblMin = (double) fMin; m_dblMax = (double) fMax; m_pfValue = pfValue; Create(cName, ptFloat); } CProperty (CString cName, double *pdblValue, double dblMin = DBL_MIN, double dblMax = DBL_MAX) { m_dblMin = (double) dblMin; m_dblMax = (double) dblMax; m_pdblValue = pdblValue; Create(cName, ptDouble); } CProperty (CString cName, bool *pbValue) { m_pbValue = pbValue; Create(cName, ptBool); } CProperty (CString cName, COleDateTime *pdtValue, bool bTime = false) { m_bUseTime = bTime; m_pdtValue = pdtValue; Create(cName, ptDate); } CProperty (CString cName, COLORREF *pclValue) { m_pclValue = pclValue; Create(cName, ptColor); } CProperty(CString cName, CString *pszValue, CStringList *pStringList = NULL, int nMaxLen = -1, DWORD dwStyle = CBS_DROPDOWN) { m_nMaxStringLen = nMaxLen; m_pszValue = pszValue; m_pStringList = pStringList; m_dwComboBoxStyle = dwStyle; Create(cName, ptStringList); } CProperty (UINT nID) { CString cText; cText.LoadString (nID); Create (cText, ptGroup); } CProperty (UINT nID, short *psValue, short sMin = SHRT_MIN, short sMax = SHRT_MAX) { CString cText; cText.LoadString (nID); m_dblMin = (double) sMin; m_dblMax = (double) sMax; m_psValue = psValue; Create(cText, ptShort); } CProperty (UINT nID, int *pnValue, int nMin = INT_MIN, int nMax = INT_MAX) { CString cText; cText.LoadString (nID); m_dblMin = (double) nMin; m_dblMax = (double) nMax; m_pnValue = pnValue; Create(cText, ptInteger); } CProperty (UINT nID, float *pfValue, float fMin = FLT_MIN, float fMax = FLT_MAX) { CString cText; cText.LoadString (nID); m_dblMin = (double) fMin; m_dblMax = (double) fMax; m_pfValue = pfValue; Create(cText, ptFloat); } CProperty (UINT nID, double *pdblValue, double dblMin = DBL_MIN, double dblMax = DBL_MAX) { CString cText; cText.LoadString (nID); m_dblMin = (double) dblMin; m_dblMax = (double) dblMax; m_pdblValue = pdblValue; Create(cText, ptDouble); } CProperty (UINT nID, bool *pbValue, bool bRadio = false) { CString cText; cText.LoadString (nID); m_bRadio = bRadio; m_pbValue = pbValue; Create(cText, ptBool); } CProperty (UINT nID, COleDateTime *pdtValue, bool bTime = false) { CString cText; cText.LoadString (nID); m_bUseTime = bTime; m_pdtValue = pdtValue; Create(cText, ptDate); } CProperty (UINT nID, COLORREF *pclValue) { CString cText; cText.LoadString (nID); m_pclValue = pclValue; Create(cText, ptColor); } CProperty(UINT nID, CString *pszValue, CStringList *pStringList = NULL, int nMaxLen = -1, DWORD dwStyle = CBS_DROPDOWN) { CString cText; cText.LoadString (nID); m_nMaxStringLen = nMaxLen; m_pszValue = pszValue; m_pStringList = pStringList; m_dwComboBoxStyle = dwStyle; Create(cText, ptStringList); } bool operator < (const CProperty& other) const { return (other.m_cName > m_cName) ? true : false; }; virtual ~CProperty(); EPropertyType GetType() { return m_ptType; }; void SetImage(int nImage) { m_nImage = nImage; }; void SetFloatFormat(CString cFormat) { m_cFloatFormat = cFormat; } void SetItemData(LPARAM pItemData) { m_pItemData = pItemData; } LPARAM GetItemData() { return m_pItemData; } CString GetName() { return m_cName; }; void Expand() { m_bExpanded = true; } void Collapse() { m_bExpanded = false; } void AddProperty(CProperty *pProperty); bool GetValueFromControl(short *psValue); bool GetValueFromControl(int *pnValue); bool GetValueFromControl(bool *pbValue); bool GetValueFromControl(float *pfValue); bool GetValueFromControl(double *pdblValue); bool GetValueFromControl(COleDateTime *pdtValue); bool GetValueFromControl(CString *pszValue); bool GetValueFromControl(COLORREF *pclValue); }; private: vector m_PropertyList; int m_nXSplitterPos; int m_nScrollPos; int m_nScrollRange; int m_nOverallItemHeight; int m_nFirstVisibleItem; int m_nExpandedItemsCount; int m_nHeaderHeight; int m_nIndent; int m_nComboDroppedHeight; int m_nCellHeight; int m_nMinPropertyColWidth; int m_nMinValueColWidth; bool m_bSplitterMoving; bool m_bScrollbarVisible; bool m_b3dFocus; bool m_bHotTrack; bool m_bSorted; bool m_bW2KStyle; CRect m_rtClientRect; CRect m_rtSplitterRect; CRect m_rtPropertyHeaderRect; CRect m_rtValueHeaderRect; COLORREF m_clBackColor; COLORREF m_clPropertyRowColor; COLORREF m_clValueRowColor; COLORREF m_clGridLineColor; COLORREF m_clFocusLineColor; CString m_cPropertyHeaderTitle; CString m_cPropertyValueTitle; CScrollBar m_ScrollBar; CProperty* m_pEditingProperty; CProperty* m_pLastEnteredProperty; CBrush m_CtrlBrush; CImageList* m_pImageList; EBorderStyle m_bsStyle; ESortDirection m_sdSortDirection; void CleanUp(); void CalculateScrollRange(CProperty *pProperty = NULL); void DrawScrollBar(); void DrawBorder(CDC *pDC, CRect& rect); void DrawSplitter(CDC *pDC); void DrawHeader(CDC *pDC); void DrawItem(CDC*pDC, CProperty *pProperty, int& nY, int& nCellHeight); void DrawChildItems(CDC*pDC,int& nItem, CProperty *pProperty, int& nY, int& nCellHeight); void DrawItems(CDC *pDC); CProperty *GetNextProperty(CProperty *pProperty); CProperty *GetPrevProperty(CProperty *pProperty); CProperty *GetPropertyFromPoint(CPoint point, CObjectInspector::CProperty *pRoot); public: CObjectInspector(); typedef struct tagNM_OIVIEW { NMHDR hdr; CProperty* pProperty; } NM_OIVIEW; BOOL Create(const RECT& rect, CWnd* parent, UINT nID, DWORD dwStyle = WS_POPUP | WS_VISIBLE); void AddProperty(CProperty* pProperty); void SetComboDropHeight(int nHeight) { m_nComboDroppedHeight = nHeight; }; void SetImageList(CImageList *pList) { m_pImageList = pList; }; void GeHeaderTitles(CString& cPropertyHeaderTitle, CString& cPropertyValueTitle); bool GetHotTrack(); bool Get3dFocus(); int GetMinPropertyColWidth(); int GetMinValueColWidth(); COLORREF GetBackColor(); COLORREF GetPropertyColTextColor(); COLORREF GetValueColTextColor(); COLORREF GetGridLineColor(); COLORREF GetFocusLineColor(); EBorderStyle GetBorderStyle(); void SetHeaderTitles(CString cPropertyHeaderTitle, CString cPropertyValueTitle); void SetBorderStyle(EBorderStyle bsStyle); void SetHotTrack(bool bEnabled); void Set3dFocus(bool bValue); void SetBackColor(COLORREF clBackColor); void SetPropertyColTextColor(COLORREF clPropertyRowColor); void SetValueColTextColor(COLORREF clValueRowColor); void SetGridLineColor(COLORREF clGridLineColor); void SetFocusLineColor(COLORREF clFocusLineColor); void SetMinPropertyColWidth(int nWidth); void SetMinValueColWidth(int nWidth); void SetStyle(bool bW2K); //{{AFX_VIRTUAL(CObjectInspector) public: virtual BOOL PreTranslateMessage(MSG* pMsg); protected: //}}AFX_VIRTUAL public: virtual ~CObjectInspector(); protected: //{{AFX_MSG(CObjectInspector) afx_msg void OnPaint(); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); afx_msg void OnChangeInplaceControl(); afx_msg void OnChangeDateTimeCtrl(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnSelchangeComboBox(); afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); afx_msg void OnRadioSelect(); afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} #endif // AFX_OBJECTINSPECTOR_H__DB3F042A_B838_4CB7_B9AA_82DB7E7C82C6__INCLUDED_