MFC中Invalidate(); 和UpdateWindow();的用法

1.

Invalidate()是强制系统进行重画,但是不一定就马上进行重画。因为Invalidate()只是通知系统,此 时的窗口已经变为无效。强制系统调用WM_PAINT,而这个消息只是Post就是将该消息放入消息队列。当执行到WM_PAINT消息时才会对敞口进行重绘;
UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT;
当调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列;
如果调用Invalidate之后想马上更新屏幕,那就加上UpdateWindow()这条语句


2.

和楼上差不多:Invalidate()使窗口客户区无效,并向消息队列中寄送一个WM_PAINT消息,假如此时消息队列中没有要处理的其他消息,则此时窗口立即会重绘(因为WM_PAINT会立即得到处理),如果消息队列中有其他消息,那么WM_PAINT就排队等呗。。。。这样就可能会存在一个不能即时刷新窗口的问题;
UpdateWindow()绕过消息队列(不进队),直接向窗口客户区发送WM_PAINT消息,使得窗口立即更新。


3.

单独的Invalidate(); 在窗口要重绘时用
和Invalidate();UpdateWindow();通常在程序开始时用



4.要注意UpdateWindow()和 UpdateData()的区别

UpdateData()一般是更新编辑框中的数据,

UpdateWindow()是更新整个窗口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值