MFC Grid control 2.24中文幫助

<script type="text/javascript"> /*<![CDATA[*/ if(top.location != self.location){ top.location = self.location; } var myref = encodeURIComponent("http://hi.baidu.com/tjcu/blog/item/c414db33fa74eb40ac4b5ff3%2Ehtml"); /*]]>*/</script>

http://hi.baidu.com/tjcu/blog/item/c414db33fa74eb40ac4b5ff3.html
   
MFC Grid control 2.24
2007年09月29日 星期六 16:10

版權歸http://www.codeproject.com/miscctrl/gridctrl.asp

介紹
當我努力爲顯示和編輯現有表中的數據而使用 CListCtrl 到了極限之後,我意識到我所需要的只不過是一個專用的Grid控件而已。於是我開始着手寫自己的Grid控件,但爲了節省時間我決定修改Joe Willcoxson's的免費控件 WorldCom,你可以在以下站點 http://users.aol.com/chinajoe/wcmfclib.html 找到這個東東。爲了讓它能做我要做的事情,我分解了他的代碼,並且重新修改。由於代碼經過太多的修改,我甚至不能確信最終是否還存在最初的代碼。但無論如 何,Joe的代碼是一個大框架,而我只是在上面進行加工而已。
工程一開始的時候是計劃儘可能的簡單但是當我不斷髮現我不得不考慮新特色的時候,它迅速的膨脹成爲一個夢魘。雖然測試並不是沒有遺漏--但是我還是堅信情 形不會變得太壞J。Joe很善意的允許我開放這個資源而不附加任何的語句(畢竟那是基於他的代碼),但是由於工程象馬拉松似的,所以我在這段代碼中使用了 兩個非常不成熟的條件:
這段代碼可以以任何方式用於已編譯的形式中(包括商業用途)。只要代碼不適用,即使沒有作者同意,作者姓名和所有版權信息都原封不動,你可以對代碼進行任何形式的使用。但是,如果沒有作者的同意,這篇文章和附帶的源代碼都不能放在任何網站或論壇上。
你就把它當作是沒有任何擔保的軟件,隨意使用吧!
我已經儘量除去任何不良的" 特徵",對由它引起的任何損害,時間的浪費或者數據丟失等,我不負任何責任。
希望不要問太多關於繼續開發下去的到底有多大工作量的問題。如果你真的要用於商業場合,請給我發email讓我知道。如果沒有多少人使用的話,開放和維護/升級代碼就沒有任何意義。
 控件的特點:
●使用鼠標可以進行單元格的選擇,還可以輔助ctrl和shift的組合鍵進行選
擇。也可以取消選擇。
● 行和列可以按照大小進行重排,還可以取消對行、列或兩者的排序。
● 雙擊區分點,行或者列可以按照大小自動排序
● 可以對任何列或行固定
● 單元格可以有不同文本和背景顏色的個性化設置
● 單元格可以有字體的個性化設置
● 單元格可以標註"只讀"或者其他的狀態設置及檢測
● OLE的拖放動作
● Ctrl-C, Ctrl-X和Ctrl-V執行拷貝、剪切、粘貼操作,Ctrl-A全選
● 當單元格成爲焦點,並且在單元格的編輯區域按下字符鍵,就意味着在
那個單元格進行編輯了
● 支持微軟的智能鼠標
● 可以在單元格中加入圖片
● 對大型數據可以使用"虛擬"模式
● 充分的打印支持,支持文檔/瀏覽環境(包括打印預覽)或是基於會話的應用(不支持打印預覽)
● 可選的"列表模式",包括對行的全選或單選,還有單擊列標題提示進行插入的操作。
● 衆多的虛函數可以很容易對控件進行功能擴充
● 支持UNICODE
● 支持WinCE
● 單元格的標題提示太小不能顯示數據
● 可以隱藏行和列
● 在VC4.2、5.0、6.0和CE工具箱2.0、3.0下編譯通過示例中示範了grid控件中大部分特徵文檔
如果想在你的工程中使用這個Grid控件的話,你還得在你的工程中添加一些文件:
gridctrl.cpp, gridctrl.h Grid控件資源文件和頭文件
gridcellbase.cpp, gridcellbase.h 單元格的基礎類
gridcell.cpp, gridcell.h 單元格的默認執行文件
CellRange.h CcellID和CcellRange類的定義
MemDC.h Keith Rule's的直接存儲類
InPlaceEdit.cpp, InPlaceEdit.h 定位編輯窗口的源文件和頭文件
GridDropTarget.cpp, GridDropTarget.h Grid容器的drag和drop對象 只有在gridctrl.h中沒有定義 GRIDCONTROL_NO_DRAGDROP的時候纔有必要使用。
Titletip.cpp, Titletip.h 從Zafir Anjum那裏的到的單元格標題提示. 只有在gridctrl.h中沒有定義 GRIDCONTROL_NO_TITLETIPS 的時候纔有必要使用結構
這個Grid是基於一種框架(CgridCtrl工程),這種框架組織和控制那些容納數據、執行某些操作如畫圖、句柄方法如按鈕的點擊事件的單元格的動 作。 Grid工程本身的句柄事件如點擊是在單元格之前響應,如果它認爲有必要的話,它還會發送某種鼠標信息。它還包含一個拖曳對象 (CGridDropTarget)和一個標題提示對象(CTitleTip),前者處理拖曳操作,後者在單元格物理空間在最大限度內不足以顯示其內容時 可以顯示出其內容。Grid單元格可以是任何類型,其長度與源自CgridBaseCell的類的長度一樣。包含這個包的是一個CgridCell類,它 能處理基本的數據存儲和編輯操作。擴充的兩個類CgridCellCombo和CGridURLCell示範瞭如何創建自己的單元格類。
單元格有兩種主要狀態即固定和非固定。固定的單元格通常在Grid的左上方,並且不會隨着Grid的捲動而移動。通常這些單元格包含列和行的標題部分,並且不能進行編輯。而非固定的單元格構成了Grid的內部,你可以對它進行編輯和選擇。
Grid的各種不同屬性的默認值存放在CgridDefaultCell中。每個Grid中通常有四種屬性--每個Grid中含有非固定、列固定、行固定 以及行列同時固定的單元格的默認值。因此,爲了實現設置Grid的默認屬性,首先得使用CGridCtrL::GetDefaultCell來取得單元格 的默認實現,然後你就可以直接設置了
單元格的屬性除字體屬性外都很明確。每一個單元格都有一個指向字體結構體的指針,這個指針只有當你的自行設置單元格的字體屬性時纔會被分配和使用。
Grid還有一種虛擬模式阻止Grid創建實際的格子,每當它需要單元格的信息時,允許你的指定一種回收函數或者消息機制來獲得。這樣當工作輕微減少時可 以節省大量的內存費用。發送給Grid父類的消息GVN_ODCACHEHINT可以幫助你的在Grid的單元格發送信息請求時預先進行數據緩衝。
Grid的數據是以行爲單位進行存儲的,所以,對於大量單元格而言,所有的操作都必須以行爲單位進行的。解說
好了--那麼,現在如何使用它呢?
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,這樣當每次調用回收函數時可以將這個值傳遞給這個回收函數。注意這個回收函數必須是一個靜態或全局函數。</P><P>總體的外觀和特徵
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中某一個單元格的顏色以不同於其它單元格。</P><P>普通的單元格信息
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類型的</P><P>CGridCell類
這個類起源於CGridCellBase並且提供一個使用CGridCtrl的默認實現。


類別:vc學習 | 添加到蒐藏 | 瀏覽(1888) | 評論 (11) <script> /*<![CDATA[*/ var pre = [true,'爲CGridCtrl所擾', '爲CGridCtrl所擾','/tjcu/blog/item/3404d2a2b36605aecaefd02d.html']; var post = [true,'控件字體設置','控件字體設置', '/tjcu/blog/item/ab46e2fe3fb3c9325d600829.html']; if(pre[0] || post[0]){ document.write('<div style="height:5px;line-height:5px;">&nbsp;</div><div id="in_nav">'); if(pre[0]){ document.write('上一篇:<a href="' + pre[3] + '" title="' + pre[1] + '">' + pre[2] + '</a>&nbsp;&nbsp;&nbsp;&nbsp;'); } if(post[0]){ document.write('下一篇:<a href="' + post[3] + '" title="' + post[1] + '">' + post[2] + '</a>'); } document.write('</div>'); } /*]]>*/ </script>
 
上一篇:爲CGridCtrl所擾    下一篇:控件字體設置
 
 
<script type="text/javascript"> /*<![CDATA[*/ function HI_MOD_IN_RELATED_DOC_CALLBACK(arg){ if(arg.length <= 1) return false; var hasMore = arg[0]; var D=function(A,B){A[A.length]=B;} if(arg.length % 2 == 0) D(arg, ["","","",""]); var html = ['<div id="in_related_doc"><div class="tit">相關文章:</div>']; D(html, '<table cellpadding="0" cellspacing="3" border="0">'); for(var i = 1, j = arg.length; i < j; i += 2){ D(html, '<tr>'); D(html, '<td width="15px"><a style="font-size:25px" >&#8226;</a></td><td><a href="http://hi.baidu.com/' + arg[i][3] + '/blog/item/' + arg[i][2] + '.html" target="_blank" title="' + arg[i][0] + '">' + arg[i][1] + '</a>'); D(html, new Array(10).join('/u3000')); D(html, '</td>'); if(arg[i + 1][0] != "") D(html, '<td width="15px"><a style="font-size:25px" >&#8226;</a></td><td><a href="http://hi.baidu.com/' + arg[i + 1][3] + '/blog/item/' + arg[i + 1][2] + '.html" target="_blank" title="' + arg[i + 1][0] + '">' + arg[i + 1][1] + '</a></td>'); else D(html, '<td>&nbsp;</td><td>&nbsp;</td>'); D(html, '</tr>'); } if(hasMore) D(html, '<tr><td colspan="4"><a target="_blank" href="/sys/search?pageno=1&type=7&sort=1&word=MFC%20Grid%20control%202%2E24&item=c414db33fa74eb40ac4b5ff3">更多&gt;&gt;</a></td></tr>'); D(html, '</table></div><div class="line">&nbsp;</div>'); var div = document.getElementById('in_related_tmp'); if(div){ div.innerHTML = html.join(''); while(div.firstChild){ div.parentNode.insertBefore(div.firstChild, div); } div.parentNode.removeChild(div); } window.setTimeout("tracker_init('in_related_doc')",100); } if(RelatedDocData == -1){ // not supported xhr var script = document.createElement('script'); script.type = 'text/javascript'; script.src = '/sys/search?type=8&word=MFC%20Grid%20control%202%2E24&item=c414db33fa74eb40ac4b5ff3&t=' + new Date().getTime(); document.getElementsByTagName('HEAD')[0].appendChild(script); }else if(RelatedDocData == null){ GetAndEval = true; }else{ eval(RelatedDocData); } /*]]>*/ </script>
最近讀者:
<script> var g_spAnnony=true; var g_read=[ ["gaoyinrui","ef5867616f79696e7275695d03","gaoyinrui"], ["coloriy","1ef6636f6c6f7269798401","coloriy"], ["gamecatcher","b53f637166746db101","cqftm"], ["xiaohe185","bf1b7869616f6865313835c704","xiaohe185"], ["88id","73a8cddbbfbfb0dab6c90c02","哇靠擺渡"], ["zggcd","dc0d6875616e677a6f6e677775bd00","huangzongwu"], ["ieidc","740469656964637202","ieidc"], ["wesdiney","c77077657364696e6579b102","wesdiney"], {} ]; g_read.length=g_read.length-1; var _rh1=""; var _rh2=""; function wrreader(){ _rh1 += '<table width="100%" ><tr>'; _rh2+='<tr>'; if(g_spAnnony){ _rh1+='<td align="center" width="10%" ><img border="0" width="55" height="55" src="http://img.baidu.com/hi/img/portraitn.jpg"></td>'; _rh2+='<td>&nbsp;</td>'; if(g_read.length>0){ _rh1+='<td align="left" width="12%">'; }else{ _rh1+='<td align="left" width="100%">'; } _rh1+='<a href="https://passport.baidu.com/?login&tpl=sp&tpl_reg=sp&u='+myref+'" target="_self">登錄</a>後,您就出現在這裏。</td>'; _rh2+='<td>&nbsp;</td>' } if(g_read.length==0){ if(!g_spAnnony){ _rh1+='<td align=left width="100%">最近還沒有登錄用戶看過這篇文章……</td>'; _rh2+='<td>&nbsp;</td>'; } }else{ for(i=0,len=g_read.length;i<len;i++){ _rh1+='<td align="center" valign="bottom" width="10%" class="user"><a href="/'+g_read[i][0]+'" target="_blank"><img border="0" src="http://himg.baidu.com/sys/portraitn/item/'+g_read[i][1]+'.jpg"></a></td>'; _rh2+='<td align="center" valign="top" class="user"><a href="/'+g_read[i][0]+'" target="_blank">'+g_read[i][2]+'</a></td>'; } } _rh1+='<td width="100%"></td></tr>'; _rh2+='<td></td></tr></table>'; document.write(_rh1+_rh2); } wrreader(); </script>
登錄後,您就出現在這裏。  
    gaoyinrui coloriy cqftm xiaohe185 哇靠擺渡 huangzongwu ieidc wesdiney  
 
<script> allkey=allkey+"cc23f403f53eab773812bb03_c414db33fa74eb40ac4b5ff3_"; </script>
網友評論:
<script> function writecmt(type,id,cmtname,cmturl,portraitId){ var html1=""; if(type==1){ html1="<a href='"+cmturl+"' target='_blank' title='"+cmturl+"'><img border='0' src='http://himg.baidu.com/sys/portraitn/item/"+portraitId+".jpg'><br>"+cmtname+"</a>"; }else{ if(cmtname=="" || cmtname=="匿名網友"){ if(cmturl==""){ html1="<a>匿名網友</a>"; }else{ html1="<a href='"+cmturl+"' target='_blank' title='"+cmturl+"'>"+cmtname+"</a>"; } }else{ if(cmturl==""){ html1="<div class='f14' style='display:inline'>網友:<a>"+cmtname+"</a></div>"; }else{ html1="<div class='f14' style='display:inline'>網友:<a href='"+cmturl+"' target='_blank' title='"+cmturl+"'>"+cmtname+"</a></div>"; } } } document.write(html1); } function filterCmtContent(n){ if(!BdBrowser.isIE){ var defaultfilter1='<span style="filter:glow(color=#000000,strength=2);height:0px;color:#000000">'; var defaultfilter2='<span style="height: 0px; color: rgb(0, 0, 0);">'; var commentDiv=document.getElementById(n); var divs=commentDiv.getElementsByTagName('div'); var d,tmp; for( var i=0,len=divs.length;i<len;i++){ d=divs[i]; if(d.getAttribute('name')=='cmtcontent'){ tmp=d.innerHTML; tmp=tmp.replace(/<span style="filter:glow/(color=#([0-9a-z]{3,6}),strength=2/);height:0px;color:#([0-9a-z]{3,6})">/ig,defaultfilter1); tmp=tmp.replace('<span style="height: 0px; color: rgb(255, 255, 255);">',defaultfilter2); d.innerHTML=tmp; } } } } </script>
1
<script> writecmt(1,"2dd7014f89ae7035aec3ab72","廣平","http://hi.baidu.com/tjcu","af84b9e3c6bd1600"); </script>
廣平
2007年09月29日 星期六 16:11 | 回覆
CcellID類 這是一個用來參考個別單元格的便利的輔助類。所有的成員都是公共的。這個類是根據Joe Willcoxsons的最初實現改寫的。 class CCellID { public: int row, col; // 基於0的單元格的行和列.

 

CCellID(int nRow = -1, int nCol = -1)

int IsValid(); int operator==(const CCellID& rhs); int operator!=(const CCellID& rhs); }

CCellRange類 這是一個用來參考單元格範圍的便利的輔助類。這是一個從Joe Willcoxsons最初實現改寫的類。 class CCellRange { public: CCellRange(int nMinRow = -1, int nMinCol = -1, int nMaxRow = -1, int nMaxCol = -1); void Set(int nMinRow = -1, int nMinCol = -1, int nMaxRow = -1, int nMaxCol = -1);

int IsValid() const; int InRange(int row, int col) const; // 判斷行/列是否在範圍之內 int InRange(const CCellID& cellID) const; // 判斷單元格是否在範圍之內

CCellID GetTopLeft() const; //取出左上角單元格 CCellRange Intersect(const CCellRange& rhs) const; //返回兩個區域的交集

int GetMinRow() const; // 下面的容易理解

 
2
<script> writecmt(1,"4c3367386888162096ddd872","廣平","http://hi.baidu.com/tjcu","af84b9e3c6bd1600"); </script>
廣平
2007年09月29日 星期六 16:12 | 回覆
void SetMinRow(int minRow); int GetMinCol() const; void SetMinCol(int minCol); int GetMaxRow() const; void SetMaxRow(int maxRow); int GetMaxCol() const; void SetMaxCol(int maxCol);

 

int GetRowSpan() const; // 行的跨度 int GetColSpan() const; // 列的跨度

void operator=(const CCellRange& rhs); int operator==(const CCellRange& rhs); int operator!=(const CCellRange& rhs); }

結構體GV_ITEM,它在調用Get/SetItem時使用] typedef struct _GV_ITEM { int row,col; //對象的行和列 UINT mask; // 用於設置/獲取單元格數據的一種掩碼 UINT state; //單元格狀態 (如焦點/突出顯示) UINT nFormat; //單元格格式.默認使用CDC::DrawText格式 CString szText; // 單元格的文本 int iImage; // 系列可視對象圖標的索引 COLORREF crBkClr; // 背景顏色 (或者 CLR_DEFAULT) COLORREF crFgClr; // 前景顏色(或者 CLR_DEFAULT) LPARAM lParam; // 與對象有聯繫的32位值 LOGFONT lfFont; // 單元格的字體 } GV_ITEM;

網格線或者滾動條的選擇 GVL_NONE // 無網格線 GVL_HORZ // 僅僅有水平網格線 GVL_VERT //僅僅

 
4
<script> writecmt(1,"e1bacb3dca90bcc49e3d6272","廣平","http://hi.baidu.com/tjcu","af84b9e3c6bd1600"); </script>
廣平
2007年09月29日 星期六 16:13 | 回覆
通知消息 GVN_BEGINDRAG // 拖曳發生時發送 GVN_BEGINLABELEDIT // 定位編輯開始時發送 GVN_ENDLABELEDIT //定位編輯停止時發送 GVN_SELCHANGING // 單元格選擇改變之前發送 GVN_SELCHANGED // 單元格選擇改變之後發送 GVN_GETDISPINFO //當Grid處在虛擬模式下的一個單元格信息請求 GVN_ODCACHEHINT // 虛擬模式下的隱藏提示 當不使用NM_GRIDVIEW機構體時,這些消息就很象它們的LVN_...副本 typedef struct tagNM_GRIDVIEW { NMHDR hdr; int iRow; int iColumn; } NM_GRIDVIEW;

 

Protect類型的重載函數 這些函數作成虛擬的以便於擴展。 Printing - 在OnPrint事件中調用. virtual void PrintColumnHeadings(CDC *pDC, CPrintInfo *pInfo); virtual void PrintHeader(CDC *pDC, CPrintInfo *pInfo); virtual void PrintFooter(CDC *pDC, CPrintInfo *pInfo); virtual void PrintRowButtons(CDC *pDC, CPrintInfo* pInfo); Drag n' drop //雖然沒什麼必要,但是我覺得這些代碼很酷,所以還是保留了。:). virtual CImageList* CreateDragImage(CPoint *pHotSpot) Mouse Clicks virtual void OnFixedColumnClick(CCellID& cell); virtual

 
5
<script> writecmt(1,"d4d5d216d07b2c1b962b4372","廣平","http://hi.baidu.com/tjcu","af84b9e3c6bd1600"); </script>
廣平
2007年09月29日 星期六 16:13 | 回覆
//開始編輯 virtual void OnEditCell(int nRow, int nCol, CPoint point, UINT nChar) // 結束編輯 virtual void OnEndEditCell(int nRow, int nCol, CString str) //創建定位編輯控件 virtual void CreateInPlaceEditControl(CRect& rect, DWORD dwStyle, int nRow, int nCol, LPCTSTR szText, int nChar) Drawing virtual void OnDraw(CDC& origDC); //畫任何東西 Construction and Cleanup //創建一個新的單元格並初始化. virtual CGridCellBase* CreateCell(int nRow, int nCol)

 

// 刪除一個單元格並作必要的清除工作 virtual void DestroyCell(int nRow, int nCol)

剪貼板 其中還還包含了很多剪貼板函數 virtual void OnEditCut() 將所選單元格內容拷貝到剪貼板,並刪除單元格中的響應內容. (Ctrl-X) virtual void OnEditCopy() 將所選單元格內容拷貝到剪貼板 (Ctrl-C) virtual void OnEditPaste() 將剪貼板中的內容粘貼到Grid中. (Ctrl-V) virtual void OnEditSelectAll() 雖然不是一個真正的剪貼板函數,但會經常用到. 這個程序全選Grid中的單元格 (Ctrl-A)

單元格的編輯和確認 控制單元格是否可以編輯,或者是否保存或放

 
6
<script> writecmt(1,"7d5ea964f310fff3f6365472","廣平","http://hi.baidu.com/tjcu","af84b9e3c6bd1600"); </script>
廣平
2007年09月29日 星期六 16:13 | 回覆
int row = 1; int col = 10; m_Grid.SetItemState(row,col, m_Grid.GetItemState(row,col) | GVIS_READONLY); 深層的控制可以通過處理GVN_BEGINLABELEDIT消息來實現。如果消息的返回值小於0,那麼試圖對指定單元格所做的修改將被取消同時,這個單元格將被看作是隻讀屬性的。當每次試圖編輯某一個單元格時都會發送一個這種消息。 爲處理這個消息,需要在主窗口中增加一個句柄: BEGIN_MESSAGE_MAP(CGridCtrlDemoDlg, CDialog) ... // 增加句柄 ON_NOTIFY(GVN_ENDLABELEDIT, IDC_GRID, OnGridEndEdit) END_MESSAGE_MAP()

 

...

// GVN_ENDLABELEDIT void CGridCtrlDemoDlg::OnGridStartEdit(NMHDR *pNotifyStruct, LRESULT* pResult) { NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct;

// 如果你允許對單元格進行編輯,那麼虛構函數AllowCellToBeEdited將返回TRUE BOOL bAllowEdit = AllowCellToBeEdited(pItem->iRow, pItem->iColumn);

*pResult = (bAllowEdit)? 0 : -1; }

 
7
<script> writecmt(1,"0495cdfce2480d81b801a073","廣平","http://hi.baidu.com/tjcu","af84b9e3c6bd1600"); </script>
廣平
2007年09月29日 星期六 16:13 | 回覆
可以通過相同的方法處理GVN_ENDLABELEDIT消息來實現是保存還是放棄對單元格的編輯行爲。 // GVN_ENDLABELEDIT void CGridCtrlDemoDlg::OnGridEndEdit(NMHDR *pNotifyStruct, LRESULT* pResult) { NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct;

 

// 如果你想保存對單元格的修改,那麼虛構函數AcceptChange將返回TRUE BOOL bAcceptChange = AcceptChange(pItem->iRow, pItem->iColumn);

*pResult = (bAcceptChange)? 0 : -1; } 你所能用的最終的確認方法是源於CGridCellBase類,並重載ValidateEdit方法的。如果它返回的是TRUE,那麼表示保存修改,否則表示放棄修改。聲名 如果沒有下面這些作者的免費代碼,這些工作將不會成功。 Joe Willcoxson:我的工作依賴於 Joe的原始代碼,它提供了這個控件的基本結構。 Keith Rule:Keith有一個很靈巧的類CMemDC,它能很容易的處理閃爍顯示工作。他還提供了copy/paste/drag/drop對象源代碼。 Ravi Reddy:我使用了Ravi的一個列表瀏覽打印代碼。 Zafir Anjum:他爲我提供了CInPlaceEdit的切入點,並且提供了排序程序和標題提示的源代碼。 Eric Woodruff, Brian V. Shifrin, Scot Reed, Aqiruse, Ken Bertels

 
8
<script> writecmt(1,"2a1c2cdd9441bfda8c102920","annielove530","http://hi.baidu.com/annielove530","d062616e6e69656c6f7665353330c801"); </script>
annielove530
2007年10月23日 星期二 16:13 | 回覆
呵呵,,,雖然我看不明白,但是看你寫的這麼幸苦,幫你踩一下吧
 
9
<script> writecmt(1,"1198d607b88531ce7a894752","網話通_網上800","http://hi.baidu.com/%CD%F8%BB%B0%CD%A8%5F%CD%F8%C9%CF800","08d7cdf8bbb0cda85fcdf8c9cf383030b502"); </script>
網話通_網上800
2007年10月31日 星期三 13:48 | 回覆
電視窗(企業視頻、視頻窗、企業電視、TV windows)能夠在企業網站上,將企業 的產品、形象、文化、服務、品牌等需要宣傳的內容,有影像節目進行傳播的集成系統,使客戶能夠清楚的看見真實的企業、真實的產品和真實的服務。是敢於真實 宣傳的誠信企業進行網絡宣傳和營銷的首選工具,同時也是企業軟實力的重要標誌! 電視窗(企業視頻、視頻窗、企業電視、TV windows)與網話通(點擊通話、網上800、web800)的完美結合,是企業互聯營銷的重要工具,網盾科技努力打造中國網站營銷工具第一品牌! 詳情請登陸:www.wanghuatong.com 常 來 踩 踩!
 
10
<script> writecmt(2,"3fb2489027fec58aa877a4dd","xiao74485","http://passport.baidu.com/?business&un=xiao74485","96447869616f37343438358d03"); </script>
網友:xiao74485
2008年08月26日 星期二 10:54 | 回覆
非常有用 謝謝了..
 
11
<script> writecmt(2,"48a89f160138ba59f2de321a","匿名網友","","0000c4e4c3fbcdf8d3d10000"); </script> 匿名網友
2008年09月28日 星期日 13:13 | 回覆
非常好,太感謝啦!
 
12
<script> writecmt(2,"356d9e82f5f9cab66d811939","匿名網友","","0000c4e4c3fbcdf8d3d10000"); </script> 匿名網友
2008年12月30日 星期二 11:03 | 回覆
謝謝樓主,寫得非常詳細!
 
<script>filterCmtContent('in_comment');</script>
<script> document.getElementById("spRefURL").value = window.location.href; </script>
發表評論:
姓 名: <script> document.write(" &nbsp;&nbsp; <a href='https://passport.baidu.com/?reg&tpl=sp&return_method=get&skip_ok=1&u=http://hi.baidu.com/sys/reg/' target='_blank'>註冊</a>"); document.write(' | <a href="https://passport.baidu.com/?login&tpl=sp&tpl_reg=sp&u='+myref+'">登錄</a>'); </script>    註冊 | 登錄
網址或郵箱: (選填)
內 容:
插入表情
<script> var editor=null; try{ editor=new BdEditor("spBlogCmtText",{width:"100%",height:"155px"}); editor.onfocus = function(){hidErr(3);} editor.render(); }catch(e){ var spBlogCmtText = document.getElementById("spBlogCmtText"); var p = spBlogCmtText.previousSibling; while(p && p.nodeType != 1) p = p.previousSibling; if(p && /bdeditor_container/.test(p.id)){ p.parentNode.removeChild(p); } spBlogCmtText.style.display = ''; editor=null; } </script> <script> G("spBlogCmtor").value=G("spBlogCmtor").defaultValue; G("spBlogCmtText").value=""; </script>
驗證碼:
<script type="text/javascript"> /*<![CDATA[*/ var imgsrc="http://hiup.baidu.com/cgi-bin/genimg?3035737061636531333238333137323438303030303030303030303030303031323335353734363937D4E28C2F6B74892D04587EB6FD63F35E"; function f_focus(){ if(G('yanzheng').style.display=="none" ){ G('verifypic').src=imgsrc; G('yanzheng').style.display="block"; } } function newverifypic(){ G("verifypic").src = imgsrc +"&t="+ Math.random(); return false; } /*]]>*/ </script>
      

     
<script> <!-- var hstr="/tjcu/brwstat?key1=1"; document.write("<script src='"+hstr+"&key2="+allkey+"'><//script>"); //--> </script> <script src="http://hi.baidu.com/tjcu/brwstat?key1=1&key2=cc23f403f53eab773812bb03_c414db33fa74eb40ac4b5ff3_"></script>
©2009 Baidu
<script> if(document.getElementById("m_blog")) { var imgarray = document.getElementById("m_blog").getElementsByTagName('img'); var imgw = document.getElementById("m_blog").offsetWidth; imgw =imgw-40; for(var i=0; i<imgarray.length; i++){ if(imgarray[i].className=="blogimg" && imgarray[i].width>=imgw) imgarray[i].width=imgw; } } // Fix ff bugs var blog_text = document.getElementById('blog_text'); blog_text.innerHTML = blog_text.innerHTML.replace(/href/s*=/s*("|')?(/././//././/)/gi,"href=$1../$2"); gotoreply(); </script>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章