《Windows程序設計》讀書筆記------------->>輸出文字----繪製和更新

      實踐和理論等候是非常重要的,僅僅會輸出一行至但是不知道理論,出問題了也不知道問題出在什麼地方。雖然書上實現講理論後去實踐的,不過還是動動手比較有成就感,回過頭來看看了。

      事實上我們現在寫的程序也只會在程序中間那個白框框裏面繪圖,其他地方還沒學呢。

      

嗯,就是框框裏面了。這些東西都是通過WM_PAINT消息處理畫出來的。流程是這樣的:

(程序開始)------>[WM_PAINT畫畫]------>有改變------->[WM_PAINT畫畫]

 

一、什麼叫有改變呢?

在以下這些情況下,一定會產生WM_PAINT消息要求重畫:

  • 在使用者移動窗口或顯示窗口時,窗口中先前被隱藏的區域重新可見。
     
  • 使用者改變窗口的大小(如果窗口類別樣式有着CS_HREDRAW和CS_VREDRAW位旗標的設定)。
     
  • 程序使用ScrollWindow或ScrollDC函數滾動顯示區域的一部分。
     
  • 程序使用InvalidateRect或InvalidateRgn函數刻意產生WM_PAINT消息。

這些情況下程序不是在重畫而是將原來的圖像保存,之後直接將它恢復:

  • 鼠標光標穿越顯示區域。
     
  • 圖標拖過顯示區域。

而有一些是介於兩者之間的,就是有可能保存,不行就重畫:

  • Windows擦除覆蓋了部分窗口的對話框或消息框。
     
  • 菜單下拉出來,然後被釋放。
     
  • 顯示工具提示消息。

嗯,上面說的重畫的意思就是得到了一個WM_PAINT消息,引發了WM_PAINT之中的繪製代碼。這就告訴我們,當繪製的東西需要改變的時候,什麼時候它可以自動重新繪製,什麼時候要調用InvalidateRect。

 

二、畫畫說專業一點就是繪製了。而這個畫畫也是有不同的:

1、全部重畫:比如說當窗口從最小化還原的時候,所有的東西都不復存在了,所以窗口的所有內容都需要重畫。除此以外,使用者改變窗口的大小,程序使用InvalidateRect或InvalidateRgn函數刻意產生WM_PAINT消息。也是要全部重畫的。如果機子足夠卡,或者用斷點的方式可以看到這種方式下,繪製之前所有東西都消失了。

2、部分重畫:比如說窗口的一部分被另外的窗口遮擋,然後又顯露出來,這個時候就重畫顯露出來的那個部分。

而程序是通過設定“無效區域”,也就是“更新區域”的方式告訴WM_PAINT消息什麼部分要重畫什麼部分可以不花用原來的以加快運行程序。在下下節就可以在滾動條那裏看到它的應用,而且發現它就是儲存在ps裏面的。當全部重畫的時候,無效區域當然就是整個窗口了。部分重畫的時候就是顯露出來的部分。

 我自己通過MessageBox的方式測試就可以看到這種不同,因爲MessageBox似乎有斷點的性質,阻止下面的內容繼續畫下去,這樣就方便了我們看到哪些東西變白了。

 那個綠色框框裏面出現一般有一半沒有就是因爲,一開始我把一個蓋了一半的窗口拖開之後,它只要求繪製那一部分,但是被MessageBox攔截了,沒有畫成。後面那一半似乎是我換截圖程序的時候搞的。。。。。。。這個程序在後面有打包的整個工程,可以自己玩一下。而且到後面你會發現有些對話框會點了之後又彈一個出來,再點又不彈了,這個就是“有可能保存,不行就重畫”的表現吧(一開始我也不懂的,後來爲了寫這篇東東再看了一遍就發現問題了:)

文件在這裏了:http://dl2.csdn.net/down4/20070706/06104222215.rar

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章