void Invalidate( BOOL bErase = TRUE );
該函數的作用是使整個視窗客戶區無效。視窗的客戶區無效意味着需要重繪,例如,如果一個被其它視窗遮住的視窗變成了前台視窗,那麼原來被遮住的部分就是無效的,需要重繪。這時Windows會在應用程式的消息隊列中放置WM_PAINT消息。MFC為視窗類提供了WM_PAINT的消息處理函數OnPaint,OnPaint負責重繪視窗。視圖類有一些例外,在視圖類的OnPaint函數中調用了OnDraw函數,實際的重繪工作由OnDraw來完成。參數bErase為TRUE時,重繪區域内的背景将被擦除,否則,背景将保持不變。
和 UpdateWindow( )差別在于:UpdateWindow( )的作用是使視窗立即重繪。調用Invalidate等函數後視窗不會立即重繪,這是由于WM_PAINT消息的優先級很低,它需要等消息隊列中的其它消息發送完後才能被處理。調用UpdateWindow函數可使WM_PAINT被直接發送到目标視窗,進而導緻視窗立即重繪
Invalidate(false)不擦除背景,直接畫
Invalidate(true)擦除背景
InvalidateRect隻是增加重繪區域,在下次WM_PAINT的時候才生效
InvalidateRect函數中的參數TRUE表示系統會在你畫之前用背景色将所選區域覆寫一次,預設背景色為白色,可以通過設定BRUSH來改變背景色。
Invalidate()之後:(MFC的,順便了)
OnPaint()->OnPrepareDC()->OnDraw()
是以隻是重新整理在OnPaint()和OnDraw()函數中的繪圖語句。其它地方沒有影響。
Invalidate标記一個需要重繪的無效區域,并不意味着調用該函數後就立刻進行重繪。類似于PostMessage(WM_PAINT),需要處理到WM_PAINT消息時才真正重繪。以為您Invalidate之後還有其他的語句正在執行,程式沒有機會去處理WM_PAINT消息,但當函數執行完畢後,消息處理才得以進行。
Invalidate隻是放一個WM_PAINT消息在隊列裡,不做别的,是以隻有當目前函數傳回後,進入消息循環,取出WM_PAINT,才執行PAINT,是以不管Invalidate放哪裡,都是最後的。
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調用之後的語句。
UpdateData()順便說下,這個函數不是重新整理界面用的。
UpdateData();參數為true時,将界面上控件綁定的變量的資料導到控件内,參數為false時,導入方向則相反