GridCtrl学习笔记(1)建立使用GridCtrl的工程
1、同事给的和我在网上找的开源代码是一样的。
(我从http://www.codeproject.com/KB/miscctrl/gridctrl.aspx下载Keith Rule的源码,包括他的实例源码)
2、关于以下两个写法:
DDX_GridControl(pDX, IDC_GRIDCTRL, m_pGrid);//推荐
DDX_Control(pDX, IDC_GRIDCTRL, m_pGrid);
Grid的基本类是源于CWnd的CgridCtrl。为了使用它,你可以使用微软的 VC++的对话框编辑器,把一个普通的控件放在对话框上,并且输入"MFCGridCtrl"(不包括引号)作为类名。Grid的子类使用DDX机制(可以通过ClassWizard来进行默认设置),使用DDX_GridControl函数代替DDX_Control(可以通过手动设置 ClassWizard的输入来实现)。这些保证你的控件作为一个注册对象而不会产生一些莫名其妙的WIN95问题。
3、建立工程步骤:
(1)在rc中选择并添加custom control控件;
一定要把Class设置为MFCGridCtrl哦;
(2)在Dlg.h中做声明:
// GridControlTest02Dlg.h : header file
//
#pragma once
#include "GridCtrl_src/GridCtrl.h"
class CGridControlTest02DlgAutoProxy;
// CGridControlTest02Dlg dialog
class CGridControlTest02Dlg : public CDialogEx
{
DECLARE_DYNAMIC(CGridControlTest02Dlg);
friend class CGridControlTest02DlgAutoProxy;
// Construction
public:
CGridControlTest02Dlg(CWnd* pParent = NULL); // standard constructor
virtual ~CGridControlTest02Dlg();
CGridCtrl m_pGrid;
void GridCtrlInit();
// Dialog Data
enum { IDD = IDD_GRIDCONTROLTEST02_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
(3)在Dlg.cpp中做声明及添加初始化函数:
要注意了哦:要把声明放在对应的class里,我一开始放错了class,编译时无法通过,TAT,都是泪。
void CGridControlTest02Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_GridControl(pDX, IDC_GRIDCTRL, m_pGrid);
}
BOOL CGridControlTest02Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
ShowWindow(SW_MINIMIZE);
// TODO: Add extra initialization here
GridCtrlInit();
return TRUE; // return TRUE unless you set the focus to a control
}
voidCGridControlTest04Dlg::GridCtrlInit()
{
m_pGrid.SetEditable(true);
m_pGrid.SetTextBkColor(RGB(0xFF,0xFF,0xE0));//黄色背景
m_pGrid.SetRowCount(101);//初始为100行
m_pGrid.SetColumnCount(26);//初始化为25列
m_pGrid.SetFixedRowCount(1);//表头为一行
m_pGrid.SetFixedColumnCount(1);//表头为一列
for(int row =0; row < m_pGrid.GetRowCount(); row++)
for(int col =0; col < m_pGrid.GetColumnCount(); col++)
{
//设置表格显示属性
GV_ITEM Item;
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
m_pGrid.SetRowHeight(row,25);//设置各行高
m_pGrid.SetColumnWidth(0,64);//设置0列宽
m_pGrid.SetColumnWidth(col,64);//设置各列宽
if(row==0&&col==0)//第(0,0)格
{
Item.nFormat = DT_CENTER|DT_WORDBREAK;
Item.strText.Format(_T("报表显示"),col);
}
elseif(row <1)//设置0行表头显示
{
Item.nFormat = DT_CENTER|DT_WORDBREAK;
Item.strText.Format(_T(" 项目%d"),col);
}
elseif(col <1)//设置0列表头显示
{
if(row< m_pGrid.GetRowCount())
{
Item.nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS;
Item.strText.Format(_T("第%d次"),row);
}
}
else
{
Item.nFormat = DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS;
Item.strText.Format(_T(""),2);
}
m_pGrid.SetItem(&Item);
}
}
(4)把源码整个文件夹复制到E:\LHL\Work\ProjectsDebug\SE\Visual Studio 2010\Projects\GridControlTest02\GridControlTest02
然后建立文件夹存放cpp及h文件
解释:
gridctrl.cpp, gridctrl.h Grid控件资源文件和头文件
gridcellbase.cpp, gridcellbase.h 单元格的基础类
gridcell.cpp, gridcell.h 单元格的默认执行文件
CellRange.h CcellID和CcellRange类的定义
MemDC.h Keith Rule's的直接存储类
InPlaceEdit.cpp, InPlaceEdit.h 定位编辑窗口的源文件和头文件
GridDropTarget.cpp, GridDropTarget.h Grid容器的drag和drop对象 只有在gridctrl.h中没有定义 GRIDCONTROL_NO_DRAGDROP的时候才有必要使用。
Titletip.cpp, Titletip.h 从Zafir Anjum那里的到的单元格标题提示. 只有在gridctrl.h中没有定义 GRIDCONTROL_NO_TITLETIPS 的时候才有必要使用
(5)运行结果如下:
附件列表