GridCtrl.h
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:27k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. #if !defined(AFX_GRIDCTRL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_)
  2. #define AFX_GRIDCTRL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_
  3. #if _MSC_VER >= 1000
  4. #pragma once
  5. #endif // _MSC_VER >= 1000
  6. /////////////////////////////////////////////////////////////////////////////
  7. // GridCtrl.h : header file
  8. //
  9. // MFC Grid Control header file
  10. //
  11. // Written by Chris Maunder (chrismaunder@codeguru.com)
  12. // Copyright (c) 1998.
  13. //
  14. // The code contained in this file is based on the original
  15. // WorldCom Grid control written by Joe Willcoxson,
  16. //        E-mail:  chinajoe@aol.com
  17. //        URL:  http://users.aol.com/chinajoe
  18. //
  19. // This code may be used in compiled form in any way you desire. This
  20. // file may be redistributed unmodified by any means PROVIDING it is 
  21. // not sold for profit without the authors written consent, and 
  22. // providing that this notice and the authors name and all copyright 
  23. // notices remains intact. If the source code in this file is used in 
  24. // any  commercial application then a statement along the lines of 
  25. // "Portions copyright (c) Chris Maunder, 1998" must be included in 
  26. // the startup banner, "About" box or printed documentation. An email 
  27. // letting me know that you are using it would be nice as well. That's 
  28. // not much to ask considering the amount of work that went into this.
  29. //
  30. // This file is provided "as is" with no expressed or implied warranty.
  31. // The author accepts no liability for any damage/loss of business that
  32. // this product may cause.
  33. //
  34. // Expect bugs!
  35. // 
  36. // Please use and enjoy. Please let me know of any bugs/mods/improvements 
  37. // that you have found/implemented and I will fix/incorporate them into this
  38. // file. 
  39. //
  40. /////////////////////////////////////////////////////////////////////////////
  41. //#define GRIDCONTROL_NO_TITLETIPS   // Do not use titletips for cells with large data
  42. //#define GRIDCONTROL_NO_DRAGDROP    // Do not use OLE drag and drop
  43. //#define GRIDCONTROL_NO_CLIPBOARD   // Do not use clipboard routines
  44. #include "CellRange.h"
  45. #include <afxtempl.h>
  46. #ifdef _WIN32_WCE
  47. #define GRIDCONTROL_NO_TITLETIPS   // Do not use titletips for cells with large data
  48. #define GRIDCONTROL_NO_DRAGDROP    // Do not use OLE drag and drop
  49. #define GRIDCONTROL_NO_CLIPBOARD   // Do not use clipboard routines
  50. #define GRIDCONTROL_NO_PRINTING    // Do not use printing routines
  51. #ifdef WCE_NO_PRINTING
  52. #define _WIN32_WCE_NO_PRINTING
  53. #endif
  54. #ifdef WCE_NO_CURSOR
  55. #define _WIN32_WCE_NO_CURSOR
  56. #endif
  57. #else
  58. // Use C++ exception handling instead of structured.
  59. #undef TRY
  60. #undef CATCH
  61. #undef END_CATCH
  62. #define TRY try
  63. #define CATCH(ex_class, ex_object) catch(ex_class* ex_object)
  64. #define END_CATCH
  65. #endif  // _WIN32_WCE
  66. #ifndef GRIDCONTROL_NO_TITLETIPS
  67. #include "TitleTip.h"
  68. #endif
  69. #ifndef GRIDCONTROL_NO_DRAGDROP
  70. #include "GridDropTarget.h"
  71. #undef GRIDCONTROL_NO_CLIPBOARD     // Force clipboard functions on
  72. #endif
  73. /*
  74. #ifndef GRIDCONTROL_NO_CLIPBOARD
  75. #include <afxole.h>
  76. #endif
  77. */
  78. // Use this as the classname when inserting this control as a custom control
  79. // in the MSVC++ dialog editor
  80. #define GRIDCTRL_CLASSNAME    _T("MFCGridCtrl")  // Window class name
  81. #define IDC_INPLACE_CONTROL   8                  // ID of inplace edit controls
  82. #define IsSHIFTpressed() ( (GetKeyState(VK_SHIFT) & (1 << (sizeof(SHORT)*8-1))) != 0   )
  83. #define IsCTRLpressed()  ( (GetKeyState(VK_CONTROL) & (1 << (sizeof(SHORT)*8-1))) != 0 )
  84. // Used for Get/SetItem calls.
  85. typedef struct _GV_ITEM { 
  86.     int      row,col;     // Row and Column of item
  87.     UINT     mask;        // Mask for use in getting/setting cell data
  88.     UINT     state;       // cell state (focus/hilighted etc)
  89.     UINT     nFormat;     // Format of cell
  90.     CString  szText;      // Text in cell
  91.     int      iImage;      // index of the list view item抯 icon
  92.     COLORREF crBkClr;     // Background colour (or CLR_DEFAULT)
  93.     COLORREF crFgClr;     // Forground colour (or CLR_DEFAULT)
  94.     LPARAM   lParam;      // 32-bit value to associate with item 
  95.     LOGFONT  lfFont;      // Cell font
  96. } GV_ITEM; 
  97. // Grid line selection
  98. #define GVL_NONE                0
  99. #define GVL_HORZ                1
  100. #define GVL_VERT                2
  101. #define GVL_BOTH                3
  102. // Cell data mask
  103. #define GVIF_TEXT               LVIF_TEXT
  104. #define GVIF_IMAGE              LVIF_IMAGE
  105. #define GVIF_PARAM              LVIF_PARAM
  106. #define GVIF_STATE              LVIF_STATE
  107. #define GVIF_BKCLR              (GVIF_STATE<<1)
  108. #define GVIF_FGCLR              (GVIF_STATE<<2)
  109. #define GVIF_FORMAT             (GVIF_STATE<<3)
  110. #define GVIF_FONT               (GVIF_STATE<<4)
  111. // Cell states
  112. #define GVIS_FOCUSED            0x0001
  113. #define GVIS_SELECTED           0x0002
  114. #define GVIS_DROPHILITED        0x0004
  115. #define GVIS_READONLY           0x0008
  116. #define GVIS_FIXED              0x0010  // not yet used
  117. #define GVIS_MODIFIED           0x0020
  118. // Cell Searching options
  119. #define GVNI_FOCUSED            0x0001
  120. #define GVNI_SELECTED           0x0002
  121. #define GVNI_DROPHILITED        0x0004
  122. #define GVNI_READONLY           0x0008
  123. #define GVNI_FIXED              0x0010  // not yet used
  124. #define GVNI_MODIFIED           0x0020
  125. #define GVNI_ABOVE              LVNI_ABOVE
  126. #define GVNI_BELOW              LVNI_BELOW
  127. #define GVNI_TOLEFT             LVNI_TOLEFT
  128. #define GVNI_TORIGHT            LVNI_TORIGHT
  129. #define GVNI_ALL                (LVNI_BELOW|LVNI_TORIGHT|LVNI_TOLEFT)
  130. #define GVNI_AREA               (LVNI_BELOW|LVNI_TORIGHT)
  131. // Hit test values (not yet implemented)
  132. #define GVHT_DATA               0x0000
  133. #define GVHT_TOPLEFT            0x0001
  134. #define GVHT_COLHDR             0x0002
  135. #define GVHT_ROWHDR             0x0004
  136. #define GVHT_COLSIZER           0x0008
  137. #define GVHT_ROWSIZER           0x0010
  138. #define GVHT_LEFT               0x0020
  139. #define GVHT_RIGHT              0x0040
  140. #define GVHT_ABOVE              0x0080
  141. #define GVHT_BELOW              0x0100
  142. typedef struct tagNM_GRIDVIEW { 
  143.     NMHDR hdr; 
  144.     int   iRow; 
  145.     int   iColumn; 
  146. } NM_GRIDVIEW;
  147. typedef struct tagGV_DISPINFO { 
  148.     NMHDR   hdr; 
  149.     GV_ITEM item; 
  150. } GV_DISPINFO;
  151. // Messages sent to the grid's parent (More will be added in future)
  152. #define GVN_BEGINDRAG           LVN_BEGINDRAG        // LVN_FIRST-9
  153. #define GVN_BEGINLABELEDIT      LVN_BEGINLABELEDIT   // LVN_FIRST-5
  154. #define GVN_BEGINRDRAG          LVN_BEGINRDRAG
  155. #define GVN_COLUMNCLICK         LVN_COLUMNCLICK
  156. #define GVN_DELETEITEM          LVN_DELETEITEM
  157. #define GVN_ENDLABELEDIT        LVN_ENDLABELEDIT     // LVN_FIRST-6
  158. #define GVN_SELCHANGING         LVN_ITEMCHANGING 
  159. #define GVN_SELCHANGED          LVN_ITEMCHANGED
  160. // Each cell contains one of these. Fields "row" and "column" are not stored since we
  161. // will usually have acces to them in other ways, and they are an extra 8 bytes per
  162. // cell that is probably unnecessary.
  163. class  CGridCell : public CObject
  164. {
  165. public:
  166.     CGridCell() 
  167.     {
  168.         state = 0;
  169.         nFormat = 0;
  170.         szText.Empty();
  171.         iImage = -1;
  172. crBkClr = CLR_DEFAULT;
  173. crFgClr = CLR_DEFAULT;
  174.         lParam = 0;
  175.     }
  176.     UINT     state;       // Cell state (selected/focus etc)
  177.     UINT     nFormat;     // Cell format
  178.     CString  szText;      // Cell text (or binary data if you wish...)
  179.     int      iImage;      // Index of the list view item抯 icon 
  180.     COLORREF crBkClr;     // Background colour (or CLR_DEFAULT)
  181.     COLORREF crFgClr;     // Forground colour (or CLR_DEFAULT)
  182.     LOGFONT  lfFont;      // Cell font
  183.     LPARAM   lParam;      // 32-bit value to associate with item
  184. }; 
  185. // storage typedef for each row in the grid
  186. typedef CTypedPtrArray<CObArray, CGridCell*> GRID_ROW;
  187. // DDX_GridControl is used where a DDX_Control call is needed. In some strange
  188. // situations the usual DDX_Control does not result in CGridCtrl::SubclassWindow
  189. // or CGridCtrl::PreSubclassWindow being called. Using this version calls 
  190. // CGridCtrl::SubclassWindow directly - ensuring that cell metrics are set properly
  191. class CGridCtrl;
  192. void  AFXAPI DDX_GridControl(CDataExchange* pDX, int nIDC, CGridCtrl& rControl);
  193. /////////////////////////////////////////////////////////////////////////////
  194. // CGridCtrl window
  195. class  CGridCtrl : public CWnd
  196. {
  197.     DECLARE_DYNCREATE(CGridCtrl)
  198. // Construction
  199. public:
  200.     CGridCtrl(int nRows = 0, int nCols = 0, int nFixedRows = 0, int nFixedCols = 0);
  201.     BOOL Create(const RECT& rect, CWnd* parent, UINT nID,
  202.                 DWORD dwStyle = WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE);
  203.     BOOL SubclassWindow(HWND hWnd);
  204. // Attributes
  205. public:
  206.     int  GetRowCount() const                    { return m_nRows; }
  207.     int  GetColumnCount() const                 { return m_nCols; }
  208.     int  GetFixedRowCount() const               { return m_nFixedRows; }
  209.     int  GetFixedColumnCount() const            { return m_nFixedCols; }
  210.     BOOL SetRowCount(int nRows = 10);
  211.     BOOL SetColumnCount(int nCols = 10);
  212.     BOOL SetFixedRowCount(int nFixedRows = 1);
  213.     BOOL SetFixedColumnCount(int nFixedCols = 1);
  214.     int  GetRowHeight(int nRow) const;
  215.     BOOL SetRowHeight(int row, int height);
  216.     int  GetColumnWidth(int nCol) const;
  217.     BOOL SetColumnWidth(int col, int width);
  218.     BOOL GetCellOrigin(int nRow, int nCol, LPPOINT p) const;
  219.     BOOL GetCellOrigin(const CCellID& cell, LPPOINT p) const;
  220.     BOOL GetCellRect(int nRow, int nCol, LPRECT pRect) const;
  221.     BOOL GetCellRect(const CCellID& cell, LPRECT pRect) const;
  222.     BOOL GetTextRect(const CCellID& cell, LPRECT pRect);
  223.     BOOL GetTextRect(int nRow, int nCol, LPRECT pRect);
  224.     int  GetFixedRowHeight() const;
  225.     int  GetFixedColumnWidth() const;
  226.     long GetVirtualWidth() const;
  227.     long GetVirtualHeight() const;
  228.     void     SetTextColor(COLORREF clr)           { m_crTextColour = clr;             }
  229.     COLORREF GetTextColor() const                 { return m_crTextColour;            }
  230.     void     SetTextBkColor(COLORREF clr)         { m_crTextBkColour = clr;           }
  231.     COLORREF GetTextBkColor() const               { return m_crTextBkColour;          }
  232.     void     SetSelectedBkColor(COLORREF clr)           { m_crSelectedBkColour = clr;             }
  233.     COLORREF GetSelectedBkColor() const                 { return m_crSelectedBkColour;            }
  234.     void     SetBkColor(COLORREF clr)             { m_crBkColour = clr;               }
  235.     COLORREF GetBkColor() const                   { return m_crBkColour;              }
  236.     void     SetFixedTextColor(COLORREF clr)      { m_crFixedTextColour = clr;        }
  237.     COLORREF GetFixedTextColor() const            { return m_crFixedTextColour;       }
  238.     void     SetFixedBkColor(COLORREF clr)        { m_crFixedBkColour = clr;          }
  239.     COLORREF GetFixedBkColor() const              { return m_crFixedBkColour;         } 
  240.     void     SetGridColor(COLORREF clr)           { m_crGridColour = clr;             }
  241.     COLORREF GetGridColor() const                 { return m_crGridColour;            }
  242.     int GetSelectedCount() const                  { return m_SelectedCellMap.GetCount(); }
  243.     CCellID GetFocusCell() const                  { return m_idCurrentCell;           }
  244.     void SetImageList(CImageList* pList)          { m_pImageList = pList;             }
  245.     CImageList* GetImageList() const              { return m_pImageList;              }
  246.     void SetGridLines(int nWhichLines = GVL_BOTH) { m_nGridLines = nWhichLines; 
  247.                                                     if (::IsWindow(GetSafeHwnd())) Invalidate(); }
  248.     int  GetGridLines() const                     { return m_nGridLines;              }
  249.     void SetEditable(BOOL bEditable = TRUE)       { m_bEditable = bEditable;          }
  250.     BOOL IsEditable() const                       { return m_bEditable;               }
  251.     void SetListMode(BOOL bEnableListMode = TRUE) { m_bListMode = bEnableListMode;    }
  252.     BOOL GetListMode() const                      { return m_bListMode;               }
  253.     void SetSingleRowSelection(BOOL bSing = TRUE) { m_bSingleRowSelection = bSing;    }
  254.     BOOL GetSingleRowSelection()                  { return m_bSingleRowSelection;     }
  255.     void EnableSelection(BOOL bEnable = TRUE)     { ResetSelectedRange(); m_bEnableSelection = bEnable; ResetSelectedRange(); }
  256.     BOOL IsSelectable() const                     { return m_bEnableSelection;        }
  257.     void EnableDragAndDrop(BOOL bAllow = TRUE)    { m_bAllowDragAndDrop = bAllow;     }
  258.     BOOL GetDragAndDrop() const                   { return m_bAllowDragAndDrop;       }
  259.     void SetRowResize(BOOL bResize = TRUE)        { m_bAllowRowResize = bResize;      }
  260.     BOOL GetRowResize() const                     { return m_bAllowRowResize;         }
  261.     void SetColumnResize(BOOL bResize = TRUE)     { m_bAllowColumnResize = bResize;   }
  262.     BOOL GetColumnResize() const                  { return m_bAllowColumnResize;      }
  263.     void SetHeaderSort(BOOL bSortOnClick = TRUE ) { m_bSortOnClick = bSortOnClick;    }
  264.     BOOL GetHeaderSort() const                    { return m_bSortOnClick;            }
  265.     void SetHandleTabKey(BOOL bHandleTab = TRUE)  { m_bHandleTabKey = bHandleTab;     }
  266.     BOOL GetHandleTabKey() const                  { return m_bHandleTabKey;           }
  267.     void SetDoubleBuffering(BOOL bBuffer = TRUE)  { m_bDoubleBuffer = bBuffer;        }
  268.     BOOL GetDoubleBuffering() const               { return m_bDoubleBuffer;           }
  269.     void EnableTitleTips(BOOL bEnable = TRUE)     { m_bTitleTips = bEnable;           }
  270.     BOOL GetTitleTips()                           { return m_bTitleTips;              }
  271.     void SetModified(BOOL bModified = TRUE, int nRow = -1, int nCol = -1);
  272.     BOOL GetModified(int nRow = -1, int nCol = -1);
  273.     BOOL IsCellFixed(int nRow, int nCol);
  274.     BOOL   SetItem(const GV_ITEM* pItem);
  275.     BOOL   GetItem(GV_ITEM* pItem);
  276.     BOOL   SetItemText(int nRow, int nCol, LPCTSTR str);
  277.     virtual CString GetItemText(int nRow, int nCol);
  278.     BOOL   SetItemData(int nRow, int nCol, LPARAM lParam);
  279.     LPARAM GetItemData(int nRow, int nCol) const;
  280.     BOOL   SetItemImage(int nRow, int nCol, int iImage);
  281.     int    GetItemImage(int nRow, int nCol) const;
  282.     BOOL   SetItemState(int nRow, int nCol, UINT state);
  283.     UINT   GetItemState(int nRow, int nCol) const;
  284.     BOOL   SetItemFormat(int nRow, int nCol, UINT nFormat);
  285.     UINT   GetItemFormat(int nRow, int nCol) const;
  286. BOOL   SetItemBkColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT);
  287. COLORREF GetItemBkColour(int nRow, int nCol) const;
  288. BOOL   SetItemFgColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT);
  289. COLORREF GetItemFgColour(int nRow, int nCol) const;
  290. BOOL SetItemFont(int nRow, int nCol, LOGFONT* lf);
  291. LOGFONT* GetItemFont(int nRow, int nCol);
  292. // Operations
  293. public:
  294.     int  InsertColumn(LPCTSTR strHeading, UINT nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE,
  295.                       int nColumn = -1);
  296.     int  InsertRow(LPCTSTR strHeading, int nRow = -1);
  297.     BOOL DeleteColumn(int nColumn);
  298.     BOOL DeleteRow(int nRow);
  299.     BOOL DeleteNonFixedRows();
  300.     BOOL DeleteAllItems();
  301.     BOOL AutoSizeRow(int nRow);
  302.     BOOL AutoSizeColumn(int nCol);
  303.     void AutoSizeRows();
  304.     void AutoSizeColumns();
  305.     void AutoSize();
  306.     void ExpandColumnsToFit();
  307.     void ExpandRowsToFit();
  308.     void ExpandToFit();
  309.     CSize GetTextExtent(LPCTSTR str, BOOL bUseSelectedFont = TRUE);
  310.     void EnsureVisible(CCellID &cell)       { EnsureVisible(cell.row, cell.col); }
  311.     void EnsureVisible(int nRow, int nCol);
  312.     BOOL IsCellVisible(int nRow, int nCol) const;
  313.     BOOL IsCellVisible(CCellID cell) const;
  314.     BOOL IsCellEditable(int nRow, int nCol) const;
  315.     BOOL IsCellEditable(CCellID &cell) const;
  316.     // SetRedraw stops/starts redraws on things like changing the # rows/columns
  317.     // and autosizing, but not for user-intervention such as resizes
  318.     void SetRedraw(BOOL bAllowDraw, BOOL bResetScrollBars = FALSE);
  319.     BOOL RedrawCell(int nRow, int nCol, CDC* pDC = NULL);
  320.     BOOL RedrawCell(const CCellID& cell, CDC* pDC = NULL);
  321.     BOOL RedrawRow(int row);
  322.     BOOL RedrawColumn(int col);
  323. #if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING)
  324.     void Print(); 
  325. #endif
  326. #ifndef _WIN32_WCE
  327.     BOOL Save(LPCTSTR filename);
  328.     BOOL Load(LPCTSTR filename);
  329. #endif
  330.     CCellRange GetCellRange() const;
  331.     CCellRange GetSelectedCellRange() const;
  332.     void SetSelectedRange(const CCellRange& Range, BOOL bForceRepaint = FALSE);
  333.     void SetSelectedRange(int nMinRow, int nMinCol, int nMaxRow, int nMaxCol,
  334.                           BOOL bForceRepaint = FALSE);
  335.     BOOL IsValid(int nRow, int nCol) const;
  336.     BOOL IsValid(const CCellID& cell) const;
  337.     BOOL IsValid(const CCellRange& range) const;
  338. #ifndef GRIDCONTROL_NO_CLIPBOARD
  339.     // Clipboard and cut n' paste operations
  340.     virtual void CutSelectedText();
  341.     virtual COleDataSource* CopyTextFromGrid();
  342.     virtual BOOL PasteTextToGrid(CCellID cell, COleDataObject* pDataObject);
  343. #endif
  344. #ifndef GRIDCONTROL_NO_DRAGDROP
  345.     void OnBeginDrag();
  346.     DROPEFFECT OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
  347.     DROPEFFECT OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
  348.     void OnDragLeave();
  349.     BOOL OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point);
  350. #endif
  351. #ifndef GRIDCONTROL_NO_CLIPBOARD
  352.     virtual void OnEditCut();
  353.     virtual void OnEditCopy();
  354.     virtual void OnEditPaste();
  355. #endif
  356.     virtual void OnEditSelectAll();
  357.     CCellID GetNextItem(CCellID& cell, int nFlags) const;
  358.     BOOL SortTextItems(int nCol, BOOL bAscending);
  359.     BOOL SortTextItems(int nCol, BOOL bAscending, int low, int high);
  360.     BOOL SortItems(PFNLVCOMPARE pfnCompare, int nCol, BOOL bAscending, LPARAM data = 0);
  361.     BOOL SortItems(PFNLVCOMPARE pfnCompare, int nCol, BOOL bAscending, LPARAM data, 
  362.                    int low, int high);
  363. // Overrides
  364.     // ClassWizard generated virtual function overrides
  365.     //{{AFX_VIRTUAL(CGridCtrl)
  366.     protected:
  367.     virtual void PreSubclassWindow();
  368.     //}}AFX_VIRTUAL
  369. #if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING)
  370. public:
  371.     virtual void OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo);
  372.     virtual void OnPrint(CDC *pDC, CPrintInfo *pInfo);
  373.     virtual void OnEndPrinting(CDC *pDC, CPrintInfo *pInfo);
  374. #endif
  375. // Implementation
  376. public:
  377.     virtual ~CGridCtrl();
  378. protected:
  379.     BOOL RegisterWindowClass();
  380.     LRESULT SendMessageToParent(int nRow, int nCol, int nMessage);
  381.     BOOL InvalidateCellRect(const CCellID& cell);
  382.     BOOL InvalidateCellRect(const CCellRange& cellRange);
  383.     void EraseBkgnd(CDC* pDC);
  384.     BOOL GetCellRangeRect(const CCellRange& cellRange, LPRECT lpRect) const;
  385.     CGridCell* GetCell(int nRow, int nCol) const;
  386.     BOOL SetCell(int nRow, int nCol, CGridCell* pCell);
  387.     int  SetMouseMode(int nMode) { int nOldMode = m_MouseMode; m_MouseMode = nMode; return nOldMode; }
  388.     int  GetMouseMode() const    { return m_MouseMode; }
  389.     BOOL MouseOverRowResizeArea(CPoint& point) const;
  390.     BOOL MouseOverColumnResizeArea(CPoint& point) const;
  391.     CCellID GetCellFromPt(CPoint point, BOOL bAllowFixedCellCheck = TRUE) const;
  392.     CCellID GetTopleftNonFixedCell() const;
  393.     CCellRange GetUnobstructedNonFixedCellRange() const;
  394. public:
  395.     CCellRange GetVisibleNonFixedCellRange(LPRECT pRect = NULL) const;
  396.     CCellID SetFocusCell(CCellID cell);
  397.     CCellID SetFocusCell(int nRow, int nCol);
  398.     BOOL SetOuterHScrollBar( BOOL bOuterHScrollBar = TRUE, HWND hwndOuterHScroll = NULL );
  399. protected:
  400.     void ResetSelectedRange();
  401. void ResetScrollBars();
  402.     int  GetScrollPos32(int nBar, BOOL bGetTrackPos = FALSE) const;
  403.     int  SetScrollPos32(int nBar, int nPos, BOOL bRedraw = TRUE);
  404. // Overrrides
  405. protected:
  406.     // Printing    
  407. #if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING)
  408.     virtual void PrintColumnHeadings(CDC *pDC, CPrintInfo *pInfo);
  409.     virtual void PrintHeader(CDC *pDC, CPrintInfo *pInfo);
  410.     virtual void PrintFooter(CDC *pDC, CPrintInfo *pInfo);
  411. #endif
  412. #ifndef GRIDCONTROL_NO_DRAGDROP
  413.     // Drag n' drop
  414.     virtual CImageList* CreateDragImage(CPoint *pHotSpot);    // no longer necessary
  415. #endif
  416.     // Mouse Clicks
  417.     virtual void  OnFixedColumnClick(CCellID& cell);
  418.     virtual void  OnFixedRowClick(CCellID& cell);
  419.     // Editing
  420.     virtual CSize GetCellExtent(int nRow, int nCol, CDC* pDC);
  421.     virtual void  OnEndEditCell(int nRow, int nCol, CString str);
  422.     virtual void  OnEditCell(int nRow, int nCol, UINT nChar);
  423.     virtual void  CreateInPlaceEditControl(CRect& rect, DWORD dwStyle, UINT nID,
  424.                                            int nRow, int nCol,
  425.                                            LPCTSTR szText, int nChar);
  426.     // Drawing
  427.     virtual void  OnDraw(CDC* pDC);
  428.     virtual BOOL  DrawFixedCell(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBk=FALSE);
  429.     virtual BOOL  DrawCell(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBk=FALSE);
  430.     // GridCell Creation and Cleanup
  431.     virtual CGridCell* CreateCell(int nRow, int nCol);
  432.     virtual void EmptyCell(CGridCell* pCell, int nRow, int nCol);
  433. // Attributes
  434. protected:
  435.     // General attributes
  436.     COLORREF    m_crTextColour, m_crTextBkColour, m_crBkColour, m_crSelectedBkColour,   // Grid colours
  437.                 m_crFixedTextColour, m_crFixedBkColour, m_crGridColour;
  438.     COLORREF    m_crWindowText, m_crWindowColour, m_cr3DFace,     // System colours
  439.                 m_crShadow;    
  440.     int         m_nGridLines;
  441.     BOOL        m_bEditable;
  442.     BOOL        m_bModified;
  443.     BOOL        m_bAllowDragAndDrop;
  444.     BOOL        m_bListMode;
  445.     BOOL        m_bSingleRowSelection;
  446.     BOOL        m_bAllowDraw;
  447.     BOOL        m_bEnableSelection;
  448.     BOOL        m_bSortOnClick;
  449.     BOOL        m_bHandleTabKey;
  450.     BOOL        m_bDoubleBuffer;
  451.     BOOL        m_bTitleTips;
  452. BOOL        m_bOuterHScrollBar; // Added by SunZhenyu
  453. HWND        m_hwndOuterHScroll; // Added by SunZhenyu
  454.     // Cell size details
  455.     int         m_nRows, m_nFixedRows, m_nCols, m_nFixedCols;
  456.     CUIntArray  m_arRowHeights, m_arColWidths;
  457.     int         m_nMargin;
  458.     int         m_nDefCellWidth, m_nDefCellHeight;
  459.     int         m_nVScrollMax, m_nHScrollMax;
  460.     // Fonts and images
  461.     LOGFONT     m_Logfont;
  462.     CFont       m_PrinterFont,  // for the printer
  463.                 m_Font;         // for the grid
  464.     CImageList* m_pImageList;
  465.     // Cell data
  466.     CTypedPtrArray<CObArray, GRID_ROW*> m_RowData;
  467.     // Mouse operations such as cell selection
  468.     int         m_MouseMode;
  469.     CPoint      m_LeftClickDownPoint, m_LastMousePoint;
  470.     CCellID     m_LeftClickDownCell, m_SelectionStartCell;
  471.     CCellID     m_idCurrentCell;
  472.     int         m_nTimerID;
  473.     int         m_nTimerInterval;
  474.     int         m_nResizeCaptureRange;
  475.     BOOL        m_bAllowRowResize, m_bAllowColumnResize;
  476.     int         m_nRowsPerWheelNotch;
  477.     CMap<DWORD,DWORD, CCellID, CCellID&> m_SelectedCellMap, m_PrevSelectedCellMap;
  478. #ifndef GRIDCONTROL_NO_TITLETIPS
  479.     CTitleTip   m_TitleTip;             // Title tips for cells
  480. #endif
  481.     // Drag and drop
  482. BOOL m_bMustUninitOLE; // Do we need to uninitialise OLE?
  483.     CCellID     m_LastDragOverCell;
  484. #ifndef GRIDCONTROL_NO_DRAGDROP
  485.     CGridDropTarget m_DropTarget;       // OLE Drop target for the grid
  486. #endif
  487.     // Printing information
  488.     CSize       m_CharSize;
  489.     int         m_nPageHeight;
  490.     CSize       m_LogicalPageSize,      // Page size in gridctrl units.
  491.                 m_PaperSize;            // Page size in device units.
  492.     // sorting
  493.     int         m_bAscending;
  494.     int         m_SortColumn;
  495. protected:
  496.     void SelectAllCells();
  497.     void SelectColumns(CCellID currentCell);
  498.     void SelectRows(CCellID currentCell);
  499.     void SelectCells(CCellID currentCell);
  500.     void OnSelecting(const CCellID& currentCell);
  501.     // Generated message map functions
  502.     //{{AFX_MSG(CGridCtrl)
  503.     afx_msg void OnPaint();
  504.     afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
  505.     afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
  506.     afx_msg void OnSize(UINT nType, int cx, int cy);
  507.     afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  508.     afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  509.     afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  510.     afx_msg void OnTimer(UINT nIDEvent);
  511.     afx_msg UINT OnGetDlgCode();
  512.     afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  513.     afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
  514.     afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
  515.     afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  516.     afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  517.     afx_msg void OnSysColorChange();
  518.     afx_msg void OnCaptureChanged(CWnd *pWnd);
  519. afx_msg void OnUpdateEditCopy(CCmdUI* pCmdUI);
  520. afx_msg void OnUpdateEditCut(CCmdUI* pCmdUI);
  521. afx_msg void OnUpdateEditPaste(CCmdUI* pCmdUI);
  522. afx_msg void OnUpdateEditSelectAll(CCmdUI* pCmdUI);
  523. //}}AFX_MSG
  524. #if (_MFC_VER >= 0x0421) || (_WIN32_WCE >= 210)
  525.     afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);
  526. #endif
  527. #if !defined(_WIN32_WCE) && (_MFC_VER >= 0x0421)
  528.     afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
  529. #endif
  530.     afx_msg LRESULT OnSetFont(WPARAM hFont, LPARAM lParam);
  531.     afx_msg LRESULT OnGetFont(WPARAM hFont, LPARAM lParam);
  532.     afx_msg void OnEndInPlaceEdit(NMHDR* pNMHDR, LRESULT* pResult);
  533.     DECLARE_MESSAGE_MAP()
  534.     enum eMouseModes { MOUSE_NOTHING, MOUSE_SELECT_ALL, MOUSE_SELECT_COL, MOUSE_SELECT_ROW,
  535.                        MOUSE_SELECT_CELLS, MOUSE_SCROLLING_CELLS,
  536.                        MOUSE_OVER_ROW_DIVIDE, MOUSE_SIZING_ROW, 
  537.                        MOUSE_OVER_COL_DIVIDE, MOUSE_SIZING_COL,
  538.                        MOUSE_PREPARE_EDIT,
  539. #ifndef GRIDCONTROL_NO_DRAGDROP
  540.                        MOUSE_PREPARE_DRAG, MOUSE_DRAGGING
  541. #endif
  542.     };
  543. };
  544. inline CGridCell* CGridCtrl::GetCell(int nRow, int nCol) const
  545. {
  546.     if (nRow < 0 || nRow >= m_nRows || nCol < 0 || nCol >= m_nCols) return NULL;
  547.     GRID_ROW* pRow = m_RowData[nRow];
  548.     if (!pRow) return NULL;
  549.     return pRow->GetAt(nCol);
  550. }
  551. inline BOOL CGridCtrl::SetCell(int nRow, int nCol, CGridCell* pCell)
  552. {
  553.     if (nRow < 0 || nRow >= m_nRows || nCol < 0 || nCol >= m_nCols) return FALSE;
  554.     GRID_ROW* pRow = m_RowData[nRow];
  555.     if (!pRow) return FALSE;
  556.     pRow->SetAt(nCol, pCell);
  557.     return TRUE;
  558. }
  559. /////////////////////////////////////////////////////////////////////////////
  560. //{{AFX_INSERT_LOCATION}}
  561. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.
  562. #endif // !defined(AFX_GRIDCTRL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_)