invalidate函式的總結
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呼叫之後的語句。
(windows程式設計第5版 p98)
updatedata()順便說下,這個函式不是重新整理介面用的。
updatedata();引數為false時,將介面上控制項繫結的變數的資料導到控制項內,引數為true時,匯入方向則相反。
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 函式用法
invalidate false 不擦除背景,直接畫 invalidate true 擦除背景 invalidaterect只是增加重繪區域,在下次wm paint的時候才生效 invalidaterect函式中的引數true表示系統會在你畫之前用背景色將所選區域覆蓋一次,預設背景色為白色,可以通過...
剪裁區域和Invalidate函式
剪裁區域 在onpaint函式中有乙個引數是paineventargs型別,這個類中儲存了乙個矩形,這個矩形就是所謂的剪裁區域。剪裁區域就是視窗上的無效區域,也就是要重繪的區域。這個區域的大小是由wm paint訊息決定的。而能產生這個訊息的機制有很多,比如 當窗體部分被其他窗體覆蓋時,這時就會產生...
函式 使用函式指標操作函式
設計乙個名為calculate 的函式,他接受兩個double 值和乙個指向函式的指標,而被指向的函式接受兩個double引數,並返回乙個double值 calculate 函式的型別也是double,並返回被指向的函式值用calculate 的兩個double引數計算得到的值。例如,假設add 函...