断言错误 在ASSERT(m_hObject == NULL)

xue_yang 2010-05-16 03:12:34
在自己的重绘函数中产生这样的断言错误。在重绘函数中创建一个字体,然后在对话框中显示字符串,输出是正确的。但是在程序中增加满足相应条件后就把对话框中的静态文本隐藏后就出现了以上的断言错误,其中静态文本是自定义的类。重绘函数代码如下:
pDC->SetBkColor(RGB(0,0,0));
pDC->SetTextColor(RGB(128,255,0));
bodyfont.CreatePointFont(124,_T("宋体"),pDC);
pDC->SelectObject(&bodyfont);
for (int i=0;i<25;i++)
{
CPoint pt(35,i*16+80);
CSize sz(720, 16);
CRect rect(pt, sz);
pDC->DrawText(st_data[i],rect,DT_LEFT);
}
bodyfont.DeleteObject();
大家帮忙看看,不甚感激!
...全文
786 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xue_yang 2010-05-17
  • 打赏
  • 举报
回复 1
[Quote=引用 16 楼 arong1234 的回复:]
因为如果你使用类成员对象,你就必须确保在使用前DeleteObject倍调用成功。恐怕你函数在DeleteObject方面有可能失败或者根本没调用过

引用 14 楼 xue_yang 的回复:
引用 12 楼 arong1234 的回复:
谢谢,我的就是类成员变量,可是为什么不能是类成员呢?看来还有好多东东要学呢
[/Quo]
谢谢雷人!问题解决,正如你所说,分都给你了。
arong1234 2010-05-16
  • 打赏
  • 举报
回复 1
因为如果你使用类成员对象,你就必须确保在使用前DeleteObject倍调用成功。恐怕你函数在DeleteObject方面有可能失败或者根本没调用过
[Quote=引用 14 楼 xue_yang 的回复:]
引用 12 楼 arong1234 的回复:
谢谢,我的就是类成员变量,可是为什么不能是类成员呢?看来还有好多东东要学呢[/Quote]
xue_yang 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wltg2001 的回复:]
是这样的把定义字体和选入设备描述表和从设备描述表中删除的三条语句删除后就可以了,但是我需要修改字体啊!代码很长
============
即使这样也不一定就能断定是那三条语句的问题。
[/Quote]
应该是的,因为在堆栈中调试是bodyfont的object不是NULL
xue_yang 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 arong1234 的回复:]
确保bodyfont是临时变量,不要是类成员变量或者static变量

引用 10 楼 xue_yang 的回复:
引用 7 楼 visualeleven 的回复:
引用 3 楼 xue_yang 的回复:
引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

CFont类之前是不是……
[/Quote]
谢谢,我的就是类成员变量,可是为什么不能是类成员呢?看来还有好多东东要学呢!
wltg2001 2010-05-16
  • 打赏
  • 举报
回复
是这样的把定义字体和选入设备描述表和从设备描述表中删除的三条语句删除后就可以了,但是我需要修改字体啊!代码很长
============
即使这样也不一定就能断定是那三条语句的问题。
arong1234 2010-05-16
  • 打赏
  • 举报
回复
确保bodyfont是临时变量,不要是类成员变量或者static变量[Quote=引用 10 楼 xue_yang 的回复:]
引用 7 楼 visualeleven 的回复:
引用 3 楼 xue_yang 的回复:
引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

CFont类之前是不是已经关联过字体Object了。。。

没有耶!
[/Quote]
arong1234 2010-05-16
  • 打赏
  • 举报
回复
我估计bodyfont.CreatePointFont(124,_T("宋体"),pDC);根本就是失败的,你不检查返回值就直接使用,是非常危险的
至少写成
if(!bodyfont.CreatePointFont(124,_T("宋体"),pDC))
{
TRACE(_T("Cannot create fond:%d\n"), GetLastError());
return;
}

另外:这个函数的第一个参数应该是实际高度的10倍,124不是10的整数倍,是不撒有问题?
xue_yang 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 visualeleven 的回复:]
引用 3 楼 xue_yang 的回复:
引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。

CFont类之前是不是已经关联过字体Object了。。。
[/Quote]
没有耶!
xue_yang 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qifa 的回复:]
光从你贴出来的代码, 看不出什么问题, 既然出现断言失败, 你看看调用堆栈, 问题的出现是在哪个函数, 哪条语句, 贴出相关代码出来看看
[/Quote]
是这样的把定义字体和选入设备描述表和从设备描述表中删除的三条语句删除后就可以了,但是我需要修改字体啊!代码很长……
xue_yang 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jennyvenus 的回复:]
换个字体行吗?
[/Quote]
这个倒没试过,试试看……
Eleven 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xue_yang 的回复:]
引用 1 楼 happyparrot 的回复:
在堆栈中看是以上哪个语句产生的断言错误。

CFont类的创建和使用出问题了,但是不知道哪有问题。
[/Quote]
CFont类之前是不是已经关联过字体Object了。。。
qifa 2010-05-16
  • 打赏
  • 举报
回复
光从你贴出来的代码, 看不出什么问题, 既然出现断言失败, 你看看调用堆栈, 问题的出现是在哪个函数, 哪条语句, 贴出相关代码出来看看
用户 昵称 2010-05-16
  • 打赏
  • 举报
回复
换个字体行吗?
xue_yang 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qifa 的回复:]
虽然没看懂LZ的意思
但是你的代码:
pDC->SelectObject(&bodyfont);
//.....
bodyfont.DeleteObject();
就是有问题的
你应该这样:
CFont* pOldFont = pDC->SelectObject(&bodyfont);
//...
pDC->SelectObject(pOldFont);
b……
[/Quote]
谢谢,这样我也试过了,但是还是有问题!如果没有隐藏静态文本控件的时候输出是正确的,但是当隐藏控件后,才有这个断言……
xue_yang 2010-05-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happyparrot 的回复:]
在堆栈中看是以上哪个语句产生的断言错误。
[/Quote]
CFont类的创建和使用出问题了,但是不知道哪有问题。
qifa 2010-05-16
  • 打赏
  • 举报
回复
虽然没看懂LZ的意思
但是你的代码:
pDC->SelectObject(&bodyfont);
//.....
bodyfont.DeleteObject();
就是有问题的
你应该这样:
CFont* pOldFont = pDC->SelectObject(&bodyfont);
//...
pDC->SelectObject(pOldFont);
bodyfont.DeleteObject();//如果bodyfont是本地变量, CFont 的实例析构时, 会自动调用, 不用多此一举
快乐鹦鹉 2010-05-16
  • 打赏
  • 举报
回复
在堆栈中看是以上哪个语句产生的断言错误。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧