我做了一个Config的程序,其功能是配制我的应用系统的参数。其中有一个对象,是我自己定义的从CPropertySheet派生出来的类:在Control.CPP中
CAllControlsSheet allcontrolsheet;
mpMainWnd = &allcontrolsheet;
allcontrolssheet.DoModal();
在AllcontrlsSheet.CPP中
CAllControlsSheet : pulic CpropertySheet
{public:
   CAPage m_APage;
   CBPage m_BPage;
   CCPage m_CPage;
   ..........   一共十个页。
}在这个类的构造函数中,将所有的页PAGE加入到该SHEET中:
CAllControlsSheet : CAllControlsSheet()
{
    AddPage(m_APage);
    AddPage(m_BPage);
    AddPage(m_CPage);
    ..........
}该类中有个涵数负责把一个二进制配置文件读入内存,并且确定每个页面上的各种控件的初始值,并且有个涵数负责把各个控制件的设定值转换回内存,并且把这个2K的内存结构,写入数据文件。现在问题出在这个把控件转换成内存结构的过程中,我用
   m-APage.UpdateData();
   m_BPage.UpdateData();
   m_CPage.UpdateData();
  .......
来进行控件和控件的变量的数据更新,每每运行在此,总在这个位置上出错。用DEBUG看,在MFC\SRC\WINCORE.CPP上的这个地方:
BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
{
    ASSERT(::IsWindow(m_hWnd))
上出现错误信息,而m_hWnd总是为零的。而且第一个
m_APage.UpdateData()常常不出错,就是第二个开始有问题,请大家看看我的这个令人头痛的问题,是不是该象楼下的那位重装VC?谢谢你的阅读!

解决方案 »

  1.   

    呵呵,又是你呀!
    我认为,你最好不要在构造函数种调用,因为在构造函数中CAllControlsSheet 的窗口还未产生,而属性页的父窗口就是属性表,当然会出现无效的窗口句柄呀!
    建议你在CAllControlsSheet 的InitDialog函数中如下调用
    {
       m-APage.UpdateData();
       m_BPage.UpdateData();
       m_CPage.UpdateData();
       .
       .
       .
       //此处读配置文件
       //不要调用每个属性页的UpdateData()函数
    }在每个属性页的InitDialog函数中调用UpdateData(),试试看看如何
      

  2.   

    上面的
    {
       m-APage.UpdateData();
       m_BPage.UpdateData();
       m_CPage.UpdateData();
       .
       .
       .
       //此处读配置文件
       //不要调用每个属性页的UpdateData()函数
    }
    错了将
    m-APage.UpdateData();.....
    都改为
    AddPage(...)
      

  3.   

    再要是不行就在每个属性页的OnSetActive(...)函数中调用
    UpdateDate(FALSE)
      

  4.   

    我认为只有创建成功的页面能够成功,所以可以在整个窗体显示之前,设置他们分别为当前页,我遇到过这样的问题,然后显示整个窗体,我的程序这样写的 pSheet = new CSheet;
    pSheet->Create();//NULL,WS_MINIMIZEBOX | WS_SYSMENU | WS_MINIMIZEBOX);
    //pSheet->m_hWnd = ::AfxGetApp()->GetMainWnd()->GetSafeHwnd();
    m_pMainWnd = pSheet;
    ((CSheet *)pSheet)->SetActivePage(&((CSheet *)pSheet)->m_page2);
    ((CSheet *)pSheet)->SetActivePage(&((CSheet *)pSheet)->m_page1);
    pSheet->ShowWindow(SW_SHOW);
    return TRUE;
      

  5.   

    一次应该是只有一个页面是acitve,所以要枚举
      

  6.   

    我的程序放在
    InitInstance中
      

  7.   

    我按照你的试了一下,最后的WINDOW只是一闪而过,是否可以用DOMODAL(), 我试了一下,不可以。
      

  8.   

    jennyvenus(JennyVenus) ( ) 信誉:98  2002-11-28 18:10:00  得分:0 
     
     
      我的程序放在
    InitInstance中
      
     
    我的做法是静态产生的,依照你的方法!我用SetActivePage去依此激活一遍,好象没有什么用!头痛呀! 
      

  9.   

    谢谢,我在ONINITDIALOG()中加入了以下简单句子就可以了!SetActivePage(m_APage);
    SetActivePage(m_BPage);
    SetActivePage(m_CPage);给你加分!