我要把codeproject上Chris Maunder写的MFC Grid Control: http://www.codeproject.com/miscctrl/gridtreectrl.asp
(以上为它的其中一个版本,可下载)
加入到属性页中(例子是加入到对话框中的)。加到对话框中没有问题,而加到属性页中却出现了各种各样的问题。
方法是这样的:
1,创建对话框资源,使之继承自CPropertyPage成为属性页。
2,在对话框上添加一个Custom Control,ID为IDC_CUSTOM1;Class为MFCGridCtrl。
3,在工程中加入以上Grid文件
4,在CMyPage1(第1步所建)头文件中加入:
CGridCtrl m_Grid;
5,CMyPage1::DoDataExchange()中加入:
DDX_Control(pDX, IDC_CUSTOM1, m_Grid);//将m_Grid与Custom Control相关联起来。
6,CMyPage1::OnInitDialog()进行Grid的初始化工作。编译都没有问题。
加入到对话框中OK;
加入到基于对话框.exe工程的“属性页”中看不到嵌入Custom Control的属性页;
加入到MFC的ActiveX工程中则出现内存错误。(估计与第二条的原因相同)不知为何。
哪位高手帮忙看一下啊?万分感谢!分不够的话可以再加。
(以上为它的其中一个版本,可下载)
加入到属性页中(例子是加入到对话框中的)。加到对话框中没有问题,而加到属性页中却出现了各种各样的问题。
方法是这样的:
1,创建对话框资源,使之继承自CPropertyPage成为属性页。
2,在对话框上添加一个Custom Control,ID为IDC_CUSTOM1;Class为MFCGridCtrl。
3,在工程中加入以上Grid文件
4,在CMyPage1(第1步所建)头文件中加入:
CGridCtrl m_Grid;
5,CMyPage1::DoDataExchange()中加入:
DDX_Control(pDX, IDC_CUSTOM1, m_Grid);//将m_Grid与Custom Control相关联起来。
6,CMyPage1::OnInitDialog()进行Grid的初始化工作。编译都没有问题。
加入到对话框中OK;
加入到基于对话框.exe工程的“属性页”中看不到嵌入Custom Control的属性页;
加入到MFC的ActiveX工程中则出现内存错误。(估计与第二条的原因相同)不知为何。
哪位高手帮忙看一下啊?万分感谢!分不够的话可以再加。
现在只要加到第5步就已经出现上述问题了。
我认为现在问题已经可以简化为:“在属性页中加入自定义控件”的问题了。
如果想看也行,不过不是太有必要:
BOOL CAIFBPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: Add extra initialization here
m_Grid.SetEditable(TRUE);
m_Grid.SetTextBkColor(RGB(0xFF, 0xFF, 0xE0)); m_ImageList.Create( MAKEINTRESOURCE(IDB_FOLDERS),
16, // pixel size
3,
RGB(255,255,255)); //"res"文件夹里,第三个图象为笔,代表可写数据
m_Grid.SetImageList(&m_ImageList); // seed tree data in some manner
unsigned char ucPatternAry[] =
{ 1,2,3,4,4,5,5,3,3,4,2,3,2};
unsigned char ucTreeLevelAry[ 4* chDIMOF( ucPatternAry) ]; int i1;
int iRow = 0;
ASSERT( chDIMOF( ucPatternAry) > 0);
for( i1=0; i1 < chDIMOF( ucTreeLevelAry) / chDIMOF( ucPatternAry); i1++)
{
int i2;
for( i2=0; i2 < chDIMOF( ucPatternAry); i2++)
{
ucTreeLevelAry[ iRow] = ucPatternAry[ i2];
iRow++;
}
} TRY
{
m_Grid.SetColumnCount( CTL_COLUMN_BEGIN + 4);
m_Grid.SetFixedColumnCount( FIXED_COLUMN_COUNT); m_TreeColumn.TreeSetup( &m_Grid, // tree acts on a column in this grid
TREE_COLUMN, // which column has tree
chDIMOF( ucTreeLevelAry), // total number of rows if tree totally expanded
FIXED_ROW_COUNT, // Set fixed row count now, too
ucTreeLevelAry, // Tree Level data array --
// must have aiTotalRows of entries
TRUE, // T=show tree (not grid) lines; F=no tree lines
TRUE); // T=use 1st 3 images from already set image list
// to display folder graphics
m_TreeColumn.SetTreeLineColor( RGB( 0, 0, 0xFF) );
}
CATCH (CMemoryException, e)
{
e->ReportError();
e->Delete();
return FALSE;
}
END_CATCH DWORD dwTextStyle = DT_RIGHT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS; // fill rows/cols with text
GV_ITEM Item;
int row;
int col;
for (row = 0; row < m_Grid.GetRowCount(); row++)
{
for (col = 0; col < m_Grid.GetColumnCount(); col++)
{
Item.mask = GVIF_TEXT|GVIF_FORMAT;
Item.row = row;
Item.col = col;
Item.nState = 0; if (row < FIXED_ROW_COUNT)
{
Item.nFormat = DT_LEFT|DT_WORDBREAK;
Item.strText.Format(_T("Column %d"),col);
}
else if (col == 0)
{
Item.nFormat = dwTextStyle;
Item.strText.Format(_T("Row %d"),row);
}
else if( col == TREE_COLUMN )
{
Item.mask = GVIF_TEXT|GVIF_FORMAT|GVIF_STATE; Item.nFormat = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS;
Item.strText.Format( "Level %i",
ucTreeLevelAry[ row - 1] );
Item.nState = GVIS_READONLY;
}
else if (col == CTL_COLUMN_BEGIN)
{
Item.mask = GVIF_TEXT|GVIF_FORMAT|GVIF_STATE;
Item.nFormat = DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS;
Item.strText = "Check Box";
}
else
{
Item.mask = GVIF_TEXT|GVIF_FORMAT|GVIF_STATE;
Item.nFormat = dwTextStyle;
Item.strText.Format(_T("%d"),row*col);
} // Since I'm setting up cells manually, I Must tell
// them about being a fixed column cell
if( col < FIXED_COLUMN_COUNT)
Item.nState |= GVIS_FIXED | GVIS_FIXEDCOL; m_Grid.SetItem(&Item); }
} m_TreeColumn.TreeDisplayOutline( UCHAR_MAX); return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
{
//{{AFX_DATA_MAP(CZbtjbDlg)
//}}AFX_DATA_MAP
DDX_GridControl(pDX,IDC_CUSTOM_GRID,m_wndGrid);
}DDX_GridControl是GridCtrl自己定义的一个控件子类化函数,在GridCtrl.h中定义。
原来不是我的错误,是程序做的太大了,加上这个后需要rebuild all一次,不然可能和从前build的发生冲突!
这个错误找了4、5天了,经验不足呀:)
还是很谢谢你的热情,这帖子的分都给你,但偶就不另开帖子了,呵呵。