开源的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的资源IDON_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;}