CGridCtrl控件类的用法
开源的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);//填充数据VOIDCtest1Dlg::fillData(){INTm_nFixCols=0;INTm_nFixRows=1;INTm_nCols=6;INTm_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(introw=0;row<m_Grid.GetRowCount();row++){for(intcol=0;col<m_Grid.GetColumnCount();col++){CStringstr;GV_ITEMItem;Item.mask=GVIF_TEXT;Item.row=row;Item.col=col;if(row<m_nFixRows)str.Format(_T("列%d"),col);elseif(col<m_nFixCols)str.Format(_T("行%d"),row);elsestr.Format(_T("%d"),row*col);Item.strText=str;if(rand()%10==1){//设置部分单元格颜色COLORREFclr=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_msgVOIDOnEditCell(NMHDR*pNMHDR,LRESULT*pResult);
.cpp文件中添加代码如下:
VOIDCtest1Dlg::OnEditCell(NMHDR*pNMHDR,LRESULT*pResult){//事件处理NM_GRIDVIEW*pItem=(NM_GRIDVIEW*)pNMHDR;CStrings;s.Format(_T("您编辑了%d行,%d列"),pItem->iRow+1,pItem->iColumn+1);CStringstr=m_Grid.GetItemText(pItem->iRow,pItem->iColumn);AfxMessageBox(str);//returnCtest1Dlg::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)VOIDCScale3DCTotalTableView::OnDelMenu(NMHDR*pNMHDR,LRESULT*pResult){NM_GRIDVIEW*pItem=(NM_GRIDVIEW*)pNMHDR;m_nSelectGrid=pItem->iRow;POINTpt;GetCursorPos(&pt);CMenumenu;menu.LoadMenu(IDR_MENU1);CMenu*pPopup=menu.GetSubMenu(0);ScreenToClient(&pt);CRectrt;this->GetWindowRect(rt);pPopup->TrackPopupMenu(TPM_RIGHTBUTTON|TPM_RIGHTBUTTON,pt.x+rt.left,rt.top+pt.y,this);*pResult=0;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。