永发信息网

MFC 判断Invalidate(); 刷新画布

答案:2  悬赏:0  手机版
解决时间 2021-11-24 12:06
MFC 判断Invalidate(); 刷新画布
最佳答案
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这种属于显示地调用。
一般当窗口被遮住,恢复的时候,会自动重绘。
窗口尺寸发生变化的时候,也都会自动重绘。
全部回答
用GetClipBox判断需要刷新的区域
然后跟你需要刷新的区域进行比较,就可以知道是否需要刷新你移动的位置之外的图形了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
用心做好这件事记叙文
利虽有但存心讼宜和婚有约求解?
右甸西路邮政营业室地址在什么地方,想过去办
2ol5年1o月的黄道吉日是那一天
翻译:并分析句子结构: Long before children
后宫KTV地址在什么地方,想过去办事,
全球邮政特快专递(宝达路)地址在什么地方,想
铁香皂怎么用?
单片机程序解读
恕可与组什么词
2018~2019学年全国高三大联考第二次月考卷子
合阳北火车站一天有几趟客车
怎么不能办理38元以下基础套餐
北京南站如何步行到永定门长途汽车站?
晋江市五通驾校地址在哪,我要去那里办事,
推荐资讯
您好,您还知道CPEE PMC CPG 是什么公司,它
dnf天空8 这么丑 透明翅膀哪来的?
昨晚和喜欢的男孩过了中秋,吃饭唱歌,走错方
公务员面试题:你是教委人员,由你负责对中小
桥长六米,拱高八十,半径是多少
强迫油循环风冷变压器的油速越快越好吗?
大帝学校(花卉园校区)地址在什么地方,我要处
求电影死 侍 中文版资源,谢谢!!
在哪办理塘沽学校大街面馆营业执照
下表中给出的是平行四边形的底和高,算出每个
win10如何校准显示器颜色
路灯布线可以走天空么
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?