www.pudn.com > FEMS.rar > GridCtrl.h


#if !defined(AFX_GRIDCTRL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_) 
#define AFX_GRIDCTRL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_ 
 
#if _MSC_VER >= 1000 
#pragma once 
#endif // _MSC_VER >= 1000 
 
///////////////////////////////////////////////////////////////////////////// 
// GridCtrl.h : header file 
// 
// MFC Grid Control header file 
// 
//The code added function for combine or unCombine cell 
//the added function  written by daishaozhong(daishaozhong@china.com) 
//added time 2001-8-18. 
// 
// Written by Chris Maunder (chrismaunder@codeguru.com) 
// Copyright (c) 1998. 
// 
// The code contained in this file is based on the original 
// WorldCom Grid control written by Joe Willcoxson, 
//        E-mail:  chinajoe@aol.com 
//        URL:  http://users.aol.com/chinajoe 
// 
 
// 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. If the source code in this file is used in  
// any  commercial application then a statement along the lines of  
// "Portions copyright (c) Chris Maunder, 1998" must be included in  
// the startup banner, "About" box or printed documentation. An email  
// letting me know that you are using it would be nice as well. That's  
// not much to ask considering the amount of work that went into this. 
// 
// 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. 
// 
// Expect bugs! 
//  
// Please use and enjoy. Please let me know of any bugs/mods/improvements  
// that you have found/implemented and I will fix/incorporate them into this 
// file.  
// 
///////////////////////////////////////////////////////////////////////////// 
 
//#define GRIDCONTROL_NO_TITLETIPS   // Do not use titletips for cells with large data 
//#define GRIDCONTROL_NO_DRAGDROP    // Do not use OLE drag and drop 
//#define GRIDCONTROL_NO_CLIPBOARD   // Do not use clipboard routines 
 
#include "CellRange.h" 
#include  
 
#ifdef _WIN32_WCE 
#define GRIDCONTROL_NO_TITLETIPS   // Do not use titletips for cells with large data 
#define GRIDCONTROL_NO_DRAGDROP    // Do not use OLE drag and drop 
#define GRIDCONTROL_NO_CLIPBOARD   // Do not use clipboard routines 
#define GRIDCONTROL_NO_PRINTING    // Do not use printing routines 
 
#ifdef WCE_NO_PRINTING 
#define _WIN32_WCE_NO_PRINTING 
#endif 
#ifdef WCE_NO_CURSOR 
#define _WIN32_WCE_NO_CURSOR 
#endif 
 
#else 
// Use C++ exception handling instead of structured. 
#undef TRY 
#undef CATCH 
#undef END_CATCH 
#define TRY try 
#define CATCH(ex_class, ex_object) catch(ex_class* ex_object) 
#define END_CATCH 
#endif  // _WIN32_WCE 
 
#ifndef GRIDCONTROL_NO_TITLETIPS 
#include "TitleTip.h" 
#endif 
 
#ifndef GRIDCONTROL_NO_DRAGDROP 
#include "GridDropTarget.h" 
#undef GRIDCONTROL_NO_CLIPBOARD     // Force clipboard functions on 
#endif 
 
#ifndef GRIDCONTROL_NO_CLIPBOARD 
#include  
#endif 
 
// Use this as the classname when inserting this control as a custom control 
// in the MSVC++ dialog editor 
#define GRIDCTRL_CLASSNAME    _T("MFCGridCtrl")  // Window class name 
#define IDC_INPLACE_CONTROL   8                  // ID of inplace edit controls 
 
#define IsSHIFTpressed() ( (GetKeyState(VK_SHIFT) & (1 << (sizeof(SHORT)*8-1))) != 0   ) 
#define IsCTRLpressed()  ( (GetKeyState(VK_CONTROL) & (1 << (sizeof(SHORT)*8-1))) != 0 ) 
 
// Used for Get/SetItem calls. 
typedef struct _GV_ITEM {  
    int      row,col;     // Row and Column of item 
    UINT     mask;        // Mask for use in getting/setting cell data 
    UINT     state;       // cell state (focus/hilighted etc) 
    UINT     nFormat;     // Format of cell 
    CString  szText;      // Text in cell 
    int      iImage;      // index of the list view item抯 icon 
    COLORREF crBkClr;     // Background colour (or CLR_DEFAULT) 
    COLORREF crFgClr;     // Forground colour (or CLR_DEFAULT) 
    LPARAM   lParam;      // 32-bit value to associate with item  
    LOGFONT  lfFont;      // Cell font 
} GV_ITEM;  
 
// Grid line selection 
#define GVL_NONE                0 
#define GVL_HORZ                1 
#define GVL_VERT                2 
#define GVL_BOTH                3 
 
// Cell data mask 
#define GVIF_TEXT               LVIF_TEXT 
#define GVIF_IMAGE              LVIF_IMAGE 
#define GVIF_PARAM              LVIF_PARAM 
#define GVIF_STATE              LVIF_STATE 
#define GVIF_BKCLR              (GVIF_STATE<<1) 
#define GVIF_FGCLR              (GVIF_STATE<<2) 
#define GVIF_FORMAT             (GVIF_STATE<<3) 
#define GVIF_FONT               (GVIF_STATE<<4) 
 
// Cell states 
#define GVIS_FOCUSED            0x0001 
#define GVIS_SELECTED           0x0002 
#define GVIS_DROPHILITED        0x0004 
#define GVIS_READONLY           0x0008 
#define GVIS_FIXED              0x0010  // not yet used 
#define GVIS_MODIFIED           0x0020 
 
// Cell Searching options 
#define GVNI_FOCUSED            0x0001 
#define GVNI_SELECTED           0x0002 
#define GVNI_DROPHILITED        0x0004 
#define GVNI_READONLY           0x0008 
#define GVNI_FIXED              0x0010  // not yet used 
#define GVNI_MODIFIED           0x0020 
 
#define GVNI_ABOVE              LVNI_ABOVE 
#define GVNI_BELOW              LVNI_BELOW 
#define GVNI_TOLEFT             LVNI_TOLEFT 
#define GVNI_TORIGHT            LVNI_TORIGHT 
#define GVNI_ALL                (LVNI_BELOW|LVNI_TORIGHT|LVNI_TOLEFT) 
#define GVNI_AREA               (LVNI_BELOW|LVNI_TORIGHT) 
 
// Hit test values (not yet implemented) 
#define GVHT_DATA               0x0000 
#define GVHT_TOPLEFT            0x0001 
#define GVHT_COLHDR             0x0002 
#define GVHT_ROWHDR             0x0004 
#define GVHT_COLSIZER           0x0008 
#define GVHT_ROWSIZER           0x0010 
#define GVHT_LEFT               0x0020 
#define GVHT_RIGHT              0x0040 
#define GVHT_ABOVE              0x0080 
#define GVHT_BELOW              0x0100 
 
typedef struct tagNM_GRIDVIEW {  
    NMHDR hdr;  
    int   iRow;  
    int   iColumn;  
} NM_GRIDVIEW; 
 
typedef struct tagGV_DISPINFO {  
    NMHDR   hdr;  
    GV_ITEM item;  
} GV_DISPINFO; 
 
// Messages sent to the grid's parent (More will be added in future) 
#define	GVN_BEGINDRAG           LVN_BEGINDRAG        // LVN_FIRST-9 
#define	GVN_BEGINLABELEDIT      LVN_BEGINLABELEDIT   // LVN_FIRST-5 
#define	GVN_BEGINRDRAG          LVN_BEGINRDRAG 
#define GVN_COLUMNCLICK         LVN_COLUMNCLICK 
#define	GVN_DELETEITEM          LVN_DELETEITEM 
#define GVN_ENDLABELEDIT        LVN_ENDLABELEDIT     // LVN_FIRST-6 
#define GVN_SELCHANGING         LVN_ITEMCHANGING  
#define GVN_SELCHANGED          LVN_ITEMCHANGED 
 
 
 
// Each cell contains one of these. Fields "row" and "column" are not stored since we 
// will usually have acces to them in other ways, and they are an extra 8 bytes per 
// cell that is probably unnecessary. 
 
class CGridCell : public CObject 
{ 
public: 
	BOOL m_bSkipV,m_bSkipH;//前一个表明去掉单元格的垂直线段,后一个表明去掉单元格的水平线段 
    BOOL m_bHide;//单元格是否被合并(需要隐藏) 
	BOOL m_bNoEdit; 
	int m_numHhide;//水平需要隐藏的单元格;只针对TOPLEFT赋值.即列数 
	int m_numVhide;//垂直需要隐藏的单元格;只针对TOPLEFT赋值,即行数 
	int m_TopleftRow,m_TopleftCol;//被隐藏的单元格需要输入最左上的行和列值 
 
	CGridCell()  
    { 
        state = 0; 
        nFormat = 0; 
        szText.Empty(); 
        iImage = -1; 
		crBkClr = CLR_DEFAULT; 
		crFgClr = CLR_DEFAULT; 
        lParam = 0; 
       //for combine,do you want remove it? 
		m_bSkipV=FALSE; 
		m_bSkipH=FALSE; 
		m_bHide=FALSE; 
		m_bNoEdit=FALSE; 
		m_numHhide=0; 
		m_numVhide=0; 
        m_TopleftRow=0; 
		m_TopleftCol=0; 
	  //above added for combine ; 
    } 
 
    UINT     state;       // Cell state (selected/focus etc) 
    UINT     nFormat;     // Cell format 
    CString  szText;      // Cell text (or binary data if you wish...) 
    int      iImage;      // Index of the list view item抯 icon  
    COLORREF crBkClr;     // Background colour (or CLR_DEFAULT) 
    COLORREF crFgClr;     // Forground colour (or CLR_DEFAULT) 
    LOGFONT  lfFont;      // Cell font 
    LPARAM   lParam;      // 32-bit value to associate with item 
};  
 
 
// storage typedef for each row in the grid 
typedef CTypedPtrArray GRID_ROW; 
 
// DDX_GridControl is used where a DDX_Control call is needed. In some strange 
// situations the usual DDX_Control does not result in CGridCtrl::SubclassWindow 
// or CGridCtrl::PreSubclassWindow being called. Using this version calls  
// CGridCtrl::SubclassWindow directly - ensuring that cell metrics are set properly 
class CGridCtrl; 
void AFXAPI DDX_GridControl(CDataExchange* pDX, int nIDC, CGridCtrl& rControl); 
 
///////////////////////////////////////////////////////////////////////////// 
// CGridCtrl window 
 
class CGridCtrl : public CWnd 
{ 
    DECLARE_DYNCREATE(CGridCtrl) 
 
// Construction 
public: 
    CGridCtrl(int nRows = 0, int nCols = 0, int nFixedRows = 0, int nFixedCols = 0); 
 
    BOOL Create(const RECT& rect, CWnd* parent, UINT nID, 
                DWORD dwStyle = WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE); 
    BOOL SubclassWindow(HWND hWnd); 
 
// Attributes 
public: 
    int  GetRowCount() const                    { return m_nRows; } 
    int  GetColumnCount() const                 { return m_nCols; } 
    int  GetFixedRowCount() const               { return m_nFixedRows; } 
    int  GetFixedColumnCount() const            { return m_nFixedCols; } 
    BOOL SetRowCount(int nRows = 15); 
    BOOL SetColumnCount(int nCols = 15); 
    BOOL SetFixedRowCount(int nFixedRows = 1); 
    BOOL SetFixedColumnCount(int nFixedCols = 1); 
 
    int  GetRowHeight(int nRow) const; 
    BOOL SetRowHeight(int row, int height); 
    int  GetColumnWidth(int nCol) const; 
    BOOL SetColumnWidth(int col, int width); 
 
    BOOL GetCellOrigin(int nRow, int nCol, LPPOINT p) const; 
    BOOL GetCellOrigin(const CCellID& cell, LPPOINT p) const; 
    BOOL GetCellRect(int nRow, int nCol, LPRECT pRect) const; 
    BOOL GetCellRect(const CCellID& cell, LPRECT pRect) const; 
 
    BOOL GetTextRect(const CCellID& cell, LPRECT pRect); 
    BOOL GetTextRect(int nRow, int nCol, LPRECT pRect); 
 
    int  GetFixedRowHeight() const; 
    int  GetFixedColumnWidth() const; 
    long GetVirtualWidth() const; 
    long GetVirtualHeight() const; 
 
    void     SetTextColor(COLORREF clr)           { m_crTextColour = clr;             } 
    COLORREF GetTextColor() const                 { return m_crTextColour;            } 
    void     SetTextBkColor(COLORREF clr)         { m_crTextBkColour = clr;           } 
    COLORREF GetTextBkColor() const               { return m_crTextBkColour;          } 
    void     SetBkColor(COLORREF clr)             { m_crBkColour = clr;               } 
    COLORREF GetBkColor() const                   { return m_crBkColour;              } 
    void     SetFixedTextColor(COLORREF clr)      { m_crFixedTextColour = clr;        } 
    COLORREF GetFixedTextColor() const            { return m_crFixedTextColour;       } 
    void     SetFixedBkColor(COLORREF clr)        { m_crFixedBkColour = clr;          } 
    COLORREF GetFixedBkColor() const              { return m_crFixedBkColour;         }  
    void     SetGridColor(COLORREF clr)           { m_crGridColour = clr;             } 
    COLORREF GetGridColor() const                 { return m_crGridColour;            } 
 
    int GetSelectedCount() const                  { return m_SelectedCellMap.GetCount(); } 
 
    CCellID GetFocusCell() const                  { return m_idCurrentCell;           } 
 
    void SetImageList(CImageList* pList)          { m_pImageList = pList;             } 
    CImageList* GetImageList() const              { return m_pImageList;              } 
 
    void SetGridLines(int nWhichLines = GVL_BOTH) { m_nGridLines = nWhichLines;  
                                                    if (::IsWindow(GetSafeHwnd())) Invalidate(); } 
    int  GetGridLines() const                     { return m_nGridLines;              } 
 
    void SetEditable(BOOL bEditable = TRUE)       { m_bEditable = bEditable;          } 
    BOOL IsEditable() const                       { return m_bEditable;               } 
    void SetListMode(BOOL bEnableListMode = TRUE) { m_bListMode = bEnableListMode;    } 
    BOOL GetListMode() const                      { return m_bListMode;               } 
    void SetSingleRowSelection(BOOL bSing = TRUE) { m_bSingleRowSelection = bSing;    } 
    BOOL GetSingleRowSelection()                  { return m_bSingleRowSelection;     } 
    void EnableSelection(BOOL bEnable = TRUE)     { ResetSelectedRange(); m_bEnableSelection = bEnable; ResetSelectedRange(); } 
    BOOL IsSelectable() const                     { return m_bEnableSelection;        } 
    void EnableDragAndDrop(BOOL bAllow = TRUE)    { m_bAllowDragAndDrop = bAllow;     } 
    BOOL GetDragAndDrop() const                   { return m_bAllowDragAndDrop;       } 
    void SetRowResize(BOOL bResize = TRUE)        { m_bAllowRowResize = bResize;      } 
    BOOL GetRowResize() const                     { return m_bAllowRowResize;         } 
    void SetColumnResize(BOOL bResize = TRUE)     { m_bAllowColumnResize = bResize;   } 
    BOOL GetColumnResize() const                  { return m_bAllowColumnResize;      } 
    void SetHeaderSort(BOOL bSortOnClick = TRUE)  { m_bSortOnClick = bSortOnClick;    } 
    BOOL GetHeaderSort() const                    { return m_bSortOnClick;            } 
    void SetHandleTabKey(BOOL bHandleTab = TRUE)  { m_bHandleTabKey = bHandleTab;     } 
    BOOL GetHandleTabKey() const                  { return m_bHandleTabKey;           } 
    void SetDoubleBuffering(BOOL bBuffer = TRUE)  { m_bDoubleBuffer = bBuffer;        } 
    BOOL GetDoubleBuffering() const               { return m_bDoubleBuffer;           } 
    void EnableTitleTips(BOOL bEnable = TRUE)     { m_bTitleTips = bEnable;           } 
    BOOL GetTitleTips()                           { return m_bTitleTips;              } 
 
    void SetModified(BOOL bModified = TRUE, int nRow = -1, int nCol = -1); 
    BOOL GetModified(int nRow = -1, int nCol = -1); 
    BOOL IsCellFixed(int nRow, int nCol); 
 
    BOOL   SetItem(const GV_ITEM* pItem); 
    BOOL   GetItem(GV_ITEM* pItem); 
    BOOL   SetItemText(int nRow, int nCol, LPCTSTR str); 
    virtual CString GetItemText(int nRow, int nCol); 
    BOOL   SetItemData(int nRow, int nCol, LPARAM lParam); 
    LPARAM GetItemData(int nRow, int nCol) const; 
    BOOL   SetItemImage(int nRow, int nCol, int iImage); 
    int    GetItemImage(int nRow, int nCol) const; 
    BOOL   SetItemState(int nRow, int nCol, UINT state); 
    UINT   GetItemState(int nRow, int nCol) const; 
    BOOL   SetItemFormat(int nRow, int nCol, UINT nFormat); 
    UINT   GetItemFormat(int nRow, int nCol) const; 
	BOOL   SetItemBkColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT); 
	COLORREF GetItemBkColour(int nRow, int nCol) const; 
	BOOL   SetItemFgColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT); 
	COLORREF GetItemFgColour(int nRow, int nCol) const; 
	BOOL SetItemFont(int nRow, int nCol, LOGFONT* lf); 
	LOGFONT* GetItemFont(int nRow, int nCol); 
 
// Operations 
public: 
    int  InsertColumn(LPCTSTR strHeading, UINT nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE, 
                      int nColumn = -1); 
    int  InsertRow(LPCTSTR strHeading, int nRow = -1); 
    BOOL DeleteColumn(int nColumn); 
    BOOL DeleteRow(int nRow); 
    BOOL DeleteNonFixedRows(); 
    BOOL DeleteAllItems(); 
 
    BOOL AutoSizeRow(int nRow); 
    BOOL AutoSizeColumn(int nCol); 
    void AutoSizeRows(); 
    void AutoSizeColumns(); 
    void AutoSize(); 
    void ExpandColumnsToFit(); 
    void ExpandRowsToFit(); 
    void ExpandToFit(); 
 
    CSize GetTextExtent(LPCTSTR str, BOOL bUseSelectedFont = TRUE); 
    void EnsureVisible(CCellID &cell)       { EnsureVisible(cell.row, cell.col); } 
    void EnsureVisible(int nRow, int nCol); 
    BOOL IsCellVisible(int nRow, int nCol) const; 
    BOOL IsCellVisible(CCellID cell) const; 
    BOOL IsCellEditable(int nRow, int nCol) const; 
    BOOL IsCellEditable(CCellID &cell) const; 
 
    // SetRedraw stops/starts redraws on things like changing the # rows/columns 
    // and autosizing, but not for user-intervention such as resizes 
    void SetRedraw(BOOL bAllowDraw, BOOL bResetScrollBars = FALSE); 
    BOOL RedrawCell(int nRow, int nCol, CDC* pDC = NULL); 
    BOOL RedrawCell(const CCellID& cell, CDC* pDC = NULL); 
    BOOL RedrawRow(int row); 
    BOOL RedrawColumn(int col); 
 
#if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING) 
    void Print();  
#endif 
#ifndef _WIN32_WCE 
    BOOL Save(LPCTSTR filename); 
    BOOL Load(LPCTSTR filename); 
#endif 
 
    CCellRange GetCellRange() const; 
    CCellRange GetSelectedCellRange() const; 
    void SetSelectedRange(const CCellRange& Range, BOOL bForceRepaint = FALSE); 
    void SetSelectedRange(int nMinRow, int nMinCol, int nMaxRow, int nMaxCol, 
                          BOOL bForceRepaint = FALSE); 
    BOOL IsValid(int nRow, int nCol) const; 
    BOOL IsValid(const CCellID& cell) const; 
    BOOL IsValid(const CCellRange& range) const; 
 
#ifndef GRIDCONTROL_NO_CLIPBOARD 
    // Clipboard and cut n' paste operations 
    virtual void CutSelectedText(); 
    virtual COleDataSource* CopyTextFromGrid(); 
    virtual BOOL PasteTextToGrid(CCellID cell, COleDataObject* pDataObject); 
#endif 
 
#ifndef GRIDCONTROL_NO_DRAGDROP 
    void OnBeginDrag(); 
    DROPEFFECT OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point); 
    DROPEFFECT OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point); 
    void OnDragLeave(); 
    BOOL OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point); 
#endif 
 
#ifndef GRIDCONTROL_NO_CLIPBOARD 
    virtual void OnEditCut(); 
    virtual void OnEditCopy(); 
    virtual void OnEditPaste(); 
#endif 
    virtual void OnEditSelectAll(); 
 
    CCellID GetNextItem(CCellID& cell, int nFlags) const; 
 
    BOOL SortTextItems(int nCol, BOOL bAscending); 
    BOOL SortItems(PFNLVCOMPARE pfnCompare, int nCol, BOOL bAscending, LPARAM data = 0); 
 
// Overrides 
    // ClassWizard generated virtual function overrides 
    //{{AFX_VIRTUAL(CGridCtrl) 
    protected: 
    virtual void PreSubclassWindow(); 
    //}}AFX_VIRTUAL 
#if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING) 
public: 
    virtual void OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo); 
    virtual void OnPrint(CDC *pDC, CPrintInfo *pInfo); 
    virtual void OnEndPrinting(CDC *pDC, CPrintInfo *pInfo); 
#endif 
 
// Implementation 
public: 
	void SetFixedCellCombine(int nRow,int nCol, int  xNum,int yNum); 
	void UndoCellCombine(int nRow, int nCol); 
	void SetCellCombine(int nRow,int nCol,int  xNum,  int  yNum,BOOL bNoEdit=FALSE); 
	CGridCell* GetCellP(int nRow, int nCol); 
    virtual ~CGridCtrl(); 
 
protected: 
    BOOL RegisterWindowClass(); 
    LRESULT SendMessageToParent(int nRow, int nCol, int nMessage); 
 
    BOOL InvalidateCellRect(const CCellID& cell); 
    BOOL InvalidateCellRect(const CCellRange& cellRange); 
    void EraseBkgnd(CDC* pDC); 
 
    BOOL GetCellRangeRect(const CCellRange& cellRange, LPRECT lpRect) const; 
 
    CGridCell* GetCell(int nRow, int nCol) const; 
    BOOL SetCell(int nRow, int nCol, CGridCell* pCell); 
 
    int  SetMouseMode(int nMode) { int nOldMode = m_MouseMode; m_MouseMode = nMode; return nOldMode; } 
    int  GetMouseMode() const    { return m_MouseMode; } 
 
    BOOL MouseOverRowResizeArea(CPoint& point) const; 
    BOOL MouseOverColumnResizeArea(CPoint& point) const; 
 
    CCellID GetCellFromPt(CPoint point, BOOL bAllowFixedCellCheck = TRUE) const; 
    CCellID GetTopleftNonFixedCell() const; 
    CCellRange GetUnobstructedNonFixedCellRange() const; 
    CCellRange GetVisibleNonFixedCellRange(LPRECT pRect = NULL) const; 
 
    CCellID SetFocusCell(CCellID cell); 
    CCellID SetFocusCell(int nRow, int nCol); 
 
    void ResetSelectedRange(); 
    void ResetScrollBars(); 
    int  GetScrollPos32(int nBar, BOOL bGetTrackPos = FALSE); 
    BOOL SetScrollPos32(int nBar, int nPos, BOOL bRedraw = TRUE); 
 
    BOOL SortTextItems(int nCol, BOOL bAscending, int low, int high); 
    BOOL SortItems(PFNLVCOMPARE pfnCompare, int nCol, BOOL bAscending, LPARAM data,  
                   int low, int high); 
 
// Overrrides 
protected: 
    // Printing     
#if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING) 
    virtual void PrintColumnHeadings(CDC *pDC, CPrintInfo *pInfo); 
    virtual void PrintHeader(CDC *pDC, CPrintInfo *pInfo); 
    virtual void PrintFooter(CDC *pDC, CPrintInfo *pInfo); 
#endif 
 
#ifndef GRIDCONTROL_NO_DRAGDROP 
    // Drag n' drop 
    virtual CImageList* CreateDragImage(CPoint *pHotSpot);    // no longer necessary 
#endif 
 
    // Mouse Clicks 
    virtual void  OnFixedColumnClick(CCellID& cell); 
    virtual void  OnFixedRowClick(CCellID& cell); 
 
    // Editing 
    virtual CSize GetCellExtent(int nRow, int nCol, CDC* pDC); 
    virtual void  OnEndEditCell(int nRow, int nCol, CString str); 
    virtual void  OnEditCell(int nRow, int nCol, UINT nChar); 
    virtual void  CreateInPlaceEditControl(CRect& rect, DWORD dwStyle, UINT nID, 
                                           int nRow, int nCol, 
                                           LPCTSTR szText, int nChar); 
 
    // Drawing 
    virtual void  OnDraw(CDC* pDC); 
    virtual BOOL  DrawFixedCell(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBk=FALSE); 
    virtual BOOL  DrawCell(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBk=FALSE); 
 
    // GridCell Creation and Cleanup 
    virtual CGridCell* CreateCell(int nRow, int nCol); 
    virtual void EmptyCell(CGridCell* pCell, int nRow, int nCol); 
 
// Attributes 
protected: 
    // General attributes 
    COLORREF    m_crTextColour, m_crTextBkColour, m_crBkColour,   // Grid colours 
                m_crFixedTextColour, m_crFixedBkColour, m_crGridColour; 
    COLORREF    m_crWindowText, m_crWindowColour, m_cr3DFace,     // System colours 
                m_crShadow;     
 
    int         m_nGridLines; 
    BOOL        m_bEditable; 
    BOOL        m_bModified; 
    BOOL        m_bAllowDragAndDrop; 
    BOOL        m_bListMode; 
    BOOL        m_bSingleRowSelection; 
    BOOL        m_bAllowDraw; 
    BOOL        m_bEnableSelection; 
    BOOL        m_bSortOnClick; 
    BOOL        m_bHandleTabKey; 
    BOOL        m_bDoubleBuffer; 
    BOOL        m_bTitleTips; 
 
    // Cell size details 
    int         m_nRows, m_nFixedRows, m_nCols, m_nFixedCols; 
    CUIntArray  m_arRowHeights, m_arColWidths; 
    int         m_nMargin; 
    int         m_nDefCellWidth, m_nDefCellHeight; 
    int         m_nVScrollMax, m_nHScrollMax; 
 
    // Fonts and images 
    LOGFONT     m_Logfont; 
    CFont       m_PrinterFont,  // for the printer 
                m_Font;         // for the grid 
    CImageList* m_pImageList; 
 
    // Cell data 
    CTypedPtrArray m_RowData; 
 
    // Mouse operations such as cell selection 
    int         m_MouseMode; 
    CPoint      m_LeftClickDownPoint, m_LastMousePoint; 
    CCellID     m_LeftClickDownCell, m_SelectionStartCell; 
    CCellID     m_idCurrentCell; 
    int         m_nTimerID; 
    int         m_nTimerInterval; 
    int         m_nResizeCaptureRange; 
    BOOL        m_bAllowRowResize, m_bAllowColumnResize; 
    int         m_nRowsPerWheelNotch; 
    CMap m_SelectedCellMap, m_PrevSelectedCellMap; 
 
#ifndef GRIDCONTROL_NO_TITLETIPS 
    CTitleTip   m_TitleTip;             // Title tips for cells 
#endif 
 
    // Drag and drop 
	BOOL		m_bMustUninitOLE;		// Do we need to uninitialise OLE? 
    CCellID     m_LastDragOverCell; 
#ifndef GRIDCONTROL_NO_DRAGDROP 
    CGridDropTarget m_DropTarget;       // OLE Drop target for the grid 
#endif 
 
    // Printing information 
    CSize       m_CharSize; 
    int         m_nPageHeight; 
    CSize       m_LogicalPageSize,      // Page size in gridctrl units. 
                m_PaperSize;            // Page size in device units. 
 
    // sorting 
    int         m_bAscending; 
    int         m_SortColumn; 
 
protected: 
    void SelectAllCells(); 
    void SelectColumns(CCellID currentCell); 
    void SelectRows(CCellID currentCell); 
    void SelectCells(CCellID currentCell); 
    void OnSelecting(const CCellID& currentCell); 
 
    // Generated message map functions 
    //{{AFX_MSG(CGridCtrl) 
    afx_msg void OnPaint(); 
    afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); 
    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); 
    afx_msg void OnSize(UINT nType, int cx, int cy); 
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point); 
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point); 
    afx_msg void OnMouseMove(UINT nFlags, CPoint point); 
    afx_msg void OnTimer(UINT nIDEvent); 
    afx_msg UINT OnGetDlgCode(); 
    afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); 
    afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); 
    afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); 
    afx_msg BOOL OnEraseBkgnd(CDC* pDC); 
    afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); 
    afx_msg void OnSysColorChange(); 
    afx_msg void OnCaptureChanged(CWnd *pWnd); 
	afx_msg void OnUpdateEditCopy(CCmdUI* pCmdUI); 
	afx_msg void OnUpdateEditCut(CCmdUI* pCmdUI); 
	afx_msg void OnUpdateEditPaste(CCmdUI* pCmdUI); 
	afx_msg void OnUpdateEditSelectAll(CCmdUI* pCmdUI); 
	//}}AFX_MSG 
#if (_MFC_VER >= 0x0421) || (_WIN32_WCE >= 210) 
    afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection); 
#endif 
#if !defined(_WIN32_WCE) && (_MFC_VER >= 0x0421) 
    afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); 
#endif 
    afx_msg LRESULT OnSetFont(WPARAM hFont, LPARAM lParam); 
    afx_msg LRESULT OnGetFont(WPARAM hFont, LPARAM lParam); 
    afx_msg void OnEndInPlaceEdit(NMHDR* pNMHDR, LRESULT* pResult); 
    DECLARE_MESSAGE_MAP() 
 
    enum eMouseModes { MOUSE_NOTHING, MOUSE_SELECT_ALL, MOUSE_SELECT_COL, MOUSE_SELECT_ROW, 
                       MOUSE_SELECT_CELLS, MOUSE_SCROLLING_CELLS, 
                       MOUSE_OVER_ROW_DIVIDE, MOUSE_SIZING_ROW,  
                       MOUSE_OVER_COL_DIVIDE, MOUSE_SIZING_COL, 
                       MOUSE_PREPARE_EDIT, 
#ifndef GRIDCONTROL_NO_DRAGDROP 
                       MOUSE_PREPARE_DRAG, MOUSE_DRAGGING 
#endif 
    }; 
}; 
 
inline CGridCell* CGridCtrl::GetCell(int nRow, int nCol) const 
{ 
    if (nRow < 0 || nRow >= m_nRows || nCol < 0 || nCol >= m_nCols) return NULL; 
 
    GRID_ROW* pRow = m_RowData[nRow]; 
    if (!pRow) return NULL; 
    return pRow->GetAt(nCol); 
} 
 
inline BOOL CGridCtrl::SetCell(int nRow, int nCol, CGridCell* pCell) 
{ 
    if (nRow < 0 || nRow >= m_nRows || nCol < 0 || nCol >= m_nCols) return FALSE; 
 
    GRID_ROW* pRow = m_RowData[nRow]; 
    if (!pRow) return FALSE; 
 
    pRow->SetAt(nCol, pCell); 
    return TRUE; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
 
//{{AFX_INSERT_LOCATION}} 
// Microsoft Developer Studio will insert additional declarations immediately before the previous line. 
 
#endif // !defined(AFX_GRIDCTRL_H__519FA702_722C_11D1_ABBA_00A0243D1382__INCLUDED_)