我在文档类的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提示: "显示非预期的文件格式! "
请各位高手帮帮忙!
(新建一个工程不实现任何功能时上面的代码没有问题,当我加入画图功能后就不行了...
问题可能出在什么地方呢,还请各位大哥帮帮忙!急急急.......)
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提示: "显示非预期的文件格式! "
请各位高手帮帮忙!
(新建一个工程不实现任何功能时上面的代码没有问题,当我加入画图功能后就不行了...
问题可能出在什么地方呢,还请各位大哥帮帮忙!急急急.......)
是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();
我先仔细看一下程序中用到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();
}
}
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操作不是很熟悉,建议先不要写这么复杂的程序,先看看简单的,掌握一些基本的原则性的东西。
"问题: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哥请教,谢谢!
BOOL bMakeVisible)
{
InitialUpdateFrame(pFrame, pDocument, bMakeVisible);//AA
}还是找不到错在哪里....
我在serialize()函数打开文件(ar>>tmp;)处设置断点进行调试,跟踪到系统代码(如上)AA处开始提示断言失败.
郁闷啊大家帮帮忙解决问题是关键,小弟不惜奉上所有分数!
谢谢......
bmap.DeleteObject();你刚将bmap选入pDLMemDC,然后就DeleteObject,那怎么行呢?
谢谢大家的帮忙,
tao 请接分(能留下你的QQ吗?)!