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)運行結果如下:
附件列表
