InvalidateRect(hWnd,&rect,TRUE);向hWnd窗体发出WM_PAINT的消息强制客户区域重绘制,rect是你指定要刷新的区域此区域外的客户区域不被重绘,这样防止客户区域的一个局部的改动而导致整个客户区域重绘而导致闪烁,如果最后的参数为TRUE则还向窗体发送WM_ERASEBKGND消息,使背景重绘当然在客户区域重绘之前。
UpdateWindow只向窗体发送WM_PAINT消息在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无鈳绘制的客户区域,如果没有则不发送WM_PAINT。如果希望立即刷新无效区域可以在调用InvalidateRect之后调用UpdateWindow,如果客户区的任一部分无效则UpdateWindow将导致Windows用WM_PAINT消息调用窗口过程(如果整个客户区有效,则不调用窗口过程)这一WM_PAINT消息不进入消息队列,直接由WINDOWS调用窗口过程窗口过程完成刷新以後立刻退出,WINDOWS将控制返回给程序中UpdateWindow调用之后的语句
我觉得按照上面的解释, InvalidateRect函数产生的是非队列消息WM_paint,他这里也说了:向hWnd窗体发出WM_PAINT的消息强制客户区域重绘制,那么实际上就立即刷新无效区域了啊为什么后面说如果希望立即刷新无效区域,可以在调用InvalidateRect之后调用UpdateWindow感觉这鈈是多此一举吗?请知道的告诉下谢谢了
- 你的回答被采纳后将获得:
- 系统奖励15(财富值+成长值)+难题奖励10(财富值+成长值)+提问者悬赏30(财富值+成长值)