GridCtrl.h
上传用户:jzscgs158
上传日期:2022-05-25
资源大小:8709k
文件大小:36k
源码类别:

百货/超市行业

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // GridCtrl.h : header file
  3. //
  4. // MFC Grid Control - main header
  5. //
  6. // Written by Chris Maunder <cmaunder@mail.com>
  7. // Copyright (c) 1998-2000. All Rights Reserved.
  8. //
  9. // This code may be used in compiled form in any way you desire. This
  10. // file may be redistributed unmodified by any means PROVIDING it is 
  11. // not sold for profit without the authors written consent, and 
  12. // providing that this notice and the authors name and all copyright 
  13. // notices remains intact. 
  14. //
  15. // An email letting me know how you are using it would be nice as well. 
  16. //
  17. // This file is provided "as is" with no expressed or implied warranty.
  18. // The author accepts no liability for any damage/loss of business that
  19. // this product may cause.
  20. //
  21. // For use with CGridCtrl v2.20
  22. //
  23. //////////////////////////////////////////////////////////////////////
  24. #if !defined(AFX_GRIDCTRL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_)
  25. #define AFX_GRIDCTRL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_
  26. #if _MSC_VER >= 1000
  27. #pragma once
  28. #endif // _MSC_VER >= 1000
  29. #include "CellRange.h"
  30. #include "GridCell.h"
  31. #include <afxtempl.h>
  32. ///////////////////////////////////////////////////////////////////////////////////
  33. // Defines - these determine the features (and the final size) of the final code
  34. ///////////////////////////////////////////////////////////////////////////////////
  35. //#define GRIDCONTROL_NO_TITLETIPS   // Do not use titletips for cells with large data
  36. //#define GRIDCONTROL_NO_DRAGDROP    // Do not use OLE drag and drop
  37. //#define GRIDCONTROL_NO_CLIPBOARD   // Do not use clipboard routines
  38. #ifdef _WIN32_WCE
  39. #   define GRIDCONTROL_NO_TITLETIPS   // Do not use titletips for cells with large data
  40. #   define GRIDCONTROL_NO_DRAGDROP    // Do not use OLE drag and drop
  41. #   define GRIDCONTROL_NO_CLIPBOARD   // Do not use clipboard routines
  42. #   define GRIDCONTROL_NO_PRINTING    // Do not use printing routines
  43. #   ifdef WCE_NO_PRINTING
  44. #       define _WIN32_WCE_NO_PRINTING
  45. #   endif
  46. #   ifdef WCE_NO_CURSOR
  47. #       define _WIN32_WCE_NO_CURSOR
  48. #   endif
  49. #endif  // _WIN32_WCE
  50. // Use this as the classname when inserting this control as a custom control
  51. // in the MSVC++ dialog editor
  52. #define GRIDCTRL_CLASSNAME    _T("MFCGridCtrl")  // Window class name
  53. #define IDC_INPLACE_CONTROL   8                  // ID of inplace edit controls
  54. ///////////////////////////////////////////////////////////////////////////////////
  55. // Conditional includes
  56. ///////////////////////////////////////////////////////////////////////////////////
  57. #ifndef GRIDCONTROL_NO_TITLETIPS
  58. #   include "TitleTip.h"
  59. #endif
  60. #ifndef GRIDCONTROL_NO_DRAGDROP
  61. #   include "GridDropTarget.h"
  62. #   undef GRIDCONTROL_NO_CLIPBOARD     // Force clipboard functions on
  63. #endif
  64. #ifndef GRIDCONTROL_NO_CLIPBOARD
  65. #   include <afxole.h>
  66. #endif
  67. ///////////////////////////////////////////////////////////////////////////////////
  68. // Helper functions
  69. ///////////////////////////////////////////////////////////////////////////////////
  70. // Handy functions
  71. #define IsSHIFTpressed() ( (GetKeyState(VK_SHIFT) & (1 << (sizeof(SHORT)*8-1))) != 0   )
  72. #define IsCTRLpressed()  ( (GetKeyState(VK_CONTROL) & (1 << (sizeof(SHORT)*8-1))) != 0 )
  73. // Backwards compatibility for pre 2.20 grid versions
  74. #define DDX_GridControl(pDX, nIDC, rControl)  DDX_Control(pDX, nIDC, rControl)     
  75. // Download by http://www.codefans.net
  76. ///////////////////////////////////////////////////////////////////////////////////
  77. // Structures
  78. ///////////////////////////////////////////////////////////////////////////////////
  79. // This structure sent to Grid's parent in a WM_NOTIFY message
  80. typedef struct tagNM_GRIDVIEW {
  81.     NMHDR hdr;
  82.     int   iRow;
  83.     int   iColumn;
  84. } NM_GRIDVIEW;
  85. // Download by http://www.codefans.net
  86. // This is sent to the Grid from child in-place edit controls
  87. typedef struct tagGV_DISPINFO {
  88.     NMHDR   hdr;
  89.     GV_ITEM item;
  90. } GV_DISPINFO;
  91. // This is sent to the Grid from child in-place edit controls
  92. typedef struct tagGV_CACHEHINT {
  93.     NMHDR      hdr;
  94.     CCellRange range;
  95. } GV_CACHEHINT;
  96. // storage typedef for each row in the grid
  97. typedef CTypedPtrArray<CObArray, CGridCellBase*> GRID_ROW;
  98. // For virtual mode callback
  99. typedef BOOL (CALLBACK* GRIDCALLBACK)(GV_DISPINFO *, LPARAM);
  100. ///////////////////////////////////////////////////////////////////////////////////
  101. // Defines
  102. ///////////////////////////////////////////////////////////////////////////////////
  103. // Grid line/scrollbar selection
  104. #define GVL_NONE                0L      // Neither
  105. #define GVL_HORZ                1L      // Horizontal line or scrollbar
  106. #define GVL_VERT                2L      // Vertical line or scrollbar
  107. #define GVL_BOTH                3L      // Both
  108. // Autosizing option
  109. #define GVS_DEFAULT             0
  110. #define GVS_HEADER              1       // Size using column fixed cells data only
  111. #define GVS_DATA                2       // Size using column non-fixed cells data only
  112. #define GVS_BOTH                3       // Size using column fixed and non-fixed
  113. // Cell Searching options
  114. #define GVNI_FOCUSED            0x0001
  115. #define GVNI_SELECTED           0x0002
  116. #define GVNI_DROPHILITED        0x0004
  117. #define GVNI_READONLY           0x0008
  118. #define GVNI_FIXED              0x0010
  119. #define GVNI_MODIFIED           0x0020
  120. #define GVNI_ABOVE              LVNI_ABOVE
  121. #define GVNI_BELOW              LVNI_BELOW
  122. #define GVNI_TOLEFT             LVNI_TOLEFT
  123. #define GVNI_TORIGHT            LVNI_TORIGHT
  124. #define GVNI_ALL                (LVNI_BELOW|LVNI_TORIGHT|LVNI_TOLEFT)
  125. #define GVNI_AREA               (LVNI_BELOW|LVNI_TORIGHT)
  126. // Hit test values (not yet implemented)
  127. #define GVHT_DATA               0x0000
  128. #define GVHT_TOPLEFT            0x0001
  129. #define GVHT_COLHDR             0x0002
  130. #define GVHT_ROWHDR             0x0004
  131. #define GVHT_COLSIZER           0x0008
  132. #define GVHT_ROWSIZER           0x0010
  133. #define GVHT_LEFT               0x0020
  134. #define GVHT_RIGHT              0x0040
  135. #define GVHT_ABOVE              0x0080
  136. #define GVHT_BELOW              0x0100
  137. // Messages sent to the grid's parent (More will be added in future)
  138. #define GVN_BEGINDRAG           LVN_BEGINDRAG        // LVN_FIRST-9
  139. #define GVN_BEGINLABELEDIT      LVN_BEGINLABELEDIT   // LVN_FIRST-5
  140. #define GVN_BEGINRDRAG          LVN_BEGINRDRAG
  141. #define GVN_COLUMNCLICK         LVN_COLUMNCLICK
  142. #define GVN_DELETEITEM          LVN_DELETEITEM
  143. #define GVN_ENDLABELEDIT        LVN_ENDLABELEDIT     // LVN_FIRST-6
  144. #define GVN_SELCHANGING         LVN_ITEMCHANGING
  145. #define GVN_SELCHANGED          LVN_ITEMCHANGED
  146. #define GVN_GETDISPINFO         LVN_GETDISPINFO 
  147. #define GVN_ODCACHEHINT         LVN_ODCACHEHINT 
  148. class CGridCtrl;
  149. /////////////////////////////////////////////////////////////////////////////
  150. // CGridCtrl window
  151. class CGridCtrl : public CWnd
  152. {
  153.     DECLARE_DYNCREATE(CGridCtrl)
  154.     friend class CGridCell;
  155.     friend class CGridCellBase;
  156. // Construction
  157. public:
  158.     CGridCtrl(int nRows = 0, int nCols = 0, int nFixedRows = 0, int nFixedCols = 0);
  159.     BOOL Create(const RECT& rect, CWnd* parent, UINT nID,
  160.                 DWORD dwStyle = WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE);
  161. // Attributes
  162. public:
  163.     int  GetRowCount() const                    { return m_nRows; }
  164.     int  GetColumnCount() const                 { return m_nCols; }
  165.     int  GetFixedRowCount() const               { return m_nFixedRows; }
  166.     int  GetFixedColumnCount() const            { return m_nFixedCols; }
  167.     BOOL SetRowCount(int nRows = 10);
  168.     BOOL SetColumnCount(int nCols = 10);
  169.     BOOL SetFixedRowCount(int nFixedRows = 1);
  170.     BOOL SetFixedColumnCount(int nFixedCols = 1);
  171.     int  GetRowHeight(int nRow) const;
  172.     BOOL SetRowHeight(int row, int height);
  173.     int  GetColumnWidth(int nCol) const;
  174.     BOOL SetColumnWidth(int col, int width);
  175.     BOOL GetCellOrigin(int nRow, int nCol, LPPOINT p);
  176.     BOOL GetCellOrigin(const CCellID& cell, LPPOINT p);
  177.     BOOL GetCellRect(int nRow, int nCol, LPRECT pRect);
  178.     BOOL GetCellRect(const CCellID& cell, LPRECT pRect);
  179.     BOOL GetTextRect(const CCellID& cell, LPRECT pRect);
  180.     BOOL GetTextRect(int nRow, int nCol, LPRECT pRect);
  181.     int  GetFixedRowHeight() const;
  182.     int  GetFixedColumnWidth() const;
  183.     long GetVirtualWidth() const;
  184.     long GetVirtualHeight() const;
  185.     CSize GetTextExtent(int nRow, int nCol, LPCTSTR str);
  186.     // EFW - Get extent of current text in cell
  187.     inline CSize GetCellTextExtent(int nRow, int nCol)  { return GetTextExtent(nRow, nCol, NULL); }
  188.     void     SetGridBkColor(COLORREF clr)         { m_crGridBkColour = clr;           }
  189.     COLORREF GetGridBkColor() const               { return m_crGridBkColour;          }
  190.     void     SetGridLineColor(COLORREF clr)       { m_crGridLineColour = clr;         }
  191.     COLORREF GetGridLineColor() const             { return m_crGridLineColour;        }
  192. void  SetTitleTipBackClr(COLORREF clr = CLR_DEFAULT) { m_crTTipBackClr = clr;  }
  193. COLORREF GetTitleTipBackClr()             { return m_crTTipBackClr; }
  194. void  SetTitleTipTextClr(COLORREF clr = CLR_DEFAULT) { m_crTTipTextClr = clr;  }
  195. COLORREF GetTitleTipTextClr()             { return m_crTTipTextClr; }
  196.     // ***************************************************************************** //
  197.     // These have been deprecated. Use GetDefaultCell and then set the colors
  198.     void     SetTextColor(COLORREF clr)      { m_cellDefault.SetTextClr(clr);        }
  199.     COLORREF GetTextColor()                  { return m_cellDefault.GetTextClr();    }
  200.     void     SetTextBkColor(COLORREF clr)    { m_cellDefault.SetBackClr(clr);        }
  201.     COLORREF GetTextBkColor()                { return m_cellDefault.GetBackClr();    }
  202.     void     SetFixedTextColor(COLORREF clr) { m_cellFixedRowDef.SetTextClr(clr); 
  203.                                                m_cellFixedColDef.SetTextClr(clr); 
  204.                                                m_cellFixedRowColDef.SetTextClr(clr); }
  205.     COLORREF GetFixedTextColor() const       { return m_cellFixedRowDef.GetBackClr(); }
  206.     void     SetFixedBkColor(COLORREF clr)   { m_cellFixedRowDef.SetBackClr(clr); 
  207.                                                m_cellFixedColDef.SetBackClr(clr); 
  208.                                                m_cellFixedRowColDef.SetBackClr(clr); }
  209.     COLORREF GetFixedBkColor() const         { return m_cellFixedRowDef.GetBackClr(); }
  210.     void     SetGridColor(COLORREF clr)      { SetGridLineColor(clr);                }
  211.     COLORREF GetGridColor()                  { return GetGridLineColor();            }
  212.     void     SetBkColor(COLORREF clr)        { SetGridBkColor(clr);                  }
  213.     COLORREF GetBkColor()                    { return GetGridBkColor();              }
  214.     void     SetDefCellMargin( int nMargin)  { m_cellDefault.SetMargin(nMargin); 
  215.                                                m_cellFixedRowDef.SetMargin(nMargin); 
  216.                                                m_cellFixedColDef.SetMargin(nMargin); 
  217.                                                m_cellFixedRowColDef.SetMargin(nMargin); }
  218.     int      GetDefCellMargin() const        { return m_cellDefault.GetMargin();     }
  219.     int      GetDefCellHeight() const        { return m_cellDefault.GetHeight();     }
  220.     void     SetDefCellHeight(int nHeight)   { m_cellDefault.SetHeight(nHeight); 
  221.                                                m_cellFixedRowDef.SetHeight(nHeight); 
  222.                                                m_cellFixedColDef.SetHeight(nHeight); 
  223.                                                m_cellFixedRowColDef.SetHeight(nHeight); }
  224.     int      GetDefCellWidth() const         { return m_cellDefault.GetWidth();     }
  225.     void     SetDefCellWidth(int nWidth)     { m_cellDefault.SetWidth(nWidth); 
  226.                                                m_cellFixedRowDef.SetWidth(nWidth); 
  227.                                                m_cellFixedColDef.SetWidth(nWidth); 
  228.                                                m_cellFixedRowColDef.SetWidth(nWidth); }
  229.     // ***************************************************************************** //
  230.     int GetSelectedCount() const                  { return m_SelectedCellMap.GetCount(); }
  231.     CCellID SetFocusCell(CCellID cell);
  232.     CCellID SetFocusCell(int nRow, int nCol);
  233.     CCellID GetFocusCell() const                  { return m_idCurrentCell;           }
  234.     void SetVirtualMode(BOOL bVirtual);
  235.     BOOL GetVirtualMode() const                   { return m_bVirtualMode;            }
  236.     void SetCallbackFunc(GRIDCALLBACK pCallback, 
  237.                          LPARAM lParam)           { m_pfnCallback = pCallback; m_lParam = lParam; }
  238.     GRIDCALLBACK GetCallbackFunc()                { return m_pfnCallback;             }
  239.     void SetImageList(CImageList* pList)          { m_pImageList = pList;             }
  240.     CImageList* GetImageList() const              { return m_pImageList;              }
  241.     void SetGridLines(int nWhichLines = GVL_BOTH);
  242.     int  GetGridLines() const                     { return m_nGridLines;              }
  243.     void SetEditable(BOOL bEditable = TRUE)       { m_bEditable = bEditable;          }
  244.     BOOL IsEditable() const                       { return m_bEditable;               }
  245.     void SetListMode(BOOL bEnableListMode = TRUE);
  246.     BOOL GetListMode() const                      { return m_bListMode;               }
  247.     void SetSingleRowSelection(BOOL bSing = TRUE) { m_bSingleRowSelection = bSing;    }
  248.     BOOL GetSingleRowSelection()                  { return m_bSingleRowSelection & m_bListMode; }
  249.     void SetSingleColSelection(BOOL bSing = TRUE) { m_bSingleColSelection = bSing;    }
  250.     BOOL GetSingleColSelection()                  { return m_bSingleColSelection;     }
  251.     void EnableSelection(BOOL bEnable = TRUE)     { ResetSelectedRange(); m_bEnableSelection = bEnable; ResetSelectedRange(); }
  252.     BOOL IsSelectable() const                     { return m_bEnableSelection;        }
  253.     void SetFixedColumnSelection(BOOL bSelect)    { m_bFixedColumnSelection = bSelect;}
  254.     BOOL GetFixedColumnSelection()                { return m_bFixedColumnSelection;   }
  255.     void SetFixedRowSelection(BOOL bSelect)       { m_bFixedRowSelection = bSelect;   }
  256.     BOOL GetFixedRowSelection()                   { return m_bFixedRowSelection;      }
  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 SetSortColumn(int nCol);
  272.     int  GetSortColumn() const                    { return m_nSortColumn;             }
  273.     void SetSortAscending(BOOL bAscending)        { m_bAscending = bAscending;        }
  274.     BOOL GetSortAscending() const                 { return m_bAscending;              }
  275.     void SetTrackFocusCell(BOOL bTrack)           { m_bTrackFocusCell = bTrack;       }
  276.     BOOL GetTrackFocusCell()                      { return m_bTrackFocusCell;         }
  277.     void SetFrameFocusCell(BOOL bFrame)           { m_bFrameFocus = bFrame;           }
  278.     BOOL GetFrameFocusCell()                      { return m_bFrameFocus;             }
  279.     void SetAutoSizeStyle(int nStyle = GVS_BOTH)  { m_nAutoSizeColumnStyle = nStyle;  }
  280.     int  GetAutoSizeStyle()                       { return m_nAutoSizeColumnStyle; }
  281.     void EnableHiddenColUnhide(BOOL bEnable = TRUE){ m_bHiddenColUnhide = bEnable;    }
  282.     BOOL GetHiddenColUnhide()                     { return m_bHiddenColUnhide;        }
  283.     void EnableHiddenRowUnhide(BOOL bEnable = TRUE){ m_bHiddenRowUnhide = bEnable;    }
  284.     BOOL GetHiddenRowUnhide()                     { return m_bHiddenRowUnhide;        }
  285.     void EnableColumnHide(BOOL bEnable = TRUE)    { m_bAllowColHide = bEnable;        }
  286.     BOOL GetColumnHide()                          { return m_bAllowColHide;           }
  287.     void EnableRowHide(BOOL bEnable = TRUE)       { m_bAllowRowHide = bEnable;        }
  288.     BOOL GetRowHide()                             { return m_bAllowRowHide;           }
  289. // default Grid cells. Use these for setting default values such as colors and fonts
  290. public:
  291.     CGridCellBase* GetDefaultCell(BOOL bFixedRow, BOOL bFixedCol) const;
  292. // Grid cell Attributes
  293. public:
  294.     CGridCellBase* GetCell(int nRow, int nCol) const;   // Get the actual cell!
  295.     void SetModified(BOOL bModified = TRUE, int nRow = -1, int nCol = -1);
  296.     BOOL GetModified(int nRow = -1, int nCol = -1);
  297.     BOOL IsCellFixed(int nRow, int nCol);
  298.     BOOL   SetItem(const GV_ITEM* pItem);
  299.     BOOL   GetItem(GV_ITEM* pItem);
  300.     BOOL   SetItemText(int nRow, int nCol, LPCTSTR str);
  301.     // The following was virtual. If you want to override, use 
  302.     //  CGridCellBase-derived class's GetText() to accomplish same thing
  303.     CString GetItemText(int nRow, int nCol) const;
  304.     // EFW - 06/13/99 - Added to support printf-style formatting codes.
  305.     // Also supports use with a string resource ID
  306. #if (_WIN32_WCE >= 210)
  307.     BOOL   SetItemTextFmt(int nRow, int nCol, LPCTSTR szFmt, ...);
  308.     BOOL   SetItemTextFmtID(int nRow, int nCol, UINT nID, ...);
  309. #endif
  310.     BOOL   SetItemData(int nRow, int nCol, LPARAM lParam);
  311.     LPARAM GetItemData(int nRow, int nCol) const;
  312.     BOOL   SetItemImage(int nRow, int nCol, int iImage);
  313.     int    GetItemImage(int nRow, int nCol) const;
  314.     BOOL   SetItemState(int nRow, int nCol, UINT state);
  315.     UINT   GetItemState(int nRow, int nCol) const;
  316.     BOOL   SetItemFormat(int nRow, int nCol, UINT nFormat);
  317.     UINT   GetItemFormat(int nRow, int nCol) const;
  318.     BOOL   SetItemBkColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT);
  319.     COLORREF GetItemBkColour(int nRow, int nCol) const;
  320.     BOOL   SetItemFgColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT);
  321.     COLORREF GetItemFgColour(int nRow, int nCol) const;
  322.     BOOL SetItemFont(int nRow, int nCol, const LOGFONT* lf);
  323.     const LOGFONT* GetItemFont(int nRow, int nCol);
  324.     BOOL IsItemEditing(int nRow, int nCol);
  325.     BOOL SetCellType(int nRow, int nCol, CRuntimeClass* pRuntimeClass);
  326.     BOOL SetDefaultCellType( CRuntimeClass* pRuntimeClass);
  327. // Operations
  328. public:
  329.     int  InsertColumn(LPCTSTR strHeading, UINT nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE,
  330.                       int nColumn = -1);
  331.     int  InsertRow(LPCTSTR strHeading, int nRow = -1);
  332.     BOOL DeleteColumn(int nColumn);
  333.     BOOL DeleteRow(int nRow);
  334.     BOOL DeleteNonFixedRows();
  335.     BOOL DeleteAllItems();
  336.     BOOL AutoSizeRow(int nRow, BOOL bResetScroll = TRUE);
  337.     BOOL AutoSizeColumn(int nCol, UINT nAutoSizeStyle = GVS_DEFAULT, BOOL bResetScroll = TRUE);
  338.     void AutoSizeRows();
  339.     void AutoSizeColumns(UINT nAutoSizeStyle = GVS_DEFAULT);
  340.     void AutoSize(UINT nAutoSizeStyle = GVS_DEFAULT);
  341.     void ExpandColumnsToFit();
  342.     void ExpandLastColumn();
  343.     void ExpandRowsToFit();
  344.     void ExpandToFit();
  345.     void Refresh();
  346.     void AutoFill();   // Fill grid with blank cells
  347.     void EnsureVisible(CCellID &cell)       { EnsureVisible(cell.row, cell.col); }
  348.     void EnsureVisible(int nRow, int nCol);
  349.     BOOL IsCellVisible(int nRow, int nCol);
  350.     BOOL IsCellVisible(CCellID cell);
  351.     BOOL IsCellEditable(int nRow, int nCol) const;
  352.     BOOL IsCellEditable(CCellID &cell) const;
  353.     BOOL IsCellSelected(int nRow, int nCol) const;
  354.     BOOL IsCellSelected(CCellID &cell) const;
  355.     // SetRedraw stops/starts redraws on things like changing the # rows/columns
  356.     // and autosizing, but not for user-intervention such as resizes
  357.     void SetRedraw(BOOL bAllowDraw, BOOL bResetScrollBars = FALSE);
  358.     BOOL RedrawCell(int nRow, int nCol, CDC* pDC = NULL);
  359.     BOOL RedrawCell(const CCellID& cell, CDC* pDC = NULL);
  360.     BOOL RedrawRow(int row);
  361.     BOOL RedrawColumn(int col);
  362. #ifndef _WIN32_WCE
  363.     BOOL Save(LPCTSTR filename);
  364.     BOOL Load(LPCTSTR filename);
  365. #endif
  366.     CCellRange GetCellRange() const;
  367.     CCellRange GetSelectedCellRange() const;
  368.     void SetSelectedRange(const CCellRange& Range, BOOL bForceRepaint = FALSE, BOOL bSelectCells = TRUE);
  369.     void SetSelectedRange(int nMinRow, int nMinCol, int nMaxRow, int nMaxCol,
  370.                           BOOL bForceRepaint = FALSE, BOOL bSelectCells = TRUE);
  371.     BOOL IsValid(int nRow, int nCol) const;
  372.     BOOL IsValid(const CCellID& cell) const;
  373.     BOOL IsValid(const CCellRange& range) const;
  374. #ifndef GRIDCONTROL_NO_CLIPBOARD
  375.     // Clipboard and cut n' paste operations
  376.     virtual void CutSelectedText();
  377.     virtual COleDataSource* CopyTextFromGrid();
  378.     virtual BOOL PasteTextToGrid(CCellID cell, COleDataObject* pDataObject);
  379. #endif
  380. #ifndef GRIDCONTROL_NO_DRAGDROP
  381.     void OnBeginDrag();
  382.     DROPEFFECT OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
  383.     DROPEFFECT OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
  384.     void OnDragLeave();
  385.     BOOL OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point);
  386. #endif
  387. #ifndef GRIDCONTROL_NO_CLIPBOARD
  388.     virtual void OnEditCut();
  389.     virtual void OnEditCopy();
  390.     virtual void OnEditPaste();
  391. #endif
  392.     virtual void OnEditSelectAll();
  393.     CCellID GetNextItem(CCellID& cell, int nFlags) const;
  394.     BOOL SortTextItems(int nCol, BOOL bAscending);
  395.     BOOL SortItems(PFNLVCOMPARE pfnCompare, int nCol, BOOL bAscending, LPARAM data = 0);
  396. // Overrides
  397.     // ClassWizard generated virtual function overrides
  398.     //{{AFX_VIRTUAL(CGridCtrl)
  399.     protected:
  400.     virtual void PreSubclassWindow();
  401.     //}}AFX_VIRTUAL
  402. #if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING)
  403. // Printing operations
  404. public:
  405.     void Print();
  406.     // EFW - New printing support functions
  407.     void EnableWysiwygPrinting(BOOL bEnable = TRUE) { m_bWysiwygPrinting = bEnable;     }
  408.     BOOL GetWysiwygPrinting()                       { return m_bWysiwygPrinting;        }
  409.     void SetShadedPrintOut(BOOL bEnable = TRUE)     {   m_bShadedPrintOut = bEnable;    }
  410.     BOOL GetShadedPrintOut(void)                    {   return m_bShadedPrintOut;       }
  411.     // Use -1 to have it keep the existing value
  412.     void SetPrintMarginInfo(int nHeaderHeight, int nFooterHeight,
  413.         int nLeftMargin, int nRightMargin, int nTopMargin,
  414.         int nBottomMargin, int nGap);
  415.     void GetPrintMarginInfo(int &nHeaderHeight, int &nFooterHeight,
  416.         int &nLeftMargin, int &nRightMargin, int &nTopMargin,
  417.         int &nBottomMargin, int &nGap);
  418. // Printing overrides for derived classes
  419. public:
  420.     virtual void OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo);
  421.     virtual void OnPrint(CDC *pDC, CPrintInfo *pInfo);
  422.     virtual void OnEndPrinting(CDC *pDC, CPrintInfo *pInfo);
  423. #endif // #if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING)
  424. // Implementation
  425. public:
  426.     virtual ~CGridCtrl();
  427. protected:
  428.     BOOL RegisterWindowClass();
  429.     BOOL Initialise();
  430.     void SetupDefaultCells();
  431.     LRESULT SendMessageToParent(int nRow, int nCol, int nMessage) const;
  432.     LRESULT SendDisplayRequestToParent(GV_DISPINFO* pDisplayInfo) const;
  433.     LRESULT SendCacheHintToParent(CCellRange& range) const;
  434.     BOOL InvalidateCellRect(const int row, const int col);
  435.     BOOL InvalidateCellRect(const CCellID& cell);
  436.     BOOL InvalidateCellRect(const CCellRange& cellRange);
  437.     void EraseBkgnd(CDC* pDC);
  438.     BOOL GetCellRangeRect(const CCellRange& cellRange, LPRECT lpRect);
  439.     BOOL SetCell(int nRow, int nCol, CGridCellBase* pCell);
  440.     int  SetMouseMode(int nMode) { int nOldMode = m_MouseMode; m_MouseMode = nMode; return nOldMode; }
  441.     int  GetMouseMode() const    { return m_MouseMode; }
  442.     BOOL MouseOverRowResizeArea(CPoint& point);
  443.     BOOL MouseOverColumnResizeArea(CPoint& point);
  444.     CCellID GetCellFromPt(CPoint point, BOOL bAllowFixedCellCheck = TRUE);
  445.     CCellID GetTopleftNonFixedCell();
  446.     CCellRange GetUnobstructedNonFixedCellRange();
  447.     CCellRange GetVisibleNonFixedCellRange(LPRECT pRect = NULL);
  448.     BOOL IsVisibleVScroll() { return ( (m_nBarState & GVL_VERT) > 0); } 
  449.     BOOL IsVisibleHScroll() { return ( (m_nBarState & GVL_HORZ) > 0); }
  450.     void ResetSelectedRange();
  451.     void ResetScrollBars();
  452.     void EnableScrollBars(int nBar, BOOL bEnable = TRUE);
  453.     int  GetScrollPos32(int nBar, BOOL bGetTrackPos = FALSE);
  454.     BOOL SetScrollPos32(int nBar, int nPos, BOOL bRedraw = TRUE);
  455.     BOOL SortTextItems(int nCol, BOOL bAscending, int low, int high);
  456.     BOOL SortItems(PFNLVCOMPARE pfnCompare, int nCol, BOOL bAscending, LPARAM data,
  457.                    int low, int high);
  458.     CPoint GetPointClicked(int nRow, int nCol, const CPoint& point);
  459. // Overrrides
  460. protected:
  461. #if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING)
  462.     // Printing
  463.     virtual void PrintColumnHeadings(CDC *pDC, CPrintInfo *pInfo);
  464.     virtual void PrintHeader(CDC *pDC, CPrintInfo *pInfo);
  465.     virtual void PrintFooter(CDC *pDC, CPrintInfo *pInfo);
  466.     virtual void PrintRowButtons(CDC *pDC, CPrintInfo* /*pInfo*/);
  467. #endif
  468. #ifndef GRIDCONTROL_NO_DRAGDROP
  469.     // Drag n' drop
  470.     virtual CImageList* CreateDragImage(CPoint *pHotSpot);    // no longer necessary
  471. #endif
  472.     // Mouse Clicks
  473.     virtual void  OnFixedColumnClick(CCellID& cell);
  474.     virtual void  OnFixedRowClick(CCellID& cell);
  475.     // Editing
  476.     virtual void  OnEndEditCell(int nRow, int nCol, CString str);
  477.     virtual void  OnEditCell(int nRow, int nCol, CPoint point, UINT nChar);
  478.     virtual void  EndEditing();
  479.     // Drawing
  480.     virtual void  OnDraw(CDC* pDC);
  481.     // CGridCellBase Creation and Cleanup
  482.     virtual CGridCellBase* CreateCell(int nRow, int nCol);
  483.     virtual void DestroyCell(int nRow, int nCol);
  484. // Attributes
  485. protected:
  486.     // General attributes
  487.     COLORREF    m_crFixedTextColour, m_crFixedBkColour;
  488.     COLORREF    m_crGridBkColour, m_crGridLineColour;
  489.     COLORREF    m_crWindowText, m_crWindowColour, m_cr3DFace,     // System colours
  490.                 m_crShadow;
  491.     COLORREF    m_crTTipBackClr, m_crTTipTextClr;                 // Titletip colours - FNA
  492.     
  493.     BOOL        m_bVirtualMode;
  494.     LPARAM      m_lParam;                                           // lParam for callback
  495.     GRIDCALLBACK m_pfnCallback;                                     // The callback function
  496.     int         m_nGridLines;
  497.     BOOL        m_bEditable;
  498.     BOOL        m_bModified;
  499.     BOOL        m_bAllowDragAndDrop;
  500.     BOOL        m_bListMode;
  501.     BOOL        m_bSingleRowSelection;
  502.     BOOL        m_bSingleColSelection;
  503.     BOOL        m_bAllowDraw;
  504.     BOOL        m_bEnableSelection;
  505.     BOOL        m_bFixedRowSelection, m_bFixedColumnSelection;
  506.     BOOL        m_bSortOnClick;
  507.     BOOL        m_bHandleTabKey;
  508.     BOOL        m_bDoubleBuffer;
  509.     BOOL        m_bTitleTips;
  510.     int         m_nBarState;
  511.     BOOL        m_bWysiwygPrinting;
  512.     BOOL        m_bHiddenColUnhide, m_bHiddenRowUnhide;
  513.     BOOL        m_bAllowColHide, m_bAllowRowHide;
  514.     BOOL        m_bAutoSizeSkipColHdr;
  515.     BOOL        m_bTrackFocusCell;
  516.     BOOL        m_bFrameFocus;
  517.     UINT        m_nAutoSizeColumnStyle;
  518.     // Cell size details
  519.     int         m_nRows, m_nFixedRows, m_nCols, m_nFixedCols;
  520.     CUIntArray  m_arRowHeights, m_arColWidths;
  521.     int         m_nVScrollMax, m_nHScrollMax;
  522.     // Fonts and images
  523.     CRuntimeClass*   m_pRtcDefault; // determines kind of Grid Cell created by default
  524.     CGridDefaultCell m_cellDefault;  // "default" cell. Contains default colours, font etc.
  525.     CGridDefaultCell m_cellFixedColDef, m_cellFixedRowDef, m_cellFixedRowColDef;
  526.     CFont       m_PrinterFont;  // for the printer
  527.     CImageList* m_pImageList;
  528.     // Cell data
  529.     CTypedPtrArray<CObArray, GRID_ROW*> m_RowData;
  530.     // Mouse operations such as cell selection
  531.     int         m_MouseMode;
  532.     BOOL        m_bMouseButtonDown;
  533.     CPoint      m_LeftClickDownPoint, m_LastMousePoint;
  534.     CCellID     m_LeftClickDownCell, m_SelectionStartCell;
  535.     CCellID     m_idCurrentCell, m_idTopLeftCell;
  536.     int         m_nTimerID;
  537.     int         m_nTimerInterval;
  538.     int         m_nResizeCaptureRange;
  539.     BOOL        m_bAllowRowResize, m_bAllowColumnResize;
  540.     int         m_nRowsPerWheelNotch;
  541.     CMap<DWORD,DWORD, CCellID, CCellID&> m_SelectedCellMap, m_PrevSelectedCellMap;
  542. #ifndef GRIDCONTROL_NO_TITLETIPS
  543.     CTitleTip   m_TitleTip;             // Title tips for cells
  544. #endif
  545.     // Drag and drop
  546.     BOOL        m_bMustUninitOLE;       // Do we need to uninitialise OLE?
  547.     CCellID     m_LastDragOverCell;
  548. #ifndef GRIDCONTROL_NO_DRAGDROP
  549.     CGridDropTarget m_DropTarget;       // OLE Drop target for the grid
  550. #endif
  551.     // Printing information
  552.     CSize       m_CharSize;
  553.     int         m_nPageHeight;
  554.     CSize       m_LogicalPageSize,      // Page size in gridctrl units.
  555.                 m_PaperSize;            // Page size in device units.
  556.     // additional properties to support Wysiwyg printing
  557.     int         m_nPageWidth;
  558.     int         m_nPrintColumn;
  559.     int         m_nCurrPrintRow;
  560.     int         m_nNumPages;
  561.     int         m_nPageMultiplier;
  562.     // sorting
  563.     int         m_bAscending;
  564.     int         m_nSortColumn;
  565.     // EFW - Added to support shaded/unshaded printout.  If true, colored
  566.     // cells will print as-is.  If false, all text prints as black on white.
  567.     BOOL        m_bShadedPrintOut;
  568.     // EFW - Added support for user-definable margins.  Top and bottom are in 
  569.     // lines.  Left, right, and gap are in characters (avg width is used).
  570.     int         m_nHeaderHeight, m_nFooterHeight, m_nLeftMargin,
  571.                 m_nRightMargin, m_nTopMargin, m_nBottomMargin, m_nGap;
  572. protected:
  573.     void SelectAllCells();
  574.     void SelectColumns(CCellID currentCell, BOOL bForceRedraw=FALSE, BOOL bSelectCells=TRUE);
  575.     void SelectRows(CCellID currentCell, BOOL bForceRedraw=FALSE, BOOL bSelectCells=TRUE);
  576.     void SelectCells(CCellID currentCell, BOOL bForceRedraw=FALSE, BOOL bSelectCells=TRUE);
  577.     void OnSelecting(const CCellID& currentCell);
  578.     // Generated message map functions
  579.     //{{AFX_MSG(CGridCtrl)
  580.     afx_msg void OnPaint();
  581.     afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
  582.     afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
  583.     afx_msg void OnSize(UINT nType, int cx, int cy);
  584.     afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  585.     afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  586.     afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  587.     afx_msg void OnTimer(UINT nIDEvent);
  588.     afx_msg UINT OnGetDlgCode();
  589.     afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  590.     afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
  591.     afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
  592.     afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  593.     afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  594.     afx_msg void OnUpdateEditSelectAll(CCmdUI* pCmdUI);
  595.     //}}AFX_MSG
  596. #ifndef _WIN32_WCE_NO_CURSOR
  597.     afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  598. #endif
  599. #ifndef _WIN32_WCE
  600.     afx_msg void OnRButtonUp(UINT nFlags, CPoint point);    // EFW - Added
  601.     afx_msg void OnSysColorChange();
  602. #endif
  603. #ifndef _WIN32_WCE_NO_CURSOR
  604.     afx_msg void OnCaptureChanged(CWnd *pWnd);
  605. #endif
  606. #ifndef GRIDCONTROL_NO_CLIPBOARD
  607.     afx_msg void OnUpdateEditCopy(CCmdUI* pCmdUI);
  608.     afx_msg void OnUpdateEditCut(CCmdUI* pCmdUI);
  609.     afx_msg void OnUpdateEditPaste(CCmdUI* pCmdUI);
  610. #endif
  611. #if (_MFC_VER >= 0x0421) || (_WIN32_WCE >= 210)
  612.     afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);
  613. #endif
  614. #if !defined(_WIN32_WCE) && (_MFC_VER >= 0x0421)
  615.     afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
  616. #endif
  617.     afx_msg LRESULT OnSetFont(WPARAM hFont, LPARAM lParam);
  618.     afx_msg LRESULT OnGetFont(WPARAM hFont, LPARAM lParam);
  619.     afx_msg void OnEndInPlaceEdit(NMHDR* pNMHDR, LRESULT* pResult);
  620.     DECLARE_MESSAGE_MAP()
  621.     enum eMouseModes { MOUSE_NOTHING, MOUSE_SELECT_ALL, MOUSE_SELECT_COL, MOUSE_SELECT_ROW,
  622.                        MOUSE_SELECT_CELLS, MOUSE_SCROLLING_CELLS,
  623.                        MOUSE_OVER_ROW_DIVIDE, MOUSE_SIZING_ROW,
  624.                        MOUSE_OVER_COL_DIVIDE, MOUSE_SIZING_COL,
  625.                        MOUSE_PREPARE_EDIT,
  626. #ifndef GRIDCONTROL_NO_DRAGDROP
  627.                        MOUSE_PREPARE_DRAG, MOUSE_DRAGGING
  628. #endif
  629.     };
  630. };
  631. // Returns the default cell implementation for the given grid region
  632. inline CGridCellBase* CGridCtrl::GetDefaultCell(BOOL bFixedRow, BOOL bFixedCol) const
  633.     if (bFixedRow && bFixedCol) return (CGridCellBase*) &m_cellFixedRowColDef;
  634.     if (bFixedRow)              return (CGridCellBase*) &m_cellFixedRowDef;
  635.     if (bFixedCol)              return (CGridCellBase*) &m_cellFixedColDef;
  636.     return (CGridCellBase*) &m_cellDefault;
  637. }
  638. inline CGridCellBase* CGridCtrl::GetCell(int nRow, int nCol) const
  639. {
  640.     if (nRow < 0 || nRow >= m_nRows || nCol < 0 || nCol >= m_nCols) 
  641.         return NULL;
  642.     if (GetVirtualMode())
  643.     {
  644.         CGridCellBase* pCell = GetDefaultCell(nRow < m_nFixedRows, nCol < m_nFixedCols);
  645.         static GV_DISPINFO gvdi;
  646.         gvdi.item.row     = nRow;
  647.         gvdi.item.col     = nCol;
  648.         gvdi.item.mask    = 0xFFFFFFFF;
  649.         gvdi.item.nState  = 0;
  650.         gvdi.item.nFormat = pCell->GetFormat();
  651.         gvdi.item.iImage  = pCell->GetImage();
  652.         gvdi.item.crBkClr = pCell->GetBackClr();
  653.         gvdi.item.crFgClr = pCell->GetTextClr();
  654.         gvdi.item.lParam  = pCell->GetData();
  655.         memcpy(&gvdi.item.lfFont, pCell->GetFont(), sizeof(LOGFONT));
  656.         gvdi.item.nMargin = pCell->GetMargin();
  657.         gvdi.item.strText.Empty();
  658.         // Fix the state bits
  659.         if (IsCellSelected(nRow, nCol))   gvdi.item.nState |= GVIS_SELECTED;
  660.         if (nRow < GetFixedRowCount())    gvdi.item.nState |= (GVIS_FIXED | GVIS_FIXEDROW);
  661.         if (nCol < GetFixedColumnCount()) gvdi.item.nState |= (GVIS_FIXED | GVIS_FIXEDCOL);
  662.         if (GetFocusCell() == CCellID(nRow, nCol)) gvdi.item.nState |= GVIS_FOCUSED;
  663.         
  664.         if (m_pfnCallback)
  665.             m_pfnCallback(&gvdi, m_lParam);
  666.         else
  667.             SendDisplayRequestToParent(&gvdi);
  668.         static CGridCell cell;
  669.         cell.SetState(gvdi.item.nState);
  670.         cell.SetFormat(gvdi.item.nFormat);
  671.         cell.SetImage(gvdi.item.iImage);
  672.         cell.SetBackClr(gvdi.item.crBkClr);
  673.         cell.SetTextClr(gvdi.item.crFgClr);
  674.         cell.SetData(gvdi.item.lParam);
  675.         cell.SetFont(&(gvdi.item.lfFont));
  676.         cell.SetMargin(gvdi.item.nMargin);
  677.         cell.SetText(gvdi.item.strText);
  678.         cell.SetGrid((CGridCtrl*)this);
  679.         return (CGridCellBase*) &cell;
  680.     }
  681.     GRID_ROW* pRow = m_RowData[nRow];
  682.     if (!pRow) return NULL;
  683.     return pRow->GetAt(nCol);
  684. }
  685. inline BOOL CGridCtrl::SetCell(int nRow, int nCol, CGridCellBase* pCell)
  686. {
  687.     if (GetVirtualMode())
  688.         return FALSE;
  689.     if (nRow < 0 || nRow >= m_nRows || nCol < 0 || nCol >= m_nCols) 
  690.         return FALSE;
  691.     GRID_ROW* pRow = m_RowData[nRow];
  692.     if (!pRow) return FALSE;
  693.     pCell->SetCoords( nRow, nCol); 
  694.     pRow->SetAt(nCol, pCell);
  695.     return TRUE;
  696. }
  697. /////////////////////////////////////////////////////////////////////////////
  698. //{{AFX_INSERT_LOCATION}}
  699. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.
  700. #endif // !defined(AFX_GRIDCTRL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_)