最近有個項目需要用grid ctrl 呈現多種控制項類型, 而我也一直用的是codeproject上的 MFC Grid Control
, 這個控制項很強大, 而且易於擴充, 源碼也提供多種類型的控制項, 包括checkbox, combobox, 等等。
下面就給出如何為CGridCtrl添加自己的控制項類型方法, 本文是button控制項
CGridCellButton標頭檔
/********************************************************************<br />created:2009/09/27<br />created:27:9:2009 9:14<br />filename: /GridCtrl/NewCellTypes/GridCellButton.h<br />file path:/GridCtrl/NewCellTypes<br />file base:GridCellButton<br />file ext:h<br />author:Li JianGong</p><p>purpose:Create button cell<br />*********************************************************************/<br />#include "../GridCtrl_src/GridCell.h"<br />class CGridCellButton : public CGridCell<br />{<br />friend class CGridCtrl;<br />DECLARE_DYNCREATE(CGridCellButton)<br />public:<br />CGridCellButton(void);<br />~CGridCellButton(void);<br />public:<br /> virtual BOOL Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBkgnd = TRUE);<br />protected:<br /> virtual void OnClick( CPoint PointCellRelative);<br />protected:<br /> CRect m_rect;<br />BOOL m_bPushing; <br />}<br />
CGridCellButton實現檔案
#include "stdafx.h"<br />#include "../GridCtrl_src/GridCell.h"<br />#include "../GridCtrl_src/GridCtrl.h"<br />#include "GridCellButton.h"<br />#ifdef _DEBUG<br />#define new DEBUG_NEW<br />#undef THIS_FILE<br />static char THIS_FILE[] = __FILE__;<br />#endif<br />IMPLEMENT_DYNCREATE(CGridCellButton, CGridCell)<br />CGridCellButton::CGridCellButton(void)<br />{<br />m_bPushing = FALSE;<br />}<br />CGridCellButton::~CGridCellButton(void)<br />{<br />}<br />BOOL CGridCellButton::Draw(CDC* pDC, int nRow, int nCol, CRect rect, BOOL bEraseBkgnd /* = TRUE */)<br />{<br /> m_rect = rect;<br /> pDC->SetBkMode(TRANSPARENT);<br /> rect.DeflateRect( GetMargin(), 0);<br /> CFont* pOldFont = pDC->SelectObject(GetFontObject());<br /> pDC->DrawFrameControl(rect, DFC_BUTTON, m_bPushing?DFCS_BUTTONPUSH | DFCS_PUSHED:DFCS_BUTTONPUSH);<br /> COLORREF ColorCurrent = pDC->GetTextColor();<br /> pDC->SetTextColor(::GetSysColor(COLOR_BTNTEXT));<br /> pDC->DrawText(GetText(), -1, rect, DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);<br /> pDC->SetTextColor( ColorCurrent);<br /> return TRUE;<br />}<br />void CGridCellButton::OnClick(CPoint PointCellRelative)<br />{<br />m_bPushing = !m_bPushing;<br />GetGrid()->InvalidateRect(m_rect);<br />}<br />
使用方法:
CGridCtrl m_gridAddOn; //dlg.h檔案<br /> //////////////////////////////////////<br /> //dlg.cpp檔案<br /> m_gridAddOn.Create(rect, this, IDC_LIST);<br />m_gridAddOn.Refresh();<br /> m_gridAddOn.SetColumnCount(4);<br />m_gridAddOn.SetFixedColumnCount(0);<br />m_gridAddOn.SetFixedRowCount(1);<br />m_gridAddOn.SetColumnWidth(0, 95);<br />m_gridAddOn.SetColumnWidth(1, 95);<br />m_gridAddOn.SetColumnWidth(2, 70);<br />m_gridAddOn.SetColumnWidth(3, 145);<br />m_gridAddOn.SetItemText(0, 0, _T("Application"));<br />m_gridAddOn.SetItemText(0, 1, _T("Status"));<br />m_gridAddOn.SetItemText(0, 2, _T("Action"));<br />m_gridAddOn.SetItemText(0, 3, _T("Auto-Start"));<br />m_gridAddOn.InsertRow(_T("item"));<br />m_gridAddOn.SetItemText(0, 0, _T("Simulator"));<br />m_gridAddOn.SetItemText(0, 1, _T("Stop"));<br />m_gridAddOn.SetItemText(0, 2, _T("Start"));<br /> if (!m_gridAddOn.SetCellType(0, 2, RUNTIME_CLASS(CGridCellButton)))<br />return NULL;<br />m_gridAddOn.SetItemText(0, 3, _T(""));<br />
效果如下: