我要把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.   

    CMyPage1::OnInitDialog()函数里面的代码贴出来看看,明天我再来。
      

  2.   

    我试过了,其实跟CMyPage1::OnInitDialog()里的初始化代码没有关系。
    现在只要加到第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
    }
      

  3.   

    呵呵,不知道我用的是否和你一样的GridCtrl,我是这样用的:void CMyDlg::DoDataExchange(CDataExchange* pDX)
    {
    //{{AFX_DATA_MAP(CZbtjbDlg)
    //}}AFX_DATA_MAP
    DDX_GridControl(pDX,IDC_CUSTOM_GRID,m_wndGrid);
    }DDX_GridControl是GridCtrl自己定义的一个控件子类化函数,在GridCtrl.h中定义。
      

  4.   

    谢谢,已经找出问题了。
    原来不是我的错误,是程序做的太大了,加上这个后需要rebuild all一次,不然可能和从前build的发生冲突!
    这个错误找了4、5天了,经验不足呀:)
    还是很谢谢你的热情,这帖子的分都给你,但偶就不另开帖子了,呵呵。