我在文档类的serialize()函数中写如下代码:  
if(ar.isstoring())  
{  
int  a=10;  
ar <<a;  
}  
else  
{  
int  b;  
ar  >>b  
}  
打开存储文件时系统提示出错  
错误如下:  
Program:    <program_name  >  
File:  wingdi.cpp  
Line:  109  
 
把上面代码改写如下:  
if(ar.isstoring())  
{  
int  a=10;  
ar  <<a;  
}  
else  
{  
int  b1,b2;  
ar  >>b1;  
ar  >>b2;  
}  
可以运行,但是弹出Messagbox提示:  "显示非预期的文件格式!  "    
请各位高手帮帮忙!  
 
(新建一个工程不实现任何功能时上面的代码没有问题,当我加入画图功能后就不行了...
问题可能出在什么地方呢,还请各位大哥帮帮忙!急急急.......)

解决方案 »

  1.   

    wingdi.cpp
    是GDI操作方面的,你的问题明显出在画图上,所以你贴的代码是没有用的。
    wingdi.cpp文件的109行你为什么不打开来看看呢?它是一个断言:
    BOOL CDC::Attach(HDC hDC)
    {
    ASSERT(m_hDC == NULL);      // only attach once, detach on destroy
    ASSERT(m_hAttribDC == NULL);    // only attach to an empty DC if (hDC == NULL)
    return FALSE;
    CHandleMap* pMap = afxMapHDC(TRUE); // create map if not exist
    ASSERT(pMap != NULL);
    pMap->SetPermanent(m_hDC = hDC, this); SetAttribDC(m_hDC);     // Default to same as output
    return TRUE;
    }就是上面的ASSERT(m_hDC == NULL);这句。
    很明显,你是在多次创建GDI对象时,没有删除掉以前的,举个例子:
    CPen pen;
    pen.CreatePen(...);
    //使用pen
    pen.CreatePen(...); //又一次调用,出错正确的做法是在第二次CreatePen之前,先pen.DeleteObject();
      

  2.   

    把你有关于CDC,CClientDC,CMetaFileDC,CPaintDC,CWindowDC类的操作的代码贴出来看看。
      

  3.   

    TAO哥分析的如些详细,不胜感激!
    我先仔细看一下程序中用到DC的地方,
    搞不定的话再来打扰.....
     
        结贴时一定奉上分数!  谢....
      

  4.   

    我对用到的DC作了修改现在的错误提示变成了:
    debug assertoin fialed!
    Program:    <program_name  >  
    File:  wincore.cpp  
    Line:  628又是哪里出了问题????
    主要相关代码如下:
    void CMyPaintView::MDrawAllMap()
    {
    CClientDC dc(this); //创建内存DC
    pDLMemDC.CreateCompatibleDC(&dc); CBitmap bmap;
    CRect rect;
    GetClientRect(&rect);
    bmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
    pDLMemDC.SelectObject(&bmap); //删除bmap
    bmap.DeleteObject();
    //用白色填充当前画布
    pDLMemDC.FillSolidRect(&rect, 0x00FFFFFF); //画二极管
    CMyPaintView::MDrawCompontToDC(); //******调用画图函数A
    //画线
    CMyPaintView::MDrawLine(); //******调用画线函数B  
    //将内存DC中的图像显示到客户区
    dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),
    &pDLMemDC,rect.left,rect.top,SRCCOPY); //删除pDLMemDC
    pDLMemDC.DeleteDC();

    //********************************************}
    void CMyPaintView::MDrawCompontToDC()                  //*************画图函数A
    {
      
    //显示无删除记录元件图
    if (!compont[selectcompont][j].ismapdeleted)
    {
    CDC MemDC;
    CBitmap   *MypBitmap; 
    HBITMAP bm;
    bm = ::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE (compontbitmapid[selectcompont])) ;
    MypBitmap = new CBitmap;   
    MypBitmap->Attach(bm);   
    //MypBitmap   =   CBitmap::FromHandle(hBitmap);   
    //上述二句话实际效果完全相同.  MemDC.CreateCompatibleDC(&pDLMemDC);         
    MemDC.SelectObject(MypBitmap); 

    pDLMemDC.BitBlt(x,y, a,b,&MemDC,0,0,SRCCOPY);     //删除位图
       delete MypBitmap;
       //删除MemDC
       MemDC.DeleteDC();

       //设置阻值字体的显示
       LOGFONT lf;     
       CFont   font;   
       memset(&lf,0,sizeof(lf));   
       lf.lfHeight = 20 ;  
       lf.lfWeight = 0;    //可不设,默认   
       strcpy(lf.lfFaceName,"宋体") ;       font.CreateFontIndirect(&lf) ;
       //设置颜色
       pDLMemDC.SetTextColor(RGB(255,0,0));
       
       //设置背景为透明
       pDLMemDC.SetBkMode(TRANSPARENT);
       pDLMemDC.SelectObject(&font);
       font.DeleteObject();    CString msg;
       //显示元件阻值
       msg.Format("%d",compont[selectcompont][j].m_compontresistval);    
       pDLMemDC.TextOut(x,y,msg);      //lf.
       //设置结点字体显示   
       lf.lfHeight = 10;
       font.CreateFontIndirect(&lf) ;
       pDLMemDC.SelectObject(&font);
       pDLMemDC.SetTextColor(RGB(0,150,0));    //删除FONT
       font.DeleteObject();
       pDLMemDC.TextOut(x,y,msg); 
     
    }

    }

    void CMyPaintView::MDrawLine()//*****************画线函数B
    {

    for (int j=0;j<=linesnum;j++)
    {

    //从第一条开始重新画线
    for (int i=1;i<pointsnum[j];i++)
    {
    //此种创建画笔的方法可以自动释放资源
    CPen pnewpen;
    //pnewpen = new CPen;

    pnewpen.CreatePen(PS_SOLID,2,RGB(0,0,255));
    pDLMemDC.SelectObject(&pnewpen);

    pDLMemDC.MoveTo(drawlinepoint[j][i-1]);
    pDLMemDC.LineTo(drawlinepoint[j][i]); //删除画笔
    pnewpen.DeleteObject();
    //pnewpen.Detach();

    }


    }
          
    if (pointsnum[linesnum]>0)
    {

    //此种创建画笔的方法可以自动释放资源
    CPen pnewpen;
    //pnewpen = new CPen;
    pnewpen.CreatePen(PS_SOLID,2,RGB(0,0,255));
    pDLMemDC.SelectObject(&pnewpen); pDLMemDC.MoveTo(drawlinepoint[linesnum][pointsnum[linesnum]-1]);
    pDLMemDC.LineTo(currentmouspoint); //当击右键关闭画线功能时把鼠标当前值设为本次画线终点
    drawlinepoint[linesnum][pointsnum[linesnum]]=currentmouspoint; //删除画笔
    pnewpen.DeleteObject();
    //pnewpen.Detach();


    }
    }
      

  5.   

    问题太多了,建议单步调试或设置断点,我随便看了一下,比如:
    void CMyPaintView::MDrawAllMap()
    {
    CClientDC dc(this); //创建内存DC
    pDLMemDC.CreateCompatibleDC(&dc); CBitmap bmap;
    CRect rect;
    GetClientRect(&rect);
    bmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
    pDLMemDC.SelectObject(&bmap); //删除bmap
    bmap.DeleteObject();问题:MDrawAllMap()会不会多次调用呢?如果会多次调用,那么pDLMemDC.CreateCompatibleDC(&dc);将出错;bmap.DeleteObject();也有问题,你看看MSDN中关于DeleteObject的解释:
    An application should not call DeleteObject on a CGdiObject object that is currently selected into a device context. 
    注:CBitmap继承自CGdiObject。后面的我就没看了,代码太长了。
    你好像对GDI操作不是很熟悉,建议先不要写这么复杂的程序,先看看简单的,掌握一些基本的原则性的东西。
      

  6.   

    TAO哥说的没错, GDI方面的东西我是刚接触到的,很多画图操作都是从网上直接套用的,你上面所说:
    "问题:MDrawAllMap()会不会多次调用呢?如果会多次调用,那么pDLMemDC.CreateCompatibleDC(&dc);将出错;bmap.DeleteObject();也有问题,"不是太明白,在MDrawAllMap()
    {
    pDLMemDC.CreateCompatibleDC(&dc);//1
    bmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());//2
    .
    .
    bmap.DeleteObject();//2pDLMemDC.DeleteDC();//1
    }
    创建与删除一一对应,MDrawAllMap()被多次调用怎么会出问题呢!我先找下DGI方面的书看一下再向TAO哥请教,谢谢!
      

  7.   

    CDocument* CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,
    BOOL bMakeVisible)
    {
    InitialUpdateFrame(pFrame, pDocument, bMakeVisible);//AA
    }还是找不到错在哪里....
    我在serialize()函数打开文件(ar>>tmp;)处设置断点进行调试,跟踪到系统代码(如上)AA处开始提示断言失败.
    郁闷啊大家帮帮忙解决问题是关键,小弟不惜奉上所有分数!
    谢谢......
      

  8.   

    pDLMemDC.SelectObject(&bmap);//删除bmap
    bmap.DeleteObject();你刚将bmap选入pDLMemDC,然后就DeleteObject,那怎么行呢?
      

  9.   

    我重给打开文件菜单项增加一个消息函数,在消息函数里完在读文件功能.上面的问题就解决了.....还是MFC类之间的结构概念不清楚!
    谢谢大家的帮忙,
    tao 请接分(能留下你的QQ吗?)!