1. 程式人生 > >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來獲取無效區域

相關推薦

windows機制原理

一.Windows程式中的繪製和更新與DOS環境比較,Windows中的應用程式在處理文字和圖形繪製時有以下區別:1.只能在視窗的客戶區域繪製文字和圖形2.在視窗上繪製的內容不一定能夠保留到程式下一次有意地改寫時。比如,當您的視窗被其他視窗覆蓋,Windows不會儲存您的視

iOS UIView機制drawRect

原文連結:http://blog.csdn.net/nyh1006/article/details/38899251 iOS的繪圖操作是在UIView類的drawRect方法中完成的,所以如果我們要想在一個UIView中繪圖,需要寫一個擴充套件UIView 的類,並重寫dr

springboot系列——機制原理和應用,還有比這個講的更好的嗎(附完整原始碼)

1. 理解重試機制 2. 總結重試機制使用場景 3. spring-retry重試元件 4. 手寫一個基於註解的重試元件 5. 重試機制下會出現的問題 6. 模板方法設計模式實現非同步重試機制 如果有,請轉給我! 1. 理解重試機制 “重試是為了提高成功的可能性“ 反過來理解,任何

窗體背景的制(Windows窗體每次都會其窗體背景,所以我們可以通過攔截窗體背景的消息(WM_ERASEBKGND),並自定義方法來實現窗體背景)

height com call 消息響應 int idt http msg mes 核心思想:由於Windows窗體每次都會重繪其窗體背景,所以我們可以通過攔截窗體重繪背景的消息(WM_ERASEBKGND),並自定義方法來實現重繪窗體背景。通過TImage組件也可以實現,

分組機制---可靠資料傳輸原理

不知道從哪天開始,一禪也陷入了程式設計這條道路..... 小白:你知道嗎?資料在傳輸的時候是分割成一小塊一小塊傳輸的,我們把這一小塊的資料稱之為一個分組。我們在傳輸這塊分組的時候,主要面臨兩個問題。 1、這個分組在傳輸的過程中,由於在通道傳輸過程中,收到干擾,導致這個分組到達目的地之後出現了差

瀏覽器渲染原理(效能優化之如何減少重排和

繼續上篇《瀏覽器位址列裡輸入URL後的全過程》 前言 為什麼要了解瀏覽器的渲染原理?瞭解瀏覽器的渲染原理有什麼好處?我們做前端開發為什麼非要了解瀏覽器的原理?直接把網頁做出來,什麼需求,直接一把梭,擼完收工不好嗎。 但是經常會有人會問,什麼是重排和重繪? 重排也叫迴流(Re

基於Windows Socket 的網路通訊中的心跳機制原理

(2)SIO_KEEPALIVE_VALS 機制           這是從彭博兄那裡學到一個機制拉,設定介面是WSAIoctl API:      DWORD dwError = 0L ;      tcp_keepalive sKA_Settings = {0}, sReturned = {0} ;  

瀏覽器渲染原理&&和迴流

瀏覽器渲染原理 瀏覽器向伺服器請求到了HTML文件後便開始解析,產物是DOM(文件物件模型),如果有css,會根據css生成CSSOM(CSS物件模型),然後再由DOM和CSSOM合併產生渲染樹,有了渲染樹,知道了所有節點的樣式,便根據這些節點以及樣式計算它們

Windows開發進階之VC++中如何實現對話框的界面

中標 狀態改變 seh 應用軟件 繪制 ack 軟件程序 rpo fault 技術:Windows 系統+Visual studio 2008 概述 應用程序界面是用戶與應用程序之間的交互的橋梁和媒介,用戶界面是應用程序中最重要的組成部分,也是

從瀏覽器渲染原理,淺談迴流與效能優化

目錄 前言 瀏覽器的渲染引擎 渲染流程 渲染樹與渲染物件 迴流 全域性佈局和增量佈局 "迴流"還是"重排"?

控件

text string lag right graphics brush draw str eight 1. 設置控件DrawMode屬性為OwnerDrawFixed,編輯控件DrawItem事件 重繪tabControl——選項卡控件     string text

windows消息機制與實例

默認 style import pcl ++ user 註冊 lpar pub windows發送窗口消息   所需工具:spy++,visual studio 2017,c#語言    技術路線:首先通過spy++獲得所要操縱的窗口的句柄,函數的原型聲明為:   [Dll

瀏覽器的和重排的影響

包含 時間 邊框 渲染器 外邊距 數據 出現 又一 構建 瀏覽器下載完頁面中全部的組件之後,會解析生成兩個內部數據結構: 1. DOM樹:表示頁面結構 2. 表示DOM節點怎樣顯示 當DOM和渲染樹構建完畢之後,瀏覽器就開始顯示(繪制)頁面元素。當

【原創】TCP超時機制探索

sender mic borde 做了 5.5 多次 字節 應用程序 實現 TCP超時重傳機制探索作者:tll (360電商技術)1)通信模型TCP(Transmission Control Protocol)是一種可靠傳輸協議。在傳輸過程中當發送方(sender)向接

[Android FrameWork 6.0源碼學習] View的過程

nds 源碼學習 most leg shift isp window round ces View繪制的三部曲, 測量,布局,繪畫今天我們分析測量過程 view的測量是從ViewRootImpl發起的,View需要重繪,都是發送請求給ViewRootImpl,然後他組織重

[Android FrameWork 6.0源碼學習] View的過程之Layout

種子 noop cond req cor ide boolean 需要 bound View繪制的三部曲,測量,布局,繪畫現在我們分析布局部分測量部分在上篇文章中已經分析過了。不了解的可以去我的博客裏找一下View的布局和測量一樣,都是從ViewRootImpl中發起,Vi

Unity3D學習(一):簡單梳理下Unity跨平臺的機制原理

12px get 一個 bsp 嵌入 ram 屬於 開源 runtime 前言 首先需要了解的是,Unity3D的C#基礎腳本模塊是通過Mono來實現的。 什麽是Mono? 參考下百度百科:Mono是一個由Novell公司(由Xamarin發起)主持的項目,並由Migu

jedis超時機制註意事項

del number 十進制 包含 str 沒有 時間 機制 await 最近使用redis集群進行incr操作,總是發現計數不準確,後來經過檢查發現redis在執行incr超時會執行重試機制,造成計數不準確,測試代碼: /** * incrf: *

[Android FrameWork 6.0源碼學習] View的過程之Draw

鐘表 store 傳遞 lan play deb kill gre 學習 View繪制的三部曲,測量,布局,繪畫現在我們分析繪畫部分測量和布局 在前兩篇文章中已經分析過了。不了解的可以去我的博客裏找一下 下面進入正題,開始分析調用以及函數原理 private void

高性能WEB開發:重排與

對象 保存 一般來說 結束 com 導致 選項 fix 低版本   DOM編程可能最耗時的地方,重排和重繪。 1、什麽是重排和重繪  瀏覽器下載完頁面中的所有組件——HTML標記、JavaScript、CSS、圖片之後會解析生成兩個內部數據結構——DOM樹和渲染樹。   D