MFC 判断Invalidate(); 刷新画布

该怎麼设一个程式去判断Invalidate();是否被执行?目前设了一个绘图程式,其中一个功能是点击移动图形但移动後的画布刷新会造成旧有的图跟著消失想设一个判断式去判定I... 该怎麼设一个程式去判断Invalidate();是否被执行?

目前设了一个绘图程式,其中一个功能是点击移动图形
但移动後的画布刷新会造成旧有的图跟著消失
想设一个判断式去判定Invalidate();是否被执行
若是执行Invalidate();刷新画布,就会将旧有绘图重绘一次
展开
 我来答
grf123
推荐于2016-01-24 · TA获得超过538个赞
知道小有建树答主
回答量:455
采纳率:80%
帮助的人:253万
展开全部
MFC实现机制不是你想的那样。
当调用Invalidate()之后,会向窗口发送一个WM_PAINT消息。
窗口的过程函数接收到WM_PAINT消息后,会调用OnPaint().
在OnPaint里,会进行绘图。
你的操作要放到OnPaint()消息响应函数里面。
更多追问追答
追问
那请问要如何判定是否有调用Invalidate(),而传出了WM_PAINT消息
或是其他更好的方式,来解决重绘的问题
追答
Invalidate()函数的作用是使整个窗口客户区无效,窗口客户无效即需要重绘,这时Window系统会发送一WM_PAINT.消息放在应用程序的消息队列中,但是WM_PAINT消息的优先级很低,所以不会立即重绘。但现在CPU速度是很快的,除非你有其他的消息在窗口线程进行无限循环。
如果需要立即重绘,那么就使用UpdateWindow( )函数,该函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。

如果实在要判断,可以定义一个成员变量m_bRedraw = False;
在调用Invalidate()之前,进行m_bRedraw = True.
之后在OnPaint中,检查这个变量:
if(m_bRedraw)
{
// Invalidate起作用了

m_bRedraw = False;

}

你的需求实在是,很莫名。我觉得你有必要去看看《Windows程序设计》前面几章讲消息处理的。
匿名用户
2014-11-12
展开全部
用GetClipBox判断需要刷新的区域
然后跟你需要刷新的区域进行比较,就可以知道是否需要刷新你移动的位置之外的图形了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式