windows重绘机制原理
生活随笔
收集整理的這篇文章主要介紹了
windows重绘机制原理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.Windows程序中的繪制和更新
與DOS環境比較,Windows中的應用程序在處理文字和圖形繪制時有以下區別:
1.只能在窗口的客戶區域繪制文字和圖形
2.在窗口上繪制的內容不一定能夠保留到程序下一次有意地改寫時。
比如,當您的窗口被其他窗口覆蓋,Windows不會保存您的窗口,當其他窗口移開時,Windows會要求你自己重新繪制窗口。
二.WM_PAINT消息
Windows通過發送WM_PAINT消息通知窗口其部分顯示區域需要繪制。Windows給窗口發送WM_PAINT的時機也就是窗口需要進行繪制
的時機:
1.大多數程序在進入消息循環之前,通過調用UpdateWindow來給窗口過程發送一個WM_PAINT消息。
2.在以下幾種情況,Windows給窗口過程發送WM_PAINT消息:
·窗口中先前被隱藏的部分變得可見
·使用者改變窗口大小(設置了CS_HREDRAW和CS_VREDRAW)
·使用ScrollWindow或ScrollDC滾動顯示區的一部分
·使用InvalidateRect或InvalidateRgn可以產生WM_PATIN
在以下情況,Windows嘗試保留窗口內容,在以后需要的時候恢復。如果失敗,則產生WM_PAINT消息:
·Windows擦除了覆蓋部分窗口的對話框或消息框
·菜單彈出,然后釋放
·顯示工具提示消息
3.在下列情況,Windows總是保存被覆蓋的顯示區域,然后恢復他們:
·鼠標穿越顯示區域
·圖標拖過顯示區域
三.程序組織形式
程序應當僅在處理WM_PAINT消息時在顯示區域進行繪制。如果程序需要在其他時間更新顯示區域,可以強制Windows產生一個
WM_PAINT消息。
四.有效區域和無效區域
(一)概述
顯示區中需要重新繪制的區域叫做“無效區域”,包含“無效區域”所需的最小矩形叫做“無效矩形”。Windows內部為每個窗口
保存一個“繪圖信息結構”,用來保存窗口的無效區域、無效矩形以及一些其他信息。
當窗口存在“無效區域”時,Windows就會給窗體發送WM_PAINT消息。當一個WM_PAINT在消息隊列中還未處理,又有新的無效區域
增加時,Windows只是修改窗口的“繪圖信息結構”,把新的無效區域合并進去,并不給窗口發送新的WM_PAINT;同樣,如果一個
消息隊列中的WM_PAINT消息還未處理,窗口中不存在無效區域了(比如調用了ValidateRect刪除了所有無效區域),那么
WM_PAINT消息將會被移出消息隊列。
總之,消息隊列中至多有一個WM_PAINT消息。這樣設計的目的是盡量減少重繪的次數。
(二)增加和刪除無效區域
1.增加無效區域
·Windows會自動管理窗口的無效區域。
·可以通過調用InvalidateRect來將某個區域合并到窗體的無效區域中
·調用函數UpdateWindow會使整個客戶區無效
2.刪除無效區域
無效區域不會自動消失,除非調用某些可以刪除無效區域的函數
·處理WM_PAINT時,BeginPaint函數會使整個客戶區有效(刪除所有無效區域)
·ValidateRect函數可以使指定區域變得有效
3.獲取無效區域信息
·在處理WM_PAINT時
·調用GetUpdateRect來獲取無效區域
與DOS環境比較,Windows中的應用程序在處理文字和圖形繪制時有以下區別:
1.只能在窗口的客戶區域繪制文字和圖形
2.在窗口上繪制的內容不一定能夠保留到程序下一次有意地改寫時。
比如,當您的窗口被其他窗口覆蓋,Windows不會保存您的窗口,當其他窗口移開時,Windows會要求你自己重新繪制窗口。
二.WM_PAINT消息
Windows通過發送WM_PAINT消息通知窗口其部分顯示區域需要繪制。Windows給窗口發送WM_PAINT的時機也就是窗口需要進行繪制
的時機:
1.大多數程序在進入消息循環之前,通過調用UpdateWindow來給窗口過程發送一個WM_PAINT消息。
2.在以下幾種情況,Windows給窗口過程發送WM_PAINT消息:
·窗口中先前被隱藏的部分變得可見
·使用者改變窗口大小(設置了CS_HREDRAW和CS_VREDRAW)
·使用ScrollWindow或ScrollDC滾動顯示區的一部分
·使用InvalidateRect或InvalidateRgn可以產生WM_PATIN
在以下情況,Windows嘗試保留窗口內容,在以后需要的時候恢復。如果失敗,則產生WM_PAINT消息:
·Windows擦除了覆蓋部分窗口的對話框或消息框
·菜單彈出,然后釋放
·顯示工具提示消息
3.在下列情況,Windows總是保存被覆蓋的顯示區域,然后恢復他們:
·鼠標穿越顯示區域
·圖標拖過顯示區域
三.程序組織形式
程序應當僅在處理WM_PAINT消息時在顯示區域進行繪制。如果程序需要在其他時間更新顯示區域,可以強制Windows產生一個
WM_PAINT消息。
四.有效區域和無效區域
(一)概述
顯示區中需要重新繪制的區域叫做“無效區域”,包含“無效區域”所需的最小矩形叫做“無效矩形”。Windows內部為每個窗口
保存一個“繪圖信息結構”,用來保存窗口的無效區域、無效矩形以及一些其他信息。
當窗口存在“無效區域”時,Windows就會給窗體發送WM_PAINT消息。當一個WM_PAINT在消息隊列中還未處理,又有新的無效區域
增加時,Windows只是修改窗口的“繪圖信息結構”,把新的無效區域合并進去,并不給窗口發送新的WM_PAINT;同樣,如果一個
消息隊列中的WM_PAINT消息還未處理,窗口中不存在無效區域了(比如調用了ValidateRect刪除了所有無效區域),那么
WM_PAINT消息將會被移出消息隊列。
總之,消息隊列中至多有一個WM_PAINT消息。這樣設計的目的是盡量減少重繪的次數。
(二)增加和刪除無效區域
1.增加無效區域
·Windows會自動管理窗口的無效區域。
·可以通過調用InvalidateRect來將某個區域合并到窗體的無效區域中
·調用函數UpdateWindow會使整個客戶區無效
2.刪除無效區域
無效區域不會自動消失,除非調用某些可以刪除無效區域的函數
·處理WM_PAINT時,BeginPaint函數會使整個客戶區有效(刪除所有無效區域)
·ValidateRect函數可以使指定區域變得有效
3.獲取無效區域信息
·在處理WM_PAINT時
·調用GetUpdateRect來獲取無效區域
總結
以上是生活随笔為你收集整理的windows重绘机制原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: typedef 数组使用详解
- 下一篇: Windows窗口刷新机制详解