CFormView中添加MsFlexGrid控件,并关联控件变量m_flexgridup.
void CBDlg::OnBDlgOk()
{
CDialog::OnOK();
        CAView spk;
spk.SetFlexGridUp();
}
void CAView::OnInitialUpdate() 
{
CFormView::OnInitialUpdate();
AfxEnableControlContainer();
}
void CAView::SetFlexGridUp()
{
        CRect rect;
  m_flexgridup.GetWindowRect(&rect);
m_flexgridup.Create(NULL,WS_CHILD|WS_VISIBLE,rect,this,IDC_MSFLEXGRID2);
m_flexgridup.SetCols(x+1);//x为全局变量
m_flexgridup.SetRows(x+100);
m_flexgridup.SetTextMatrix(0,0,"次\\元");
for (int k=1;k<x+1;k++)
{
m_flexgridup.SetColWidth(k,(rect.Width()/(x+1);
m_flexgridup.SetTextMatrix(0,k,"a");
}
}
错误在哪里?调试通过,运行有问题。

解决方案 »

  1.   

    m_flexgridup.Create(NULL,WS_CHILD|WS_VISIBLE,rect,this,IDC_MSFLEXGRID2); 
    这句去掉吧,它是在动态生成时用的,CFormView不需要。
      

  2.   

    我也赞成
    m_flexgridup.Create(NULL,WS_CHILD|WS_VISIBLE,rect,this,IDC_MSFLEXGRID2); CDialog::OnOK(); 动态生成时用的
    但是这里是否有问题呢?
            CAView spk; 
    spk.SetFlexGridUp(); 
      

  3.   

    void CBDlg::OnBDlgOk() 

    CDialog::OnOK(); 
            CAView spk; 
    spk.SetFlexGridUp(); 

    工程是基于文本的吧?CBDlg类是一个对话框的类吧?如果都是的话,按我的理解是有问题的
    最好在CBDlg类的声明公有变量:CAView *spk;
    在CAView 类中定义CBDlg对象时把传递指针给它
    CBDlg dlg;
    dlg.spk=this;在CBDlg中就可以这样用:
    spk->SetFlexGridUp(); 
      

  4.   

    别忘了在CBDlg类中的构造函数中先要写上:
    spk=NULL;
    void CBDlg::OnBDlgOk() 

       spk->SetFlexGridUp(); 
       CDialog::OnOK(); 

      

  5.   

    不需要在CAView中使用CBDlg对象,暂时没有这么使用,而是在CBDlg中使用CAView的对象,成员函数。
    先谢。
      

  6.   

       引用cnzdgs大侠的回答:   视图对象和视图窗口是相关联的,访问哪个视图窗口就要先获取哪个视图对象的指针,不能随便构造一个对象来访问。如果是单文档视图项目,可以用AfxGetMainWnd函数获得主窗口指针,将该指针转换为CFrameWnd*类型,再用该指针调用GetActiveView函数获得活动视图指针,再将其转换为CAView*类型来使用。对于其它架构项目方法类似。 另外,AfxEnableControlContainer应该在程序初始化时调用。 
       兄弟,如果看不懂,再多看看书。