Blame | Last modification | View Log
////////////////////////////////////////////////////////////////////////////// File: ReportCtrl.h// Version: 2.0.1//// Author: Maarten Hoeben// E-mail: hamster@xs4all.nl//// Implementation of the CReportCtrl and associated classes.//// This code may be used in compiled form in any way you desire. 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 and all copyright// notices remains intact.//// An email letting me know how you are using it would be nice as well.//// This file is provided "as is" with no expressed or implied warranty.// The author accepts no liability for any damage/loss of business that// this product may cause.//////////////////////////////////////////////////////////////////////////////#if !defined(AFX_REPORTCTRL_H__279B1CA0_D7F2_11D2_88D7_ABB23645F26D__INCLUDED_)#define AFX_REPORTCTRL_H__279B1CA0_D7F2_11D2_88D7_ABB23645F26D__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000// ReportCtrl.h : header file//#include <afxtempl.h>#include "MemDC.h"#include "FlatHeaderCtrl.h"#define ID_HEADERCTRL 0#define ID_REPORTCTRL 0// Use this as the classname when inserting this control as a custom control// in the MSVC++ dialog editor#define REPORTCTRL_CLASSNAME _T("MFCReportCtrl")#define REPORTCTRL_MAX_TEXT 256#define REPORTCTRL_MAX_CACHE 128// Properties#define RVP_SPACING 1#define RVP_CHECK 2#define RVP_NOITEMTEXT 3#define RVP_GRIDSTYLE 4#define RVP_SORTTOOLTIP 5#define RVP_NOTIFYMASK 6#define RVP_ENABLEITEMCACHEMAP 7#define RVP_SEPARATOR 8#define RVP_ENABLEPREVIEW 9#define RVP_ENABLEHORZSCROLLBAR 10#define RVP_FRAMECONTROLSTYLE 11#define RVP_ENABLEIMAGEBLENDING 12#define RVP_BLENDCOLOR 13#define RVP_CBSEPARATOR 14#define RVP_CBINDENT 15#define RVP_GRIDSTYLE_DOT 0#define RVP_GRIDSTYLE_DASH 1#define RVP_GRIDSTYLE_SOLID 2#define RVP_FCSTYLE_FLAT 0#define RVP_FCSTYLE_MONO 1#define RVP_FCSTYLE_NORMAL 2#define RVP_BLEND_NONE 0#define RVP_BLEND_SELECT 1#define RVP_BLEND_FOCUS 2#define RVP_BLEND_ALL 3// Styles#define RVS_SINGLESELECT 0x0001#define RVS_SHOWSELALWAYS 0x0002#define RVS_SHOWCOLORALWAYS 0x0004#define RVS_SHOWCOLORALTERNATE 0x0008#define RVS_SHOWHGRID 0x0010#define RVS_SHOWVGRID 0x0020#define RVS_NOHEADER 0x0040#define RVS_NOSORT 0x0080#define RVS_ALLOWCOLUMNREMOVAL 0x0100#define RVS_SHOWEDITROW 0x0200#define RVS_SHOWHGRIDEX 0x0400#define RVS_OWNERDATA 0x0800#define RVS_FOCUSSUBITEMS 0x1000#define RVS_EXPANDSUBITEMS 0x2000#define RVS_GROUPVIEW 0x4000#define RVS_TREEVIEW 0x8000#define RVS_TREEMASK 0xc000// Column Format#define RVCF_LEFT HDF_LEFT#define RVCF_RIGHT HDF_RIGHT#define RVCF_CENTER HDF_CENTER#define RVCF_TEXT HDF_STRING#define RVCF_IMAGE HDF_IMAGE#define RVCF_JUSTIFYMASK HDF_JUSTIFYMASK#define RVCF_MASK 0x0000ffff#define RVCF_EX_AUTOWIDTH (HDF_EX_AUTOWIDTH<<16)#define RVCF_EX_INCLUDESORT (HDF_EX_INCLUDESORT<<16)#define RVCF_EX_FIXEDWIDTH (HDF_EX_FIXEDWIDTH<<16)#define RVCF_EX_TOOLTIP (HDF_EX_TOOLTIP<<16)#define RVCF_EX_PERSISTENT (HDF_EX_PERSISTENT<<16)#define RVCF_EX_MASK 0x00ff0000#define RVCF_SUBITEM_IMAGE 0x01000000#define RVCF_SUBITEM_CHECK 0x02000000#define RVCF_SUBITEM_NOFOCUS 0x04000000#define RVCF_SUBITEM_MASK 0xff000000typedef struct _RVSUBITEM{UINT nFormat;INT iWidth;INT iMinWidth;INT iMaxWidth;INT iImage;LPTSTR lpszText;_RVSUBITEM() : nFormat(RVCF_LEFT|RVCF_TEXT), iWidth(-1), iMinWidth(0), iMaxWidth(0), iImage(0), lpszText(NULL) {};} RVSUBITEM, FAR* LPRVSUBITEM;// Item Masks#define RVIM_TEXT 0x0001#define RVIM_TEXTCOLOR 0x0002#define RVIM_IMAGE 0x0004#define RVIM_CHECK 0x0008#define RVIM_BKCOLOR 0x0010#define RVIM_PREVIEW 0x0020#define RVIM_STATE 0x0040#define RVIM_LPARAM 0x0080#define RVIM_INDENT 0x0100#define RVIM_OVERLAY 0x0200// Item Index#define RVI_INVALID -2#define RVI_EDIT -1#define RVI_FIRST 0#define RVI_LAST INT_MAX// Tree Item#define RVTI_ROOT TVI_ROOT#define RVTI_FIRST TVI_FIRST#define RVTI_LAST TVI_LAST#define RVTI_SORT TVI_SORT// Item State#define RVIS_FOCUSED 0x0001#define RVIS_SELECTED 0x0002#define RVIS_BOLD 0x0004#define RVIS_READONLY 0x0008#define RVIS_OWNERDRAW 0x0010#define RVIS_TREECLOSED 0x0020#define RVIS_TREEOPENED 0x0040#define RVIS_BLEND25 0x0080#define RVIS_BLEND50 0x0100#define RVIS_TREEMASK 0x0060#define RVIS_BLENDMASK 0x0180typedef struct _RVITEM{UINT nMask;INT iItem;INT iSubItem;LPTSTR lpszText;INT iTextMax;INT iTextColor;INT iImage;INT iCheck;INT iBkColor;UINT nPreview;INT iIndent;UINT nState;LPARAM lParam;INT iOverlay;_RVITEM() : nMask(0), iItem(RVI_INVALID), iSubItem(-1), lpszText(NULL), iTextMax(0), iTextColor(-1), iImage(-1), iCheck(-1), iBkColor(-1), nPreview(0), iIndent(-1), nState(0), lParam(0), iOverlay(0) {};} RVITEM, FAR* LPRVITEM;// Hit Test#define RVHT_NOWHERE 0x0001#define RVHT_ONITEMIMAGE 0x0002#define RVHT_ONITEMCHECK 0x0004#define RVHT_ONITEMTEXT 0x0008#define RVHT_ONITEMSUBITEM (RVHT_ONITEMIMAGE|RVHT_ONITEMCHECK|RVHT_ONITEMTEXT)#define RVHT_ONITEMPREVIEW 0x0010#define RVHT_ONITEMTREEBOX 0x0020#define RVHT_ONITEM (RVHT_ONITEMIMAGE|RVHT_ONITEMCHECK|RVHT_ONITEMTEXT|RVHT_ONITEMPREVIEW)#define RVHT_ONITEMEDIT 0x0040#define RVHT_ABOVE 0x0100#define RVHT_BELOW 0x0200#define RVHT_TORIGHT 0x0400#define RVHT_TOLEFT 0x0800typedef struct _RVHITTESTINFO{POINT point;UINT nFlags;HTREEITEM hItem;INT iItem;INT iSubItem;INT iRow;INT iColumn;RECT rect;} RVHITTESTINFO, FAR* LPRVHITTESTINFO;// Find Itemtypedef struct _RVFINDINFO{UINT nFlags;LPCTSTR lpszText;INT iImage;INT iCheck;LPARAM lParam;} RVFINDINFO, FAR* LPRVFINDINFO;#define RVFI_TEXT 0x0001#define RVFI_PARTIAL 0x0002#define RVFI_IMAGE 0x0004#define RVFI_CHECK 0x0008#define RVFI_LPARAM 0x0010#define RVFI_WRAP 0x0100#define RVFI_UP 0x0200// Expand Item#define RVE_COLLAPSE 0#define RVE_EXPAND 1#define RVE_TOGGLE 2// Get Next Item#define RVGN_ROOT 0x0000#define RVGN_NEXT 0x0001#define RVGN_PREVIOUS 0x0002#define RVGN_PARENT 0x0003#define RVGN_CHILD 0x0004#define RVGN_FOCUSED 0x0005// Notifications#define RVN_FIRST (0U-2048U)#define RVN_LAST (0U-2066U)#define RVN_ITEMDRAWPREVIEW (0U-2048U)#define RVN_ITEMCLICK (0U-2049U)#define RVN_ITEMDBCLICK (0U-2050U)#define RVN_SELECTIONCHANGING (0U-2051U)#define RVN_SELECTIONCHANGED (0U-2052U)#define RVN_HEADERCLICK (0U-2053U)#define RVN_LAYOUTCHANGED (0U-2054U)#define RVN_ITEMDELETED (0U-2055U)#define RVN_ITEMCALLBACK (0U-2056U)#define RVN_BEGINITEMEDIT (0U-2057U)#define RVN_ENDITEMEDIT (0U-2058U)#define RVN_KEYDOWN (0U-2059U)#define RVN_DIVIDERDBLCLICK (0U-2060U)#define RVN_ITEMRCLICK (0U-2061U)#define RVN_BUTTONCLICK (0U-2062U)#define RVN_ITEMDRAW (0U-2063U)#define RVN_ITEMEXPANDING (0U-2064U)#define RVN_ITEMEXPANDED (0U-2065U)#define RVN_HEADERRCLICK (0U-2066U)// Notification masks#define RVNM_ITEMDRAWPREVIEW 0x00000001#define RVNM_ITEMCLICK 0x00000002#define RVNM_ITEMDBCLICK 0x00000004#define RVNM_SELECTIONCHANGING 0x00000008#define RVNM_SELECTIONCHANGED 0x00000010#define RVNM_HEADERCLICK 0x00000020#define RVNM_LAYOUTCHANGED 0x00000040#define RVNM_ITEMDELETED 0x00000080#define RVNM_ITEMCALLBACK 0x00000100#define RVNM_BEGINITEMEDIT 0x00000200#define RVNM_ENDITEMEDIT 0x00000400#define RVNM_KEYDOWN 0x00000800#define RVNM_DIVIDERDBLCLICK 0x00001000#define RVNM_ITEMRCLICK 0x00002000#define RVNM_BUTTONCLICK 0x00004000#define RVNM_ITEMDRAW 0x00008000#define RVNM_ITEMEXPANDING 0x00010000#define RVNM_ITEMEXPANDED 0x00020000#define RVNM_HEADERRCLICK 0x00040000#define RVNM_ALL 0xFFFFFFFFtypedef struct _NMRVDRAWPREVIEW{NMHDR hdr;HTREEITEM hItem;INT iItem;UINT nState;HDC hDC;RECT rect;LPARAM lParam;} NMRVDRAWPREVIEW, FAR* LPNMRVDRAWPREVIEW;typedef struct _NMREPORTVIEW{NMHDR hdr;UINT nKeys;POINT point;UINT nFlags;HTREEITEM hItem;INT iItem;INT iSubItem;UINT nState;LPARAM lParam;} NMREPORTVIEW, FAR* LPNMREPORTVIEW;typedef struct _NMRVHEADER{NMHDR hdr;INT iSubItem;UINT nWidth;} NMRVHEADER, FAR* LPNMRVHEADER;typedef struct _NMRVITEMCALLBACK{NMHDR hdr;RVITEM item;} NMRVITEMCALLBACK, FAR* LPNMRVITEMCALLBACK;typedef INT (CALLBACK* LPFNRVCOMPARE)(INT iItem1, INT iSubItem1, INT iItem2, INT iSubItem2, LPARAM lParam);typedef struct _NMRVITEMEDIT{NMHDR hdr;HTREEITEM hItem;INT iItem;INT iSubItem;BOOL bButton;HWND hWnd;RECT rect;UINT nKey;LPTSTR lpszText;LPARAM lParam;} NMRVITEMEDIT, FAR* LPNMRVITEMEDIT;typedef struct _NMRVITEMDRAW{NMHDR hdr;LPRVITEM lprvi;HDC hDC;RECT rect;} NMRVITEMDRAW, FAR* LPNMRVITEMDRAW;// Item Rect#define RVIR_BOUNDS 0#define RVIR_IMAGE 1#define RVIR_CHECK 2#define RVIR_TEXT 3#define RVIR_TEXTNOCOLUMNS 4class CReportCtrl;class CReportSubItemListCtrl;/////////////////////////////////////////////////////////////////////////////// Global utilities#ifndef WS_EX_LAYERED#define WS_EX_LAYERED 0x00080000#define ULW_COLORKEY 0x00000001#define ULW_ALPHA 0x00000002#endiftypedef BOOL (WINAPI *lpfnUpdateLayeredWindow)(HWND hWnd, HDC hdcDst, POINT *pptDst, SIZE *psize, HDC hdcSrc,POINT *pptSrc, COLORREF crKey, BLENDFUNCTION *pblend, DWORD dwFlags);typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)(HWND hwnd, COLORREF crKey, BYTE xAlpha, DWORD dwFlags);BOOL InitLayeredWindows();BOOL MatchString(const CString& strString, const CString& strPattern);/////////////////////////////////////////////////////////////////////////////// CReportEditCtrl windowclass CReportEditCtrl : public CEdit{public:CReportEditCtrl(INT iItem, INT iSubItem, BOOL bButton = TRUE);// Operationspublic:void BeginEdit(UINT nKey);void EndEdit();// Overridespublic:virtual ~CReportEditCtrl();// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CReportEditCtrl)public:virtual BOOL PreTranslateMessage(MSG* pMsg);protected:virtual void PostNcDestroy();virtual BOOL PreCreateWindow(CREATESTRUCT& cs);//}}AFX_VIRTUAL// Implementationprotected:BOOL m_bEndEdit;INT m_iItem;INT m_iSubItem;BOOL m_bButton;CButton m_wndButton;UINT m_nLastKey;//{{AFX_MSG(CReportEditCtrl)afx_msg void OnKillFocus(CWnd* pNewWnd);afx_msg UINT OnGetDlgCode();afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);//}}AFX_MSGDECLARE_MESSAGE_MAP()};/////////////////////////////////////////////////////////////////////////////// CReportComboCtrl windowclass CReportComboCtrl : public CComboBox{public:CReportComboCtrl(INT iItem, INT iSubItem);// Operationspublic:void BeginEdit(UINT nKey);void EndEdit();// Overridespublic:virtual ~CReportComboCtrl();// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CReportComboCtrl)public:virtual BOOL PreTranslateMessage(MSG* pMsg);protected:virtual void PostNcDestroy();//}}AFX_VIRTUAL// Implementationprotected:BOOL m_bEndEdit;INT m_iItem;INT m_iSubItem;UINT m_nLastKey;//{{AFX_MSG(CReportComboCtrl)afx_msg UINT OnGetDlgCode();afx_msg void OnKillfocus();//}}AFX_MSGDECLARE_MESSAGE_MAP()};/////////////////////////////////////////////////////////////////////////////// CReportTipCtrl window#define REPORTTIPCTRL_CLASSNAME _T("MFCReportTipCtrl")#define REPORTTIPCTRL_FADETIME 500#define REPORTTIPCTRL_FADESTEP 10#define REPORTTIPCTRL_FADETIMEOUT 100class CReportTipCtrl : public CWnd{// Constructionpublic:CReportTipCtrl();BOOL Create(CReportCtrl *pReportCtrl);// Attributespublic:// Operationspublic:BOOL Show(CRect rectTitle, LPCTSTR lpszText, CFont* pFont = NULL);void Hide();// Overridespublic:virtual ~CReportTipCtrl();// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CReportTipCtrl)public:virtual BOOL PreTranslateMessage(MSG* pMsg);//}}AFX_VIRTUAL// Implementationprotected:CReportCtrl *m_pReportCtrl;BOOL m_bLayeredWindows;UINT m_nAlpha;CRect m_rectText;CRect m_rectTip;DWORD m_dwLastLButtonDown;DWORD m_dwDblClickMsecs;// Generated message map functionsprotected://{{AFX_MSG(CReportTipCtrl)afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnTimer(UINT nIDEvent);//}}AFX_MSGDECLARE_MESSAGE_MAP()};/////////////////////////////////////////////////////////////////////////////// CReportHeaderCtrl windowclass CReportHeaderCtrl : public CFlatHeaderCtrl{// Constructionpublic:CReportHeaderCtrl();// Attributespublic:void SetMinMax(INT iPos, INT iMin, INT iMax);// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CReportHeaderCtrl)//}}AFX_VIRTUAL// Implementationpublic:virtual ~CReportHeaderCtrl();// Generated message map functionsprotected://{{AFX_MSG(CReportHeaderCtrl)afx_msg void OnRButtonDown(UINT nFlags, CPoint point);//}}AFX_MSGDECLARE_MESSAGE_MAP()};/////////////////////////////////////////////////////////////////////////////// CReportData storage classclass CReportData : public CString{public:CReportData();~CReportData();BOOL New(INT iSubItems);BOOL GetSubItem(INT iSubItem, LPINT lpiImage, LPINT lpiOverlay, LPINT lpiCheck, LPINT lpiColor, LPTSTR lpszText, LPINT lpiTextMax);BOOL SetSubItem(INT iSubItem, INT iImage, INT iOverlay, INT iCheck, INT iColor, LPCTSTR lpszText);BOOL InsertSubItem(INT iSubItem, INT iImage, INT iOverlay, INT iCheck, INT iColor, LPCTSTR lpszText);BOOL DeleteSubItem(INT iSubItem);};/////////////////////////////////////////////////////////////////////////////// CReportCtrl windowclass CReportCtrl : public CWnd{friend class CReportView;friend class CReportHeaderCtrl;friend class CReportTipCtrl;friend class CReportSubItemListCtrl;// Constructionpublic:DECLARE_DYNCREATE(CReportCtrl)CReportCtrl();public:BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);// Attributespublic:DWORD GetStyle() const;BOOL ModifyProperty(WPARAM wParam, LPARAM lParam);void SetIndentFirstColumn(INT iIndent);INT ActivateSubItem(INT iSubItem, INT iColumn = 0);BOOL DeactivateSubItem(INT iSubItem);BOOL DeactivateAllSubItems();BOOL IsActiveSubItem(INT iSubItem);INT GetActiveSubItemCount();INT GetSubItemWidth(INT iSubItem);BOOL SetSubItemWidth(INT iSubItem, INT iWidth = -1);INT GetItemIndex(HTREEITEM hItem);HTREEITEM GetItemHandle(INT iItem);void SetTreeSubItem(HTREEITEM hItem, INT iSubItem = -1);HTREEITEM GetNextItem(HTREEITEM hItem, UINT nCode);BOOL GetItem(LPRVITEM lprvi);BOOL SetItem(LPRVITEM lprvi);INT GetItemText(INT iItem, INT iSubItem, LPTSTR lpszText, INT iLen);CString GetItemText(INT iItem, INT iSubItem);BOOL SetItemText(INT iItem, INT iSubItem, LPCTSTR lpszText);INT GetItemImage(INT iItem, INT iSubItem);BOOL SetItemImage(INT iItem, INT iSubItem, INT iImage);INT GetItemCheck(INT iItem, INT iSubItem);BOOL SetItemCheck(INT iItem, INT iSubItem, INT iCheck = -1);DWORD GetItemData(INT iItem);BOOL SetItemData(INT iItem, DWORD dwData);BOOL GetItemRect(INT iItem, INT iSubItem, LPRECT lpRect, UINT nCode = RVIR_BOUNDS);BOOL MeasureItem(INT iItem, INT iSubItem, LPRECT lpRect, BOOL bTextOnly = FALSE);INT GetItemHeight();void SetItemHeight(INT iHeight);INT GetVisibleCount(BOOL bUnobstructed = TRUE);INT GetTopIndex();BOOL IsItemVisible(INT iItem, BOOL bUnobstructed = TRUE);void PageUp();void PageDown();INT GetItemCount();INT GetItemCount(HTREEITEM hItem, BOOL bRecurse = FALSE);void SetItemCount(INT iCount);INT GetFirstSelectedItem();INT GetNextSelectedItem(INT iItem);INT GetSelectedItems(LPINT lpiItems, INT iMax);void ClearSelection();void InvertSelection();void SelectAll();void SetSelection(INT iItem, BOOL bKeepSelection = FALSE);void SetSelection(LPINT lpiItems, INT iCount, BOOL bKeepSelection = FALSE);void SetSelection(INT iSubItem, CString& strPattern, BOOL bKeepSelection);void SetSelectionLessEq(INT iSubItem, INT iMatch, BOOL bKeepSelection);void SetSelection(HTREEITEM hItem, BOOL bKeepSelection = FALSE);void SetSelection(HTREEITEM* lphItems, INT iCount, BOOL bKeepSelection = FALSE);INT GetItemRow(INT iItem);CArray<INT, INT>* GetItemRowArray();BOOL SetItemRowArray(CArray<INT, INT>& arrayRows);BOOL MoveUp(INT iRow);BOOL MoveDown(INT iRow);BOOL SetImageList(CImageList* pImageList, CImageList* pCheckList = NULL);CImageList* GetImageList();BOOL SetBkImage(UINT nIDResource);BOOL SetBkImage(LPCTSTR lpszResourceName);COLORREF GetColor(INT iIndex);BOOL SetColor(INT iIndex, COLORREF crColor);BOOL HasFocus();INT GetCurrentFocus(LPINT lpiColumn = NULL);BOOL AdjustFocus(INT iRow, INT iColumn = -1);BOOL HasChildren(HTREEITEM hItem);BOOL IsChild(HTREEITEM hParent, HTREEITEM hItem);BOOL IsDescendent(HTREEITEM hParent, HTREEITEM hItem);CReportHeaderCtrl* GetHeaderCtrl();BOOL SetReportSubItemListCtrl(CReportSubItemListCtrl* lprsilc);CReportSubItemListCtrl* GetReportSubItemListCtrl();BOOL SetSortCallback(LPFNRVCOMPARE lpfnrvc, LPARAM lParam);LPFNRVCOMPARE GetSortCallback();BOOL GetSortSettings(INT *lpiSubItem, BOOL *lpbAscending);BOOL WriteProfile(LPCTSTR lpszSection, LPCTSTR lpszEntry);BOOL GetProfile(LPCTSTR lpszSection, LPCTSTR lpszEntry);// Operationspublic:BOOL ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0);INT DefineSubItem(INT iSubItem, LPRVSUBITEM lprvs, BOOL bUpdateList = FALSE);BOOL RedefineSubItem(INT iSubItem, LPRVSUBITEM lprvs, BOOL bUpdateList = TRUE);BOOL UndefineSubItem(INT iSubItem);void UndefineAllSubItems();INT AddItem(LPCTSTR lpszText, INT iImage = -1, INT iCheck = -1, INT iTextColor = -1);INT AddItem(LPRVITEM lprvi = NULL);INT InsertItem(INT iItem, LPCTSTR lpszText, INT iImage = -1, INT iCheck = -1, INT iTextColor = -1);INT InsertItem(LPRVITEM lprvi);BOOL DeleteItem(INT iItem);HTREEITEM InsertItem(LPCTSTR lpszText, INT iImage = -1, INT iCheck = -1, INT iTextColor = -1, HTREEITEM hParent = RVTI_ROOT, HTREEITEM hInsertAfter = RVTI_LAST, INT iSubItem = -1);HTREEITEM InsertItem(LPRVITEM lprvi, HTREEITEM hParent, HTREEITEM hInsertAfter = RVTI_LAST, INT iSubItem = -1);BOOL DeleteItem(HTREEITEM hItem);BOOL DeleteAllItems();void SetRedraw(BOOL bRedraw = TRUE);void RedrawItems(INT iFirst, INT iLast = RVI_INVALID);BOOL EnsureVisible(INT iItem, BOOL bUnobstructed = TRUE);BOOL EnsureVisible(HTREEITEM hItem, BOOL bUnobstructed = TRUE);INT InsertColor(INT iIndex, COLORREF crColor);BOOL DeleteColor(INT iIndex);void DeleteAllColors();INT HitTest(LPRVHITTESTINFO lprvhti);BOOL ResortItems();BOOL SortItems(INT iSubItem, BOOL bAscending);INT FindItem(LPRVFINDINFO lprvfi, INT iSubItem, INT iStart = RVI_INVALID);BOOL Expand(HTREEITEM hItem, UINT nCode);BOOL ExpandAll(HTREEITEM hItem, UINT nCode, INT iLevels = -1);void FlushCache(INT iItem = RVI_INVALID);void Copy();void Cut();void Paste();// Miscpublic:INT PreviewHeight(CFont* pFont, UINT nLines);INT PreviewHeight(CFont* pFont, LPCTSTR lpszText, LPRECT lpRect = NULL);// Overridespublic:virtual ~CReportCtrl();virtual CString GetItemString(INT iItem, TCHAR cSeparator = _T('\t'));virtual void DrawItem(CDC* pDC, CRect rect, LPRVITEM lprvi);virtual BOOL DrawBkgnd(CDC* pDC, CRect rect, COLORREF crBackground);virtual INT CompareItems(LPRVITEM lprvi1, LPRVITEM lprvi2);virtual INT CompareItems(INT iItem1, INT iSubItem1, INT iItem2, INT iSubItem2);virtual BOOL BeginEdit(INT iRow, INT iColumn, UINT nKey);virtual void EndEdit(BOOL bUpdate = TRUE, LPNMRVITEMEDIT lpnmrvie = NULL);virtual BOOL Notify(LPNMREPORTVIEW lpnmrv);// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CReportCtrl)protected:virtual void PreSubclassWindow();//}}AFX_VIRTUAL// Structuresprotected:typedef struct structSUBITEM{UINT nFormat;INT iWidth;INT iMinWidth;INT iMaxWidth;INT iImage;CString strText;structSUBITEM() : nFormat(RVCF_LEFT), iWidth(-1), iMinWidth(0), iMaxWidth(0), iImage(0) {};} SUBITEM, FAR* LPSUBITEM;typedef struct structTREEITEM{struct structTREEITEM* lptiParent;struct structTREEITEM* lptiChildren;struct structTREEITEM* lptiSibling;INT iItem;INT iSubItem;BOOL bOpen;INT iIndent;structTREEITEM() :lptiParent(NULL),lptiChildren(NULL),lptiSibling(NULL),iItem(RVI_INVALID),iSubItem(-1),bOpen(FALSE),iIndent(0){};} TREEITEM, FAR* LPTREEITEM;typedef struct structITEM{CReportData rdData;INT iBkColor;UINT nPreview;INT iIndent;UINT nState;LPARAM lParam;LPTREEITEM lptiItem;structITEM() :iBkColor(-1),nPreview(0),iIndent(-1),nState(0),lParam(0),lptiItem(NULL){};structITEM(const structITEM& item){rdData = item.rdData;iBkColor = item.iBkColor;nPreview = item.nPreview;iIndent = item.iIndent;nState = item.nState;lParam = item.lParam;lptiItem = item.lptiItem;}structITEM& operator = (structITEM& item){rdData = item.rdData;iBkColor = item.iBkColor;nPreview = item.nPreview;iIndent = item.iIndent;nState = item.nState;lParam = item.lParam;lptiItem = item.lptiItem;return *this;}} ITEM, FAR* LPITEM;typedef struct structCACHEITEM{INT iItem;ITEM item;} CACHEITEM, FAR* LPCACHEITEM;// Implementationprotected:BOOL m_bSubclassFromCreate;BOOL m_bDoubleBuffer;BOOL m_bRedrawFlag;INT m_iSpacing;UINT m_nRowsPerWheelNotch;DWORD m_dwStyle;DWORD m_dwStyleEx;BOOL m_bPreview;BOOL m_bHorzScrollBar;CFont m_font;CFont m_fontBold;CImageList* m_pImageList;CImageList* m_pCheckList;SIZE m_sizeImage;SIZE m_sizeCheck;COLORREF m_crBackground;COLORREF m_crBkSelected;COLORREF m_crBkSelectedNoFocus;COLORREF m_crText;COLORREF m_crTextSelected;COLORREF m_crTextSelectedNoFocus;COLORREF m_crGrid;COLORREF m_cr3DFace;COLORREF m_cr3DLight;COLORREF m_cr3DShadow;COLORREF m_cr3DHiLight;COLORREF m_cr3DDkShadow;CArray<COLORREF, COLORREF> m_arrayColors;CPalette m_palette;INT m_iGridStyle;UINT m_nFrameControlStyle;UINT m_nBlendStyle;COLORREF m_crBlendColor;CString m_strNoItems;CString m_strSortBy;CRect m_rectTop;CRect m_rectHeader;CRect m_rectEdit;CRect m_rectReport;INT m_iDefaultWidth, m_iDefaultHeight;INT m_iVirtualWidth, m_iVirtualHeight;CArray<SUBITEM, SUBITEM&> m_arraySubItems;CArray<ITEM, ITEM&> m_arrayItems;TREEITEM m_tiRoot;BOOL m_bEditValid;ITEM m_itemEdit;BOOL m_bUseItemCacheMap;CACHEITEM m_aciCache[REPORTCTRL_MAX_CACHE];CList<INT, INT> m_listSelection;BOOL m_bColumnsReordered;CArray<INT, INT> m_arrayColumns;BOOL m_bFocus;INT m_iFocusRow;INT m_iFocusColumn;INT m_iSelectRow;CArray<INT, INT> m_arrayRows;BOOL m_bIndentColumn;BOOL m_bIndentGrey;INT m_iIndentColumn;INT m_iIndentColumnPending;BOOL m_bProcessKey;BOOL m_bUpdateItemMap;CMap<INT, INT, INT, INT> m_mapItemToRow;INT m_iEditItem;INT m_iEditSubItem;HWND m_hEditWnd;LPFNRVCOMPARE m_lpfnrvc;LPARAM m_lParamCompare;CReportHeaderCtrl m_wndHeader;CReportTipCtrl m_wndTip;CReportSubItemListCtrl* m_lprsilc;CBitmap m_bitmap;SIZE m_sizeBitmap;ULONG m_uNotifyMask;virtual BOOL Create();virtual void GetSysColors();virtual UINT GetMouseScrollLines();BOOL CreatePalette();BOOL NotifyHdr(LPNMRVHEADER lpnmrvhdr, UINT nCode, INT iHdrItem);BOOL Notify(UINT nCode, INT iItem = RVI_INVALID, INT iSubItem = -1, UINT nState = 0, LPARAM lParam = 0);BOOL Notify(UINT nCode, UINT nKeys, LPRVHITTESTINFO lprvhti);void Layout(INT cx, INT cy);virtual LPITEM CacheLookup(INT iItem);virtual LPITEM CacheAdd(INT iItem);virtual void CacheDelete(INT iItem = RVI_INVALID);void BuildTree();void BuildTree(LPTREEITEM lpti);void InsertTree(INT iSubItem, LPTREEITEM lptiParent, LPTREEITEM lptiInsertAfter, LPTREEITEM lpti, BOOL bAscending);BOOL ExpandAllImpl(HTREEITEM hRoot, UINT nCode, INT iLevels, INT iDeep);INT InsertItemImpl(LPRVITEM lprvi);BOOL DeleteItemImpl(INT iItem);BOOL DeleteItemImpl(LPTREEITEM lpti, BOOL bChildrenOnly);virtual ITEM& GetItemStruct(INT iItem, INT iSubItem, UINT nMask = 0);virtual void SetItemStruct(INT iItem, ITEM& item);virtual BOOL LoadItemData(LPITEM lpItem, INT iItem, INT iSubItem, UINT nMask);INT GetItemFromRow(INT iRow);INT GetItemFromRow(INT iRow, ITEM& item);INT GetRowFromItem(INT iItem);INT GetSubItemFromColumn(INT iColumn);INT GetColumnFromSubItem(INT iSubItem);LPTREEITEM GetVisibleAncestor(LPTREEITEM lpti);LPTREEITEM GetVisibleAncestor(LPTREEITEM lpti, LPBOOL lpbExit);BOOL SetSubItemWidthImpl(INT iSubItem, INT iWidth);virtual void GetExpandedItemText(LPRVITEM lprvi);void SetState(INT iRow, UINT nState, UINT nMask);UINT GetState(INT iRow);LPTREEITEM GetTreeFocus();void SetTreeFocus(LPTREEITEM lptiFocus);void DeselectDescendents(LPTREEITEM lptiParent);void ReorderColumns();BOOL GetRowRect(INT iRow, INT iColumn, LPRECT lpRect, UINT nCode = RVIR_BOUNDS);INT GetVisibleRows(BOOL bUnobstructed = TRUE, LPINT lpiFirst = NULL, LPINT lpiLast = NULL, BOOL bReverse = FALSE);virtual void SelectRows(INT iFirst, INT iLast, BOOL bSelect = TRUE, BOOL bKeepSelection = FALSE, BOOL bInvert = FALSE, BOOL bNotify = TRUE);INT GetScrollPos32(INT iBar, BOOL bGetTrackPos = FALSE);BOOL SetScrollPos32(INT iBar, INT nPos, BOOL bRedraw = TRUE);void ScrollWindow(INT iBar, INT iPos);void EnsureVisibleColumn(INT iColumn);void IndentFirstColumn();void UnindentFirstColumn();void RedrawRows(INT iFirst, INT iLast = RVI_INVALID, BOOL bUpdate = FALSE);void SelectionToSortedArray(CArray<INT, INT>& arraySelection);virtual void DrawCtrl(CDC* pDC);virtual void DrawRow(CDC* pDC, CRect rectRow, CRect rectClip, INT iRow, LPRVITEM lprvi, BOOL bAlternate);virtual INT DrawTreeBox(CDC* pDC, CRect rectBox, BOOL bOpen);virtual INT DrawImage(CDC* pDC, CRect rect, LPRVITEM lprvi);virtual INT DrawCheck(CDC* pDC, CRect rect, LPRVITEM lprvi);virtual INT DrawText(CDC* pDC, CRect rect, LPRVITEM lprvi);virtual void QuickSort(INT iSubItem, INT iLow, INT iHigh, BOOL bAscending);virtual void TreeSort(INT iSubItem, LPTREEITEM lptiParent, BOOL bAscending, BOOL bTraverse = TRUE);// Generated message map functionsprotected://{{AFX_MSG(CReportCtrl)afx_msg void OnDestroy();afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnWindowPosChanging(WINDOWPOS FAR* lpwndpos);afx_msg BOOL OnEraseBkgnd(CDC* pDC);afx_msg void OnPaint();afx_msg void OnSysColorChange();afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);afx_msg void OnHdnItemChanged(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnHdnItemClick(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnHdnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnHdnEndDrag(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnHdnDividerDblClick(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnRvnEndItemEdit(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);afx_msg UINT OnGetDlgCode();afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);afx_msg BOOL OnQueryNewPalette();afx_msg void OnPaletteChanged(CWnd* pFocusWnd);afx_msg void OnSetFocus(CWnd* pOldWnd);afx_msg void OnKillFocus(CWnd* pNewWnd);afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp);afx_msg void OnNcPaint();afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnRButtonDown(UINT nFlags, CPoint point);//}}AFX_MSGafx_msg LRESULT OnSetFont(WPARAM wParam, LPARAM lParam);afx_msg LRESULT OnGetFont(WPARAM wParam, LPARAM lParam);DECLARE_MESSAGE_MAP()};/////////////////////////////////////////////////////////////////////////////// CReportViewclass CReportView : public CView{protected:DECLARE_DYNCREATE(CReportView)CReportView(); // protected constructor used by dynamic creation// Attributespublic:CReportCtrl& GetReportCtrl();virtual CReportCtrl* GetReportCtrlPtr();// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CReportView)public:virtual void OnInitialUpdate();protected:virtual void OnDraw(CDC* pDC); // overridden to draw this viewvirtual BOOL PreCreateWindow(CREATESTRUCT& cs);//}}AFX_VIRTUAL// Implementationprotected:virtual ~CReportView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifBOOL m_bCreated;CReportCtrl m_wndReportCtrl;// Generated message map functionsprotected://{{AFX_MSG(CReportView)afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnSetFocus(CWnd* pOldWnd);afx_msg BOOL OnEraseBkgnd(CDC* pDC);//}}AFX_MSGDECLARE_MESSAGE_MAP()};/////////////////////////////////////////////////////////////////////////////// CReportSubItemListCtrl windowclass CReportSubItemListCtrl : public CDragListBox{// Constructionpublic:CReportSubItemListCtrl();~CReportSubItemListCtrl();// Attributespublic:BOOL SetReportCtrl(CReportCtrl* pReportCtrl);CReportCtrl* GetReportCtrl();// Operationspublic:BOOL UpdateList();// Overridesvirtual BOOL Include(INT iSubItem);virtual BOOL Disable(INT iSubItem);// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CReportSubItemListCtrl)public:virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);protected:virtual void PreSubclassWindow();//}}AFX_VIRTUAL// Implementationprotected:CReportCtrl* m_pReportCtrl;INT m_iSubItem;HDITEM m_hdiSubItem;TCHAR m_szSubItemText[FLATHEADER_TEXT_MAX];CFHDragWnd* m_pDragWnd;CRect m_rcDragWnd;CRect m_rcDropTarget1;CRect m_rcDropTarget2;INT m_iDropIndex;BOOL BeginDrag(CPoint pt);UINT Dragging(CPoint pt);void CancelDrag(CPoint pt);void Dropped(INT iSrcIndex, CPoint pt);// Generated message map functionsprotected://{{AFX_MSG(CReportSubItemListCtrl)afx_msg BOOL OnEraseBkgnd(CDC* pDC);//}}AFX_MSGDECLARE_MESSAGE_MAP()};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_REPORTCTRL_H__279B1CA0_D7F2_11D2_88D7_ABB23645F26D__INCLUDED_)