开源的CGridCtrl类,是VC中的可用的表格控件。相对VC自带的CListCtrl网格控件功能要强很多。但是除原工程代码自带的示例外,很少有完整描述使用的过程。在VC2015中的用法如下:
(1)先将源代码的中的GridCtrl_src文件夹和NewCellTypes文件夹复制到当前新建工程源代码目录下。
在窗口的.h文件中添加:
#include "GridCtrl_src\GridCtrl.h"
在窗口的.cpp文件中添加:
#include "NewCellTypes/GridURLCell.h" #include "NewCellTypes/GridCellCombo.h" #include "NewCellTypes/GridCellCheck.h" #include "NewCellTypes/GridCellNumeric.h" #include "NewCellTypes/GridCellDateTime.h"
(2)在对话框上添加一个自定义控件(Custom Control)将ID设为:IDC_GRID
在窗口中,添加关联变量:CGridCtrl m_Grid;
控件Class属性为:MFCGridCtrl
(3)在窗口的OnInitDialog函数中,添加如下代码:
fillData(); m_Grid.GetDefaultCell(FALSE, FALSE)->SetBackClr(RGB(0xFF, 0xFF, 0xE0)); m_Grid.SetFixedColumnSelection(TRUE); m_Grid.SetFixedRowSelection(TRUE); m_Grid.EnableColumnHide(); m_Grid.AutoSize(); m_Grid.SetCompareFunction(CGridCtrl::pfnCellNumericCompare); m_Grid.SetTrackFocusCell(FALSE); //填充数据 VOID Ctest1Dlg::fillData() { INT m_nFixCols = 0; INT m_nFixRows = 1; INT m_nCols = 6; INT m_nRows = 16; m_Grid.SetAutoSizeStyle(); TRY { m_Grid.SetRowCount(m_nRows); //设置行数 m_Grid.SetColumnCount(m_nCols); //设置列数 m_Grid.SetFixedRowCount(m_nFixRows); //固定行 m_Grid.SetFixedColumnCount(m_nFixCols); //固定列 } CATCH(CMemoryException, e) { e->ReportError(); return; } END_CATCH //用文本填充行列数据 for (int row = 0; row < m_Grid.GetRowCount(); row++) { for (int col = 0; col < m_Grid.GetColumnCount(); col++) { CString str; GV_ITEM Item; Item.mask = GVIF_TEXT; Item.row = row; Item.col = col; if (row < m_nFixRows) str.Format(_T("列 %d"), col); else if (col < m_nFixCols) str.Format(_T("行 %d"), row); else str.Format(_T("%d"), row*col); Item.strText = str; if (rand() % 10 == 1) {//设置部分单元格颜色 COLORREF clr = RGB(rand() % 128 + 128, rand() % 128 + 128, rand() % 128 + 128); Item.crBkClr = clr; //或者m_Grid.SetItemBkColour(row, col, clr); Item.crFgClr = RGB(255, 0, 0); //或者m_Grid.SetItemFgColour(row, col, RGB(255,0,0)); Item.mask |= (GVIF_BKCLR | GVIF_FGCLR); } m_Grid.SetItem(&Item); } } }
(4)编译时提示:C4996: 'GetVersionExW': 被声明为已否决
处理方法如下:
1.Project Properties > Configuration Properties > C/C++ > General > SDL checks关掉
2.#pragma warning(disable: 4996)
3./wd 4996
任选一种方法即可。
(5)清空表格控件
m_Grid.DeleteAllItems();//全部清空
m_Grid.DeleteNonFixedRows(); //保留标题行,其他删除
(6)表格编辑事件处理
//添加事件映射 BEGIN_MESSAGE_MAP(Ctest1Dlg, CDialogEx) ON_NOTIFY(GVN_ENDLABELEDIT,IDC_GRID,&Ctest1Dlg::OnEditCell) END_MESSAGE_MAP()
.h头文件中添加:
afx_msg VOID OnEditCell(NMHDR * pNMHDR, LRESULT *pResult);
.cpp文件中添加代码如下:
VOID Ctest1Dlg::OnEditCell(NMHDR * pNMHDR, LRESULT *pResult) {//事件处理 NM_GRIDVIEW * pItem = (NM_GRIDVIEW*)pNMHDR; CString s; s.Format(_T("您编辑了%d行,%d列"), pItem->iRow + 1, pItem->iColumn + 1); CString str = m_Grid.GetItemText(pItem->iRow, pItem->iColumn); AfxMessageBox(str); //return Ctest1Dlg::OnNotify(wParam, lParam, pResult); }
(7)禁止表格编辑
m_Grid.SetEditable(FALSE);
(8)删除一行
m_Grid.DeleteRow(m_nSelectGrid);
(9)右键菜单
在窗口类中,添加如下代码:
//1020为CGridCtrl的资源ID ON_NOTIFY(NM_RCLICK, 1020, &CScale3DCTotalTableView::OnDelMenu) VOID CScale3DCTotalTableView::OnDelMenu(NMHDR * pNMHDR, LRESULT *pResult) { NM_GRIDVIEW * pItem = (NM_GRIDVIEW*)pNMHDR; m_nSelectGrid = pItem->iRow; POINT pt; GetCursorPos(&pt); CMenu menu; menu.LoadMenu(IDR_MENU1); CMenu * pPopup = menu.GetSubMenu(0); ScreenToClient(&pt); CRect rt; this->GetWindowRect(rt); pPopup->TrackPopupMenu(TPM_RIGHTBUTTON | TPM_RIGHTBUTTON, pt.x + rt.left, rt.top + pt.y, this); *pResult = 0; }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。