在vc++中 OnDraw()函数和 Invalidate()函数起啥作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在vc++中 OnDraw()函数和 Invalidate()函数起啥作用相关的知识,希望对你有一定的参考价值。

OnDraw()函数每当窗口发生重绘时就会执行,它其实跟消息处理函数OnPaint()差不多。当在View类里添加了消息处理函数OnPaint()时,OnPaint()就会覆盖掉OnDraw()。Invalidate()是使视图类窗口无效的函数,当要刷新视图时,就可以掉用它,以便发送一个WM_PAINT消息引起窗口的重绘。它有一个默认的参数TRUE,即Invalidate(TRUE)。 参考技术A 可以这样理解
Invalidate(TRUE)函数可以调用OnDraw ()函数;

所以当画图参数改变,你又想更新视图时,就可以使用Invalidate(TRUE)了。
有个前提,必须是绘图命令在OnDraw ()中直接或间接完成的。因为我们可以在很多其他函数中创建DC以实现画图
参考技术B vc++?是mfc吧?
看函数名应该是事件响应函数。就是说,你把你自己写的函数注册给这个函数,它会在该事件发生的时候调用你注册的函数
参考技术C OnDraw 负责画,如果要在设备对象上画东西,在这个函数里面。

Invalidate是通知视图重新绘制,也就是调用OnDraw
参考技术D Invalidate会产生一个WM_PAINT消息
WM_PAINT消息会调用OnDraw函数

VC++调试的基本快捷键

VS2012新建一个单文档工程;在视类CPP文件尾部添加一个sum()函数;

int sum()
    int i, sum=0;
    for(i=1; i<=100; i++)
        sum+=i;
    
    return sum;

在视类CPP文件头部添加sum()函数声明;在OnDraw()函数写如下代码;在如下图语句设置断点; 

 启动调试;停留到如下图;

按F11,这是逐语句调试,然后会进入sum()函数,

 

按F11会一直在此函数内部,

 

跳出函数按Shift+F11,返回到下图;

 

结束此次运行;重新启动调试,停留到 s1 = sum(); 这一句时,按F10,这是逐过程调试,不会进入sum()函数内,直接进到下一句;

 

 F11 - 逐语句,F10 - 逐过程,Shift+F11 - 从函数中跳出;

以上是关于在vc++中 OnDraw()函数和 Invalidate()函数起啥作用的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC SDI 应用程序中调用 OnDraw

VC++调试的基本快捷键

MFC中ONPAINT、ONDRAW、ONERASEBKGND等绘图函数的使用场合和作用、区别是啥啊?

Android:如何使用onDraw()函数在一个视图中绘制一个圆圈和一个按钮

MFC中啥时候调用OnDraw()函数?

OnDraw()函数问题