Invalidate抛异常,大虾帮忙

fyz2841585 2010-12-28 10:56:31
fiel:afxwin2.inl
line:126
这个异常可以忽略。
代码如下:
其中 class CImageWin : public CWnd
void API::BrushApi()//按钮响应
{

Butt=!Butt;


CImageWin *cmi =new CImageWnd ;
cmi->Invalidate(true);//执行到这里抛异常
}
void CImageWin::OnPaint()
{
.
.
.

m_pImage->Draw//显示图像 .
.
.
if(m_pImage != NULL&&Butt!=true)
{
mdc.MoveTo(10,10); //在图像上划线[color=#FF0000][/color]
mdc.LineTo(1,100);
}
}
...全文
350 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
手机写程序 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fyz2841585 的回复:]
引用 9 楼 eyey1 的回复:
引用 6 楼 happyparrot 的回复:
那你倒是把代码贴出来啊?你前后环境都不告知,就来个函数问怎么异常???这个函数是微软写的。
你要说清楚出现什么异常,然后自己在这句加断点,看看cmi指针的内容有没有异常,比如为空,或者m_hWnd为空等等。或者cmi在之前已经被你delete掉,或者窗口已经被关闭掉。原因很多,全看你自己隐掉的这些代码都干了什……
[/Quote]
求代码.
schlafenhamster 2010-12-28
  • 打赏
  • 举报
回复
要记录原来产生的 CImageWin 这里再new,不是一个新实例了?而且没窗口 *cmi =new CImageWnd !
向立天 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fyz2841585 的回复:]
引用 8 楼 visualeleven 的回复:
CImageWin *cmi =new CImageWnd ;
cmi->Invalidate(true);//执行到这里抛异常
----------------------------------------------
在调用cmi->Invalidate(true);之前,你先用
ASSERT(cmi->GetSafeHwnd())……
[/Quote]
你都没创建窗口就调用Invalidate怎么可能不出错
fyz2841585 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 visualeleven 的回复:]
CImageWin *cmi =new CImageWnd ;
cmi->Invalidate(true);//执行到这里抛异常
----------------------------------------------
在调用cmi->Invalidate(true);之前,你先用
ASSERT(cmi->GetSafeHwnd());看看会不会出现断言错误
[/Quote]
确实出现断言错误
fyz2841585 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 eyey1 的回复:]
引用 6 楼 happyparrot 的回复:
那你倒是把代码贴出来啊?你前后环境都不告知,就来个函数问怎么异常???这个函数是微软写的。
你要说清楚出现什么异常,然后自己在这句加断点,看看cmi指针的内容有没有异常,比如为空,或者m_hWnd为空等等。或者cmi在之前已经被你delete掉,或者窗口已经被关闭掉。原因很多,全看你自己隐掉的这些代码都干了什么。

好吧,你这样改就不会异常了……
[/Quote]
if(IsWindow(cmi->m_hWnd))这个判断为false,确实不刷新了
求高手帮忙
手机写程序 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 happyparrot 的回复:]
那你倒是把代码贴出来啊?你前后环境都不告知,就来个函数问怎么异常???这个函数是微软写的。
你要说清楚出现什么异常,然后自己在这句加断点,看看cmi指针的内容有没有异常,比如为空,或者m_hWnd为空等等。或者cmi在之前已经被你delete掉,或者窗口已经被关闭掉。原因很多,全看你自己隐掉的这些代码都干了什么。
[/Quote]
好吧,你这样改就不会异常了.但估计是不会刷新了.
void API::BrushApi()//按钮响应
{

Butt=!Butt;


CImageWin *cmi =new CImageWnd ;
if(IsWindow(cmi->m_hWnd))
cmi->Invalidate(true);//执行到这里抛异常
}
Eleven 2010-12-28
  • 打赏
  • 举报
回复
CImageWin *cmi =new CImageWnd ;
cmi->Invalidate(true);//执行到这里抛异常
----------------------------------------------
在调用cmi->Invalidate(true);之前,你先用
ASSERT(cmi->GetSafeHwnd());看看会不会出现断言错误
fyz2841585 2010-12-28
  • 打赏
  • 举报
回复
void CImageWin::OnLButtonDown(UINT nFlags, CPoint point)
{
Invalidate(true);//
}
这样倒是可以实现功能,我先点击按钮,然后再点击左键,才不抛异常。
如果我把Invalidate(true)写进API::BrushApi()函数就抛异常。
快乐鹦鹉 2010-12-28
  • 打赏
  • 举报
回复
那你倒是把代码贴出来啊?你前后环境都不告知,就来个函数问怎么异常???这个函数是微软写的。
你要说清楚出现什么异常,然后自己在这句加断点,看看cmi指针的内容有没有异常,比如为空,或者m_hWnd为空等等。或者cmi在之前已经被你delete掉,或者窗口已经被关闭掉。原因很多,全看你自己隐掉的这些代码都干了什么。
fyz2841585 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 eyey1 的回复:]
CImageWin *cmi =new CImageWnd ;
cmi->Invalidate(true);//执行到这里抛异常

你确定CImageWin的构造函数里窗口创建好了吗?我觉得不大可能,即使是你自己做的.Invalidate()里可能有iswindows()的判断.
[/Quote]
我已经显示图像了,只是想在图像上画个线而已,用按钮来操作,点击按钮可以让画线显示和消失。
当然已经窗口创建了,我没有把代码贴出而已
zjfhgdx 2010-12-28
  • 打赏
  • 举报
回复
好热闹
Eleven 2010-12-28
  • 打赏
  • 举报
回复
窗口和窗口类对象还没有关联起来,即窗口类的m_hWnd成员变量的值此时为NULL
zjfhgdx 2010-12-28
  • 打赏
  • 举报
回复
应该是楼上两位说的问题了
手机写程序 2010-12-28
  • 打赏
  • 举报
回复
CImageWin *cmi =new CImageWnd ;
cmi->Invalidate(true);//执行到这里抛异常

你确定CImageWin的构造函数里窗口创建好了吗?我觉得不大可能,即使是你自己做的.Invalidate()里可能有iswindows()的判断.
wzaen 2010-12-28
  • 打赏
  • 举报
回复
CImageWin是窗口么?没看到窗口创建的操作啊,直接Invalidate当然会出现错误了。。。
arong1234 2010-12-28
  • 打赏
  • 举报
回复
除了18楼说的,你还必须确保这个函数必须在这个窗口被创建的线程调用,不得尝试多线程
schlafenhamster 2010-12-28
  • 打赏
  • 举报
回复
m_pImage 是什么 ??

fyz2841585 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 happyparrot 的回复:]
你现在要做的是如何在API这个类中得到已经处于运行态的一个CImageWin类实例,[/Quote]
太感谢,我这就去找!
fyz2841585 2010-12-28
  • 打赏
  • 举报
回复
这个API类和已运行的CImageWin实例的位置关系:API是我自己建的工程,CImageWin为DLL里的东西
快乐鹦鹉 2010-12-28
  • 打赏
  • 举报
回复
我看你是先要好好思考一个问题,类和实例有什么区别?同一个类的两个实例是同一个东西吗???
你现在要做的是如何在API这个类中得到已经处于运行态的一个CImageWin类实例,而不是又去新建一个,那是两个不同的实例,虽然来自于同一个类。
问题是,你并没有交代清楚,这个API类和已运行的CImageWin实例的位置关系,别人就无法帮你解决问题。
加载更多回复(3)

16,472

社区成员

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

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

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