MFC 對話框動態創建簡單的GridCtrl控件


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;
}

在這個函數中可以獲得相應的行號和列號,從而進行各種操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM