最近有个项目需要用grid ctrl 呈现多种控件类型, 而我也一直用的是codeproject上的 MFC Grid Control , 这个控件很强大, 而且易于扩展, 源码也提供多种类型的控件, 包括checkbox, combobox, 等等。

 

下面就给出如何为CGridCtrl添加自己的控件类型方法, 本文是button控件

 

CGridCellButton头文件

/******************************************************************** created: 2009/09/27 created: 27:9:2009 9:14 filename: /GridCtrl/NewCellTypes/GridCellButton.h file path: /GridCtrl/NewCellTypes file base: GridCellButton file ext: h author: Li JianGong purpose: Create button cell *********************************************************************/ #include "../GridCtrl_src/GridCell.h" class CGridCellButton : public CGridCell { friend class CGridCtrl; DECLARE_DYNCREATE(CGridCellButton) public: CGridCellButton(void); ~CGridCellButton(void); public: virtual BOOL Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBkgnd = TRUE); protected: virtual void OnClick( CPoint PointCellRelative); protected: CRect m_rect; BOOL m_bPushing;  }

 

CGridCellButton实现文件

#include "stdafx.h" #include "../GridCtrl_src/GridCell.h" #include "../GridCtrl_src/GridCtrl.h" #include "GridCellButton.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNCREATE(CGridCellButton, CGridCell) CGridCellButton::CGridCellButton(void) { m_bPushing = FALSE; } CGridCellButton::~CGridCellButton(void) { } BOOL CGridCellButton::Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBkgnd /* = TRUE */) { m_rect = rect; pDC->SetBkMode(TRANSPARENT); rect.DeflateRect( GetMargin(), 0); CFont* pOldFont = pDC->SelectObject(GetFontObject()); pDC->DrawFrameControl(rect, DFC_BUTTON, m_bPushing?DFCS_BUTTONPUSH | DFCS_PUSHED:DFCS_BUTTONPUSH); COLORREF ColorCurrent = pDC->GetTextColor(); pDC->SetTextColor(::GetSysColor(COLOR_BTNTEXT)); pDC->DrawText(GetText(), -1, rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS); pDC->SetTextColor( ColorCurrent); return TRUE; } void CGridCellButton::OnClick(CPoint PointCellRelative) { m_bPushing = !m_bPushing; GetGrid()->InvalidateRect(m_rect); }

 

使用方法:

CGridCtrl m_gridAddOn; //dlg.h文件 // //dlg.cpp文件 m_gridAddOn.Create(rect, this, IDC_LIST); m_gridAddOn.Refresh(); m_gridAddOn.SetColumnCount(4); m_gridAddOn.SetFixedColumnCount(0); m_gridAddOn.SetFixedRowCount(1); m_gridAddOn.SetColumnWidth(0, 95); m_gridAddOn.SetColumnWidth(1, 95); m_gridAddOn.SetColumnWidth(2, 70); m_gridAddOn.SetColumnWidth(3, 145); m_gridAddOn.SetItemText(0, 0, _T("Application")); m_gridAddOn.SetItemText(0, 1, _T("Status")); m_gridAddOn.SetItemText(0, 2, _T("Action")); m_gridAddOn.SetItemText(0, 3, _T("Auto-Start")); m_gridAddOn.InsertRow(_T("item")); m_gridAddOn.SetItemText(0, 0, _T("Simulator")); m_gridAddOn.SetItemText(0, 1, _T("Stop")); m_gridAddOn.SetItemText(0, 2, _T("Start")); if (!m_gridAddOn.SetCellType(0, 2, RUNTIME_CLASS(CGridCellButton))) return NULL; m_gridAddOn.SetItemText(0, 3, _T(""));

 

效果如下: