1.下載安裝GridCtrl===>http://www.codeproject.com/Articles/8/MFC-Grid-control
在對應項目里面添加GridCtrl的所有.h和cpp的文件(GridCtrl_src和NewCellTypes兩個文件夾下的文件)
在vs2010中可能會出現CMemDC重定義的錯誤,只要將CMemDC這個重命名為CGridMemDC(或者其他你想要的名字,同時將這個庫中的其他引用CMemDC這個類的地方的名稱一起改過來)
2.在對話框中添加GridCtrl的成員變量
定義:
CGridCtrl* m_pGrid;
構造函數中初始化:
m_pGrid=NULL;
析構函數中銷毀
if (m_pGrid) { delete m_pGrid; m_pGrid=NULL; }
3.在對話框中畫出m_pGrid控件
CRect rect; this->GetWindowRect(rect); GetClientRect(rect); m_pGrid=new CGridCtrl(); m_pGrid->Create(CRect(rect.TopLeft().x,rect.BottomRight().y-100,rect.Width(),rect.BottomRight().y),this,1000);
其中Create的第一個參數是這個控件在對話框中的位置(我這里是在對話框底部高為100的區域),第二個參數是父窗口句柄,第三個是你分配給他的ID。
這個創建過程,可以根據需求在不同的函數中實現。
這一過程結束之后我們就有了一個空白的GridCtrl控件顯示在對話框中了。
4.構建簡單的表格
m_pGrid->SetEditable(true);//默認就是可以編輯的 // m_pGrid->SetTextBkColor(RGB(0xFF, 0xFF, 0xE0));//設置表格內容是黃色背景 m_pGrid->SetRowCount(8); //初始為8行,包含表頭 m_pGrid->SetColumnCount(8); //初始化為8列 m_pGrid->SetFixedRowCount(1); //表頭為一行 m_pGrid->SetFixedColumnCount(1); //表頭為一列
這一步結束之后就是一個8*8的表格,但是表格和表頭都還沒有內容是空白的
5.操作單元格
可以直接設置對應的單元格的內容
m_pGrid->SetItemText(row,col,content);
也可以通過下面方式來設置
GV_ITEM Item; Item.mask = GVIF_TEXT; Item.row = row; Item.col = col; Item.strText = “content"; m_Grid.SetItem(&Item);
其中mask表明的是能夠訪問的單元格的內容,比如我這個地方設置成了GVIF_IMAGE,那么運行結果出來之后在對應的單元格中是看不到content的,而且程序中通過GetItemText()的方法也訪問不了(其實就是這個單元格的類型,通過雖然賦值沒有報錯,但是即便重新設置了mask的值為GVIF_IMAGE,也獲取不到之前的賦值)。
mask的類型有下面幾種:
GVIF_TEXT // Cell text will be accessed GVIF_IMAGE // Cell image number will be accessed GVIF_PARAM // Cell user data (lParam) will be accessed GVIF_STATE // Cell state will be accessed GVIF_BKCLR // Cell background colour will be accessed GVIF_FGCLR // Cell foreground colour will be accessed GVIF_FORMAT // Cell format field will be accessed GVIF_FONT // Cell logical font will be accessed GVIF_MARGIN // Cell margin information will be accessed GVIF_ALL // All information will be accessed
到此一個簡單的GridCtrl的創建就完成了。
6.添加消息響應函數
以添加完成編輯觸發的事件處理函數為例,首先在.h文件中聲明消息處理函數:
afx_msg void OnGridEndEdit(NMHDR *pNotifyStruct, LRESULT* pResult);
然后到對應的cpp文件中BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間添加消息響應映射:
ON_NOTIFY(GVN_ENDLABELEDIT, IDC_GRID, OnGridEndEdit)
其中第一個參數是消息,第二個是GRID創建時候的ID,第三個參數就是對應的消息處理函數
最后在cpp中編寫對應的響應函數:
void C3TranformerAttr::OnGridEndEdit(NMHDR *pNotifyStruct, LRESULT* pResult){ NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct; pItem->iColumn; pItem->iRow; }
在這個函數中可以獲得相應的行號和列號,從而進行各種操作。