OnDraw的重新绘制
相信有不少小伙伴在绘制图形过程中遇到过想刷新界面或者想重绘图形吧。我最近在做一个关于绘图的程序也遇到了这个问题。当然网上也有不少解决办法的问题,但是我感觉不太全面。下面我较为全面的分享一下我的解决办法。
1.Invalidate()
网上有些解决方法就是加一个Invalidate()或者Invalidate( BOOL bErase = TRUE ); 就好了,但是大多数是没用的,首先我们要知道Invalidate()是强制系统进行重画,但是不是马上进行重画。他的作用是先使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。因为Invalidate()只是通知系统,此 时的窗口已经变为无效。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。当执行到WM_PAINT消息时才会对窗口进行重绘。
2.UpdateWindow()
先判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果有,发送WM_PAINT消息。如果没有,则不发送WM_PAINT。它使窗口立即重绘。调用Invalidate函数后窗口不会立即重绘,由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用U