永发信息网

MFC 判断Invalidate(); 刷新画布

答案:2  悬赏:0  手机版
解决时间 2021-11-24 12:06
  • 提问者网友:聂風
  • 2021-11-24 04:45
MFC 判断Invalidate(); 刷新画布
最佳答案
  • 五星知识达人网友:神也偏爱
  • 2021-11-24 05:28
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程序设计》前面几章讲消息处理的。追问我用别的方式解决了,建一个跟画布大小一样的空白背景,有需要重绘就先刷新这块背景,再进行重绘就好了,也比较可控制
但现在有个新问题,读档出来重绘的图是会被覆盖没错,但只要一做其他绘图动作刷新了画面,重绘的图就又出现了

因为重绘的值还是在,现在是将读档的绘图参数清空并重绘(可行,但操作有严迟3~5秒,猜测应该是回圈清空读档值又重绘读档值造成的),有更好的做法吗!?追答绘图操作全部都是在OnPaint里面进行的。不是很明白你的叙述。触发重绘有几种条件:
像Invalidate这种属于显示地调用。
一般当窗口被遮住,恢复的时候,会自动重绘。
窗口尺寸发生变化的时候,也都会自动重绘。
全部回答
  • 1楼网友:千杯敬自由
  • 2021-11-24 06:39
用GetClipBox判断需要刷新的区域
然后跟你需要刷新的区域进行比较,就可以知道是否需要刷新你移动的位置之外的图形了。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯