1. 程式人生 > >GridCtrl成員函式、變數詳解

GridCtrl成員函式、變數詳解

Grid的基本類是源於CWnd的CgridCtrl。為了使用它,你可以使用微軟的VC++的對話方塊編輯器,把一個普通的控制元件放在對話方塊上,並且輸 入"MFCGridCtrl"(不包括引號)作為類名。Grid的子類使用DDX機制(可以通過ClassWizard來進行預設設定),使用 DDX_GridControl函式代替DDX_Control(可以通過手動設定ClassWizard的輸入來實現)。這些保證你的控制元件作為一個註冊 物件而不會產生一些莫名其妙的WIN95問題。
你也可以選擇使用CGridCtrl::Create
CGridCtrl grid;
grid.Create(rect, pParentWnd, nID);
其中的rect是大小,pParentWnd是父視窗,nID是標誌符。列和行的數目
int GetRowCount() const 返回行(包括固定行)的數目
int GetColumnCount() const 返回列(包括固定列)的數目
int GetFixedRowCount() const 返回固定行的數目
int GetFixedColumnCount() const 返回固定行的數目
BOOL SetRowCount(int nRows) 設定行的數目(包括固定行),如果成功,返回TRUE
BOOL SetColumnCount(int nCols) 設定列的數目(包括固定列),如果成功,返回TRUE
BOOL SetFixedRowCount(int nFixedRows = 1) 設定固定行的數目,如果成功,返回TRUE
BOOL SetFixedColumnCount(int nFixedCols = 1) 設定固定列的數目,如果成功,返回TRUE大小和位置函式
int GetRowHeight(int nRow) const 獲取由nRow指定行的高度
BOOL SetRowHeight(int row, int height) 設定由row指定行的高度為height

int GetColumnWidth(int nCol) const 獲取由nCol指定列的寬度
BOOL SetColumnWidth(int col, int width) 設定由col指定列的寬度為width
int GetFixedRowHeight() const 獲取固定行的高度
int GetFixedColumnWidth() const 獲取固定列的高度
long GetVirtualHeight() const 獲取所有行的合併高度
long GetVirtualWidth() const 獲取所有列的合併寬度
BOOL GetCellOrigin(int nRow, int nCol, LPPOINT p) 取出單元格(nRow,nCol)的左上角點,成功返回TRUE(單元格必須是可見的)
BOOL GetCellOrigin(const CCellID& cell, LPPOINT p) 獲取給定單元格的左上角點,成功則返回TRUE,也可以參照 CCellID.
BOOL GetCellRect(int nRow, int nCol, LPRECT pRect) 獲取給定單元格的邊框,成功則返回TRUE(單元格必須是可見的)
BOOL GetCellRect(const CCellID& cell, LPRECT pRect) 獲取給定單元格的邊框成功則返回TRUE(單元格必須是可見的) 也可以 參照CCellID.
BOOL GetTextRect(int nRow, int nCol, LPRECT pRect)t 獲取給定單元格中的文字框,成功則返回TRUE(單元格必須是可見的)
BOOL GetTextRect(const CCellID& cell, LPRECT pRect) 獲取給定單元格中的文字框,成功則返回TRUE(單元格必須是可見的)也可以參照 CCellID.
BOOL GetTextExtent(int nRow, int nCol, LPCTSTR str) 獲取給定單元格中的指定的文字內容的邊框,成功則返回TRUE
BOOL GetCellTextExtent(int nRow, int nCol) 獲取給定單元格中的文字框,成功則返回TRUE虛擬模式
虛擬模式允許Grid在不儲存資料的情況下,能夠顯示大量資料。在虛擬模式下,不用產生單元格,也不用儲存資料,列寬和行高除外。
由於Grid本身並不儲存資料,所以它必須有一些方法讓其它程式幫助它儲存這些資料。這些是通過Grid本身的回收函式或者其父類的一個控制代碼GVN_GETDISPINFO的申明來實現的。
void SetVirtualMode(BOOL bVirtual) 設定Grid是否使用虛擬模式
BOOL GetVirtualMode() 當使用虛擬模式時返回TRUE
void SetCallbackFunc(GRIDCALLBACK pCallback, LPARAM lParam) 當Grid為虛擬模式時,設定回撥函式
GRIDCALLBACK GetCallbackFunc() 當Grid為虛擬模式時,返回回撥函式
如果沒有指定回撥函式,Grid就會向其父視窗傳送一個GVN_GETDISPINFO資訊,這個申明部分如同GV_DISPINFO結構,GV_DISPINFO機構體就象下面所示:
typedef struct tagGV_DISPINFO {
NMHDR hdr;
GV_ITEM item;
} GV_DISPINFO;
顯而易見的是,它有一個很好的暗示就是允許Grid所需要的資料進入快取記憶體。因此,在顯示某一頁單元格內容之前,Grid首先會發送一個 GVN_ODCACHEHINT資訊,結構體GV_CACHEHINT會作為訊息的一部分,其結構如下:typedef struct tagGV_CACHEHINT {
NMHDR hdr;
CCellRange range;
} GV_CACHEHINT;
下面有一個處理這個訊息的例子:
//處理這個訊息的是對話方塊的一個成員變數m_Gri
BOOL CGridCtrlDemoDlg::OnNotify(WPARAM wParam, LPARAM lParam,
LRESULT* pResult)
{
if (wParam == (WPARAM)m_Grid.GetDlgCtrlID())
{
*pResult = 1;
GV_DISPINFO *pDispInfo = (GV_DISPINFO*)lParam;
if (GVN_GETDISPINFO == pDispInfo->hdr.code)
{
//TRACE2("Getting Display info for cell %d,%d\n",
pDispInfo->item.row, pDispInfo->item.col);
pDispInfo->item.strText.Format(_T("Message %d,%d"),
pDispInfo->item.row, pDispInfo->item.col);
return TRUE;
}
else if (GVN_ODCACHEHINT == pDispInfo->hdr.code)
{
GV_CACHEHINT *pCacheHint = (GV_CACHEHINT*)pDispInfo;
TRACE(_T("Cache hint received for cell range %d,%d - %d,%d\n"),
pCacheHint->range.GetMinRow(),
pCacheHint->range.GetMinCol(),
pCacheHint->range.GetMaxRow(),
pCacheHint->range.GetMaxCol());
}
}return CDialog::OnNotify(wParam, lParam, pResult);
}
也可以使用SetCallbackFunc來設定回收函式代替傳送GVN_GETDISPINFO訊息,而且,Grid可以直接呼叫這個回收函式,當然了,即使呼叫了回收函式,GVN_ODCACHEHINT訊息還會照常傳送。
回收函式應當是如下形式:
BOOL CALLBACK CallbackFunction(GV_DISPINFO * pDispInfo, LPARAM lParam);
例如:
BOOL CALLBACK CGridCtrlDemoDlg::GridCallback(GV_DISPINFO *pDispInfo,
LPARAM /*lParam*/)
{
pDispInfo->item.strText.Format(_T("Callback %d,%d"),
pDispInfo->item.row, pDispInfo->item.col);
return TRUE;
}
當呼叫SetCallbackFunc的時候,你可以定義一個LPARAM,這樣當每次呼叫回收函式時可以將這個值傳遞給這個回收函式。注意這個回收函式必須是一個靜態或全域性函式。

總體的外觀和特徵
void SetImageList(CImageList* pList) 設定Grid的當前圖形列表,它拷貝的只是列表的指標而非列表本身。
CImageList* GetImageList() 取出Grid當前圖形列表
void SetGridLines(int nWhichLines = GVL_BOTH) 設定哪些(如果有的話)線條不可見,從 here 可以找到一些可能的取值。
int GetGridLines() 取出那些(如果有的話)不可見線條,從 here 可以找到一些可能的返回值。
void SetEditable(BOOL bEditable = TRUE) 設定Grid是否可以編輯。
BOOL IsEditable() 判斷Grid是否可編輯。.
void SetListMode(BOOL bEnableListMode = TRUE) 將Grid設定成(或不是)排序模式,當Grid處於排序模式時,將啟動所有行選,並且這時如果點選列表頭時,將會對Grid按行進行排序。
BOOL GetListMode() 判斷Grid是否處於排序模式。
void SetSingleRowSelection(BOOL bSing = TRUE) 將G rid設定成(或不是)單行選擇模式,這種模式只有在排序模式下有效。 當處在這種模式下,每次只能選擇一行,所以整個Grid表現看起來就好象是一個多列的列表框。
BOOL GetSingleRowSelection() 判斷Grid是否處於單行選擇模式。
void SetSingleColSelection(BOOL bSing = TRUE) 將Grid設定成(或不是)單列選擇模式,在這種模式下,每次只能選擇一列。
BOOL GetSingleColSelection() 判斷Grid是否處於單列選擇模式。
void EnableSelection(BOOL bEnable = TRUE) 設定Grid的單元格是否可選。
BOOL IsSelectable() 判斷Grid的單元格是否可選。
void SetFixedRowSelection(BOOL bSelect) 設定當點選固定行時,是否選擇其旁邊的單元格。
BOOL GetFixedRowSelection() 判斷當點選固定行時,是否選擇其旁邊的單元格。
void SetFixedColumnSelection(BOOL bSelect) 設定當點選固定列時,是否選擇其下面的單元格
BOOL GetFixedColumnSelection() 判斷當點選固定列時,是否選擇其下面的單元格
void EnableDragAndDrop(BOOL bAllow = TRUE) 設定是否開啟拖曳動作。
BOOL GetDragAndDrop() 判斷拖曳動作是否開啟。
void SetRowResize(BOOL bResize = TRUE) 設定是否可設定行的大小。
BOOL GetRowResize() 判斷是否可設定行的大小。
void SetColumnResize(BOOL bResize = TRUE) 設定是否可設定列的大小。
BOOL GetColumnResize() 判斷是否可設定列的大小。
void SetHandleTabKey(BOOL bHandleTab = TRUE) 設定是否啟用TAB鍵來移動選擇單元格
BOOL GetHandleTabKey() 判斷是否啟用TAB鍵來移動選擇單元格。
void SetDoubleBuffering(BOOL bBuffer = TRUE) 設定畫圖時是否使兩級緩衝(不支援閃爍)。
BOOL GetDoubleBuffering() 判斷畫圖時是否使用了兩級緩衝。
void EnableTitleTips(BOOL bEnable = TRUE) 設定是否使用標題提示
BOOL GetTitleTips() 判斷是否使用標題提示
void SetTrackFocusCell(BOOL bTrack) 設定同行/列中的固定單元格作為焦點單元格時是否高亮顯示並且使用凹陷邊緣。
BOOL GetTrackFocusCell() 判斷同行/列中的固定單元格作為焦點單元格時是否高亮顯示並且使用凹陷邊緣。
void SetFrameFocusCell(BOOL bFrame) 設定焦點單元格是否高亮顯示並且加上外邊框。
BOOL GetFrameFocusCell() 判斷是否對焦點單元格高亮顯示並且加上外邊框。
void SetAutoSizeStyle(int nStyle = GVS_BOTH) 設定單元格如何自動調整大小GVS_BOTH = 固定和非固定單元格都可以自動調整; GVS_HEADER = 僅固定單元格可以; GVS_DATA = 僅非固定單元格可以

int GetAutoSizeStyle() 獲取自動排序的執行模式。
void EnableHiddenColUnhide(BOOL bEnable = TRUE) 設定當用戶調整列的寬度時隱藏列(寬度為0)是否顯現出來。
BOOL GetHiddenColUnhide() 判斷當用戶調整列的寬度時隱藏列(寬度為0)是否顯現出來。
void EnableHiddenRowUnhide(BOOL bEnable = TRUE) 設定當用戶調整行的高度時隱藏行(高度為0)是否顯現出來。
BOOL GetHiddenRowUnhide() 判斷當用戶調整行的高度時隱藏行(高度為0)是否顯現出來。
void EnableColumnHide(BOOL bEnable = TRUE) 設定是否可以通過滑鼠將列的寬度壓縮為0。
BOOL GetColumnHide() 判斷是否可以通過滑鼠將列的寬度壓縮為0。
void EnableRowHide(BOOL bEnable = TRUE) 設定是否可以通過滑鼠將行的高度壓縮為0。
BOOL GetRowHide() 判斷是否可以通過滑鼠將行的高度壓縮為0。</P><P>顏色
void SetGridBkColor(COLORREF clr) 設定控制元件的背景顏色(固定和非固定單元格之外的區域)。
COLORREF GetGridBkColor() 獲取控制元件的背景顏色。
void SetGridLineColor(COLORREF clr) 設定網格線的顏色。
COLORREF GetGridLineColor() 獲取網格線的顏色。
COLORREF GetTitleTipBackClr() 獲取標題提示的背景顏色。
void SetTitleTipBackClr(COLORREF clr = CLR_DEFAULT) 設定標題提示的背景顏色。
COLORREF GetTitleTipTextClr() 獲取標題提示的文字顏色。
void SetTitleTipTextClr(COLORREF clr = CLR_DEFAULT) 設定標題提示的文字顏色。
不再支援如下的函數了。你應當使用GetDefaultCell來獲取預設單元格實現你所感興趣的單元格型別,然後就可以直接設定單元格的屬性了。如果給定單元格是預設設定值,那麼為匹配你的單元格型別,就得在預設的單元格實現中使用這些值。
void SetTextColor(COLORREF clr) 設定非固定單元格中的文字顏色。
COLORREF GetTextColor() 獲取非固定單元格中的文字顏色。
void SetTextBkColor(COLORREF clr) 設定非固定單元格的背景顏色。
COLORREF GetTextBkColor() 獲取非固定單元格的背景顏色。
void SetFixedTextColor(COLORREF clr) 設定固定單元格的文字顏色。
COLORREF GetFixedTextColor() 獲取固定單元格的文字顏色。
void SetFixedBkColor(COLORREF clr) 設定固定單元格的背景顏色。
COLORREF GetFixedBkColor() 獲取固定單元格的背景顏色。
void SetBkColor(COLORREF clr) 設定控制元件的背景顏色 (單元格之外的區域).
COLORREF GetBkColor() 獲取控制元件的背景顏色。
void SetGridColor(COLORREF clr) 設定網格線的顏色。.
COLORREF GetGridColor() 獲取網格線的顏色。.
也可以參照Individual Cell colour functions,它允許改變Grid中某一個單元格的顏色以不同於其它單元格。

普通的單元格資訊

CGridCellBase* GetDefaultCell(BOOL bFixedRow, BOOL bFixedCol) const 為要建立的單元格型別獲取一個預設的單元格實現的指標.

bFixedRow 和 bFixedCol 用來申明單元格是否固定(行、列、或者兩者) 或非固定. 使用它來定義Grid的預設屬性. 事實上Grid中的單元格在它們建立的時候就有了自己的預設屬性. 它們使用 GetDefaultCell查詢Grid的預設單元格屬性,並且用這些值來勾畫自己。.

CGridCellBase* GetCell(int nRow, int nCol) const 根據行/列來獲取相應的單元格 (或者不存在的時候返回NULL)
BOOL SetCellType(int nRow, int nCol, CRuntimeClass* pRuntimeClass); 定義響應單元格類的型別。
BOOL SetDefaultCellType(CRuntimeClass* pRuntimeClass); 為新的單元格設定預設屬性。
void SetModified(BOOL bModified = TRUE, int nRow = -1, int nCol = -1) 為單元格設定一個標誌符. 如果沒有指明某行或某列,將對整個Grid進行設定。
BOOL GetModified(int nRow = -1, int nCol = -1) 為單元格設定一個標誌符,如果沒有相應的單元格,就返回整個Grid的狀態。
BOOL IsCellFixed(int nRow, int nCol) 如果單元格固定就返回TRUE.
BOOL IsItemEditing(int nRow, int nCol) 如果單元格正處在編輯狀態就返回TRUE.
BOOL SetItem(const GV_ITEM* pItem) 用 GV_ITEM 結構體中的值來設定單元格的內容. 注意掩碼欄位中的值決定到底哪些值是真正改變了(比較 CListCtrl::SetItem).
BOOL GetItem(GV_ITEM* pItem) 從指定的單元格獲取其內容來填充 GV_ITEM 結構體. 注意掩碼欄位中的只將決定哪些值真正取回了 (比較CListCtrl::GetItem).
BOOL SetItemText(int nRow, int nCol, LPCTSTR str) 設定指定單元格的文字內容.成功則返回TRUE。
virtual CString GetItemText(int nRow, int nCol) 取出指定單元格的文字內容,為有利於擴充套件,這個函式設定成虛擬函式. 不要和LVN_GETDISPINFO訊息或字串共享弄混了。
BOOL SetItemData(int nRow, int nCol, LPARAM lParam) 為指定單元格設定Iparam欄位(使用者自定義的資料)。成功則返回TRUE,也可參考GV_ITEM.
LPARAM GetItemData(int nRow, int nCol) const 獲取指定單元格的Iparam欄位(使用者自定義的資料)。成功則返回TRUE,也可參考GV_ITEM.
BOOL SetItemImage(int nRow, int nCol, int iImage) 設定指定單元格的圖形索引,成功則返回TRUE,也可參考 GV_ITEM.
int GetItemImage(int nRow, int nCol) const 獲取指定單元格的圖形索引。
BOOL SetItemState(int nRow, int nCol, UINT state) 設定給定單元格的狀態.成功則返回TRUE,也可參考GV_ITEM.
UINT GetItemState(int nRow, int nCol) const 獲取指定單元格的狀態,也可參考 GV_ITEM.
BOOL SetItemFormat(int nRow, int nCol, UINT nFormat) 設定指定單元格的格式,成功則返回TRUE。 單元格的預設實現是使用 CDC::DrawText, 所以,任何的DT_*格式都可以使用. 也可參考 GV_ITEM.
UINT GetItemFormat(int nRow, int nCol) const 獲取給定單元格的格式(預設返回CDC::DrawText DT_*格式). 也可參考 GV_ITEM.
int GetSelectedCount() 獲取被選單元格的數量。.
CCellID GetFocusCell() 獲取焦點單元格,可參考 CCellID.
CCellID SetFocusCell(CCellID cell);

CCellID SetFocusCell(int nRow, int nCol); 設定焦點單元格。
BOOL SetItemBkColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT) 設定指定單元格的背景顏色,成功則返回TRUE,可參考 GV_ITEM.
COLORREF GetItemBkColour(int nRow, int nCol) const 獲取指定單元格的背景顏色,可參考 GV_ITEM.
BOOL SetItemFgColour(int nRow, int nCol, COLORREF cr = CLR_DEFAULT) 設定指定單元格的前景顏色,成功則返回TRUE,可參考 GV_ITEM.
COLORREF GetItemFgColour(int nRow, int nCol) const 獲取指定單元格的前景顏色,可參考 GV_ITEM.
BOOL SetItemFont(int nRow, int nCol, LOGFONT* lf) 設定指定單元格的字型,成功則返回TRUE,可參考GV_ITEM.
LOGFONT* GetItemFont(int nRow, int nCol) const 獲取指定單元格的字型,可參考 GV_ITEM.
BOOL IsItemEditing(int nRow, int nCol) 如果單元格處於編輯狀態,則返回TRUE.
void EnsureVisible(CCellID &cell) 確保指定單元格可見。.
BOOL IsCellVisible(CCellID &cell) constBOOL IsCellVisible(CCellID cell) const 如果單元格可見則返回TRUE.
BOOL IsCellEditable(CCellID &cell) constBOOL IsCellEditable(CCellID cell) const 如果單元格可編輯則返回TRUE.
BOOL IsCellSelected(CCellID &cell) constBOOL IsCellSelected(CCellID cell) const 如果單元格已選,則返回TRUE。
void EnsureVisible(int nRow, int nCol) 確保指定單元格可見.
BOOL IsCellFixed(int nRow, int nCol) 如果單元格是固定的,則返回TRUE。
int GetDefCellHeight() const 返回單元格的預設高度 (對於新建立的單元格)
void SetDefCellHeight(int nHeight) 設定預設單元格高度(對於新建立的單元格). 如果呼叫了SetFont就將被忽略
int GetDefCellWidth() const 返回單元格的預設寬度 (對於新建立的單元格)
void SetDefCellWidth(int nWidth) 設定預設單元格寬度(對於新建立的單元格). 如果呼叫了SetFont就將被忽略
int GetDefCellMargin() const Returns the default cell internal margin
void SetDefCellMargin(int nMargin) Sets the default cell internal margin.</P><P>操作
int InsertColumn(LPCTSTR strHeading, UINT nFormat, int nColumn = -1) 在nCol指定的地方插入一列,如果 nCol<0則在末尾插入一列. StrHeading就是列標題頭nFormat 是列的格式.返回插入列的位置.
int InsertRow(LPCTSTR strHeading, int nRow = -1) 在nRow處插入一行,如果nRow<0則在末尾插入一行. strHeading 是行標題頭. 此行的單元格的格式與其同列的第一行單元格格式相同. 返回插入行的位置.
BOOL DeleteColumn(int nColumn) 刪除"nColumn"指定的列,成功則返回TRUE.
BOOL DeleteRow(int nRow) 刪除"nRow"指定的行, 成功則返回TRUE.
BOOL DeleteAllitems() 刪除Grid中的所有行和內容.
BOOL DeleteNonFixedRows() 刪除所有非固定行
BOOL AutoSizeRow(int nRow, BOOL bResetScroll=TRUE) 自動調整行的大小與最大行一樣. 如果bResetScroll是 TRUE那麼滾動條也會被重置。
BOOL AutoSizeColumn(int nCol, UINT nAutoSizeStyle = GVS_DEFAULT, BOOL bResetScroll = TRUE) 自動調整列的大小與最大列一樣. NAutoSizeStyle設定了調整的方式(參考 AutoSizing options). 如果bResetScroll是TRUE那麼滾動條將會被重置.
void AutoSizeRows() 自動調整所有行的大小。
void AutoSizeColumns(UINT nAutoSizeStyle=GVS_DEFAULT) 自動調整所有列的大小. nAutoSizeStyle 設定了調整的方式(參考AutoSizing options)
void AutoSize(UINT nAutoSizeStyle = GVS_DEFAULT) 自動調整所有行和列的大小. nAutoSizeStyle設定了調整的方式(參考 AutoSizing options)
void ExpandColumnsToFit(BOOL bExpandFixed=TRUE) 為添滿Grid區域,擴大列寬.如果 bExpandFixed是TRUE固定列也會調整, 否則不受影響.
void ExpandLastColumn() 調整最後一列的寬度以添滿grid區域.
void ExpandRowsToFit(BOOL bExpandFixed=TRUE) 為添滿Grid區域,擴大行高. 如果 bExpandFixed是TRUE固定行也會調整, 否則不受影響.
void ExpandToFit(BOOL bExpandFixed = TRUE) 為添滿Grid區域,擴大行高和列寬. 如果 bExpandFixed是TRUE固定單元格也會調整, 否則不受影響.<
CSize GetTextExtent(int nRow, int nCol, LPCTSTR str) 獲取指定單元格中由str指定的文字大小。
CSize GetCellTextExtent(int nRow, int nCol) 獲取指定單元格的文字大小。
void SetRedraw(BOOL bAllowDraw, BOOL bResetScrollBars = FALSE) 在行或列數量改變或者自動調整大小的時候關閉/啟動重畫功能,但對使用者的動作如重新調整大小不起作用。

BOOL RedrawCell(int nRow, int nCol, CDC* pDC = NULL) 重畫指定單元格。如果提供了pDC則通過它來描畫。
BOOL RedrawCell(const CCellID& cell, CDC* pDC = NULL) 重畫指定單元格。如果提供了pDC則通過它來描畫。
BOOL RedrawRow(int row) 重畫指定行.
BOOL RedrawColumn(int col) 重畫指定列
BOOL Refresh() 重畫整個Grid.
CCellRange GetCellRange() 獲取整個Grid中的單元格的範圍. 可參考 CCellRange.
void SetSelectedRange(const CCellRange& Range, BOOL bForceRepaint = FALSE); 設定選定單元格的範圍. 可參考 CCellRange.
void SetSelectedRange(int nMinRow, int nMinCol, int nMaxRow, int nMaxCol, BOOL bForceRepaint = FALSE); 設定選定單元格的範圍.
BOOL IsValid(int nRow, int nCol) 如果指定行和列有效,則返回TRUE.
BOOL IsValid(const CCellID& cell) 如果指定單元格有效,則返回TRUE.
BOOL IsValid(const CCellRange& range) 如果指定單元格範圍有效,則返回TRUE.
CCellID GetNextItem(CCellID& cell, int nFlags) const 查詢具有特定屬性並且和指定內容有特定關係的單元格. (也可參考 CListCtrl::GetNextItem 和Cell Searching options)</P><P>排序操作
void SetHeaderSort(BOOL bSortOnClick = TRUE) 設定在ListMode下,點選列標題頭時,是否對行進行排序.
BOOL GetHeaderSort() 判斷在ListMode下,點選列標題頭時,是否對行進行排序.
SetSortColumn(int nCol 設定當前已排序列的索引。
int GetSortColumn() 獲取當前已排序列的索引。
void SetSortAscending(BOOL bAscending) 設定當前排序列是否按升序排序。
BOOL GetSortAscending() 判斷當前排序列是否按升序排序。
BOOL SortTextItems(int nCol, BOOL bAscending, LPARAM data = 0) 根據單元格文字內容對指定列排序. 成功則返回TRUE.
BOOL SortItems(int nCol, BOOL bAscending, LPARAM data = 0) 使用比較函式在指定列進行排序.如果沒有指定函式,則對行按文字進行排序.成功則返回TRUE.可參考SetCompareFunction()
void SetCompareFunction(PFNLVCOMPARE pfnCompare) 設定對進行排序的回撥函式. 可從下面的到更多的細節。
BOOL SortItems(PFNLVCOMPARE pfnCompare, int nCol, BOOL bAscending, LPARAM data = 0) 使用比較函式pfnCompare在指定的列進行排序.從函式CListCtrl::SortItems中可以尋求一些關於這個函式的形式的資訊成功則返 回TRUE.
排序是通過使用變數SortItems, SortTextItems中的一個或者在listmode下點選列標題頭來實現。
注意:在虛擬模式下不能進行排序。這是因為在虛擬模式下,Grid不能儲存單元格中的任何資訊,因此,也就不能儲存任何對單元格進行排序的資訊。
處理排序的最簡單方法是先設定單元格的比較函式(呼叫SetCompareFunction),接著呼叫SortItems(int nCol, BOOL bAscending, LPARAM data = 0)。nCol是要排序的列,bAscending設定是按升序還是按降序排序,data是應用中將要傳遞給比較函式的的一個特殊資料。
比較函式必須是一個全域性或靜態函式,其格式如下:
int CALLBACK pfnCellCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
lParam1和 lParam2是CGridCellBase的指標,而lParamSort就是應用中作為引數變數傳遞給函式SortItems的特殊資料。如果第一個單元格的值小於第二個單元格的值,函式返回-1,相等返回0,否則返回1。
下面就是一個排序比較函式的例子:
int CALLBACK MyClass::pfnCellNumericCompare(LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort)
{
CGridCellBase* pCell1 = (CGridCellBase*) lParam1;
CGridCellBase* pCell2 = (CGridCellBase*) lParam2;
if (!pCell1 || !pCell2) return 0;</P><P>int nValue1 = _ttol(pCell1->GetText());
int nValue2 = _ttol(pCell2->GetText());</P><P>if (nValue1 < nValue2)
return -1;
else if (nValue1 == nValue2)
return 0;
else
return 1;
}
還提供了兩個有用的函式:
int CALLBACK CGridCtrl::pfnCellTextCompare(LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort)
int CALLBACK CGridCtrl::pfnCellNumericCompare(LPARAM lParam1,
LPARAM lParam2,
LPARAM lParamSort)
這兩個函式是通過文字內容和數值進行排序的(分別使用itoa)。為Grid設定比較函式,僅僅需要呼叫:
m_Grid.SetCompareFunction(CGridCtrl::pfnCellNumericCompare);
如果這個比較函式設定為空,那麼將預設呼叫函式CGridCtrl::pfnCellTextCompare</P><P>列印
void EnableWysiwygPrinting(BOOL bEnable = TRUE) 設定WYSIWYG 列印
BOOL GetWysiwygPrinting() 如果設定了WYSIWYG列印則返回TRUE。
void Print() 在使用者選擇的裝置上列印G rid (控制元件在對話方塊中有用)
virtual void OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo) 用於文件/瀏覽環境下,在 CView dervied class' OnBeginPrinting中呼叫
virtual void OnPrint(CDC *pDC, CPrintInfo *pInfo) 用於文件/瀏覽環境下. 在CView dervied class' OnPrint中呼叫
virtual void OnEndPrinting(CDC *pDC, CPrintInfo *pInfo) 用於文件/瀏覽環境下. 在CView dervied class' OnEndPrinting中呼叫。
void SetShadedPrintOut(BOOL bEnable = TRUE) 如果為TRUE,則近似列印彩色單元格。如果為FALSE ,則所有文字按照白紙黑字的形式打印出來。.
BOOL GetShadedPrintOut() 判斷單元格是否陰影或近似列印。.
void SetPrintMarginInfo(int nHeaderHeight, int nFooterHeight, int nLeftMargin, int nRightMargin, int nTopMargin, int nBottomMargin, int nGap) 設定列印邊緣資訊。.
void GetPrintMarginInfo(int &nHeaderHeight, int &nFooterHeight, int &nLeftMargin, int &nRightMargin, int &nTopMargin, int &nBottomMargin, int &nGap) 獲取列印邊緣資訊.</P><P>結構、定義和訊息
CGridCellBase類
這個類是所有Grid單元格類的基類,包含有每個單元格的資訊。同時,它還定義了大量的方法供Grid呼叫,例如畫圖和列印。幾乎所有的方法和函式都是虛 擬模式,類本身不能直接使用--只能被引用。作為Grid控制元件的預設單元格類CGridCell就是基於CGridCellBase的。
屬性
virtual void SetText(LPCTSTR szText);
virtual void SetImage(int nImage);
virtual void SetData(LPARAM lParam);
virtual void SetState(DWORD nState);
virtual void SetFormat(DWORD nFormat);
virtual void SetTextClr(COLORREF clr);
virtual void SetBackClr(COLORREF clr);
virtual void SetFont(const LOGFONT* plf);
virtual void SetGrid(CGridCtrl* pGrid);
virtual void SetCoords(int nRow, int nColumn);
virtual void SetMargin(UINT nMargin);</P><P> virtual LPCTSTR GetText() const // 返回單元格的文字內容
virtual LPCTSTR GetTipText() const // 根據意願返回標題提示文字
virtual int GetImage() const // 返回單元格的圖形索引
virtual LPARAM GetData() const // 返回單元格的關聯資料
virtual DWORD GetState() const // 返回單元格的狀態
virtual DWORD GetFormat() const // 返回單元格的格式
virtual COLORREF GetTextClr() const // 返回單元格文字顏色
virtual COLORREF GetBackClr() const // 返回單元格背景顏色
virtual LOGFONT* GetFont() const // 以LOGFONT的形式返回單元格的字型
virtual CFont* GetFontObject() const // 將單元格的字型返回成Cfont物件
virtual UINT GetMargin() const // returns internal margin for cell
virtual CGridCtrl* GetGrid() const // 返回與單元格關聯的Grid
virtual CWnd* GetEditWnd() const // 返回NULL或單元格的編輯視窗</P><P>virtual BOOL IsEditing() const
virtual BOOL IsFocused() const
virtual BOOL IsFixed() const
virtual BOOL IsFixedCol() const
virtual BOOL IsFixedRow() const
virtual BOOL IsSelected() const
virtual BOOL IsReadOnly() const
virtual BOOL IsModified() const
virtual BOOL IsDropHighlighted() const
virtual BOOL IsDefaultFont() const // 如果單元格使用的是預設字型,返回TRUE</P><P>virtual CGridCellBase* GetDefaultCell() const;
操作符
virtual void operator=(CGridCellBase& cell);</P><P>操作
virtual void Reset();</P><P>virtual BOOL Draw(CDC* pDC, int nRow, int nCol, CRect rect,
BOOL bEraseBkgnd = TRUE);
virtual BOOL GetTextRect( LPRECT pRect) - 單元格內部文字框
virtual BOOL GetTipTextRect( LPRECT pRect) - 工具提示的邊框
virtual CSize GetTextExtent(LPCTSTR str) -文字大小
virtual CSize GetCellExtent(CDC* pDC) - 單元格大小</P><P>// 開啟和終止對單元格的編輯
virtual BOOL Edit(int nRow, int nCol, CRect rect,
CPoint point, UINT nID, UINT nChar)
virtual void EndEdit()// 確認編輯的結果.如果"str"不是一個有效的值,那麼返回FALSE並且編輯無效
virtual BOOL ValidateEdit(LPCTSTR str);</P><P>virtual BOOL PrintCell(CDC* pDC, int nRow, int nCol, CRect rect);//僅僅只能被基類CgridCellBase呼叫而不是CgridCellBase本身.
LRESULT SendMessageToParent(int nRow, int nCol, int nMessage);過載
virtual void OnEndEdit();
virtual void OnMouseEnter();
virtual void OnMouseOver();
virtual void OnMouseLeave();
virtual void OnClick( CPoint PointCellRelative);
virtual void OnClickDown( CPoint PointCellRelative);
virtual void OnRClick( CPoint PointCellRelative);
virtual void OnDblClick( CPoint PointCellRelative);
virtual BOOL OnSetCursor();</P><P>過載使得製作普通單元格變的極為簡單。為建立自己的單元格類,既可以過載 CGridCtrl::CreateCell也可以建立自己的源於CGridCellBase的單元格,或者使用 CGridCtrl::SetCellType 和 CGridCtrl::SetDeafaultCellType自動產生。
僅僅需要建立一個源於CGridCellBase 或CGridCell (如CMyGridCell)的新單元格類,然後在Grid中呼叫如下函式代替原來的單元格就可以了。
MyGrid.SetCellType(row, column, RUNTIME_CLASS(CMyGridCell));
現在的單元格(行、列)就是CMyGridCell型別的