开源的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)在对话框上添加一个自定义控件(自定义控件)将ID设为:IDC_GRID
在窗口中,添加关联变量:CGridCtrl m_Grid;
控件类属性为:MFCGridCtrl
(3)在窗口的OnInitDialog函数中,添加如下代码:
fillData (); m_Grid.GetDefaultCell(假,假)→SetBackClr (RGB (0 xff,, 0 xff,, 0 xe0)); m_Grid.SetFixedColumnSelection(真正的); m_Grid.SetFixedRowSelection(真正的); m_Grid.EnableColumnHide (); m_Grid.AutoSize (); m_Grid.SetCompareFunction (CGridCtrl:: pfnCellNumericCompare); m_Grid.SetTrackFocusCell(假);//填充数据 VOID Ctest1Dlg:: fillData () { INT m_nFixCols =, 0; INT m_nFixRows =, 1; INT m_nCols ,,,=, 6; INT m_nRows ,,,=, 16; m_Grid.SetAutoSizeStyle (); 试一试 { m_Grid.SetRowCount (m_nRows);,,,,,,,,,,,,//设置行数 m_Grid.SetColumnCount (m_nCols);,,,,,,,,,//设置列数 m_Grid.SetFixedRowCount (m_nFixRows);,,,,//固定行 m_Grid.SetFixedColumnCount (m_nFixCols);,//固定列 } 抓住(CMemoryException, e) { e→ReportError (); 返回; } END_CATCH//用文本填充行列数据 时间=for (int row 0;, row & lt;, m_Grid.GetRowCount();,行+ +) { 时间=for (int col 0;, col & lt;, m_Grid.GetColumnCount();,坳+ +) { CString str; GV_ITEM 项目; 时间=Item.mask GVIF_TEXT; 时间=Item.row 行; Item.col =,上校; if (row & lt;, m_nFixRows) str.Format (_T(“列,% d"),,上校); else if (col & lt;, m_nFixCols) str.Format (_T(“行,% d"),,行); 其他的 str.Format (_T (“% d"),行*坳); 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(行,,,上校,clr); Item.crFgClr =, RGB (255, 0, 0);//或者m_Grid.SetItemFgColour(行,,,上校,RGB (255, 0, 0)); Item.mask |=, (GVIF_BKCLR |, GVIF_FGCLR); } m_Grid.SetItem(及项目); } } }
(4)编译时提示:C4996: & # 39; GetVersionExW& # 39;:被声明为已否决
处理方法如下:
1。项目属性比;配置属性比;C/c++比;一般比;SDL检查关掉
2。# pragma警告(禁用: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.Format (_T(“您编辑了% d行,% d列“),,pItem→iRow +, 1, pItem→iColumn +, 1); CString str =, m_Grid.GetItemText (pItem→iRow,, pItem→iColumn); AfxMessageBox (str);//return Ctest1Dlg:: OnNotify(按钮,lParam,, pResult); }
(7)禁止表格编辑
m_Grid.SetEditable(假);
(8)删除一行
m_Grid.DeleteRow (m_nSelectGrid);