調色板工作原理

來自於:http://blog.csdn.net/pkeel/archive/2007/03/27/1542425.aspx 

<script></script>
調色板工作原理
顯示器可以被設置成16、256、64K、真彩色等顯示模式,前兩種模式需要調色板。在16或256色模式下,程序必須將想要顯示的顏色正確地設置到調色板中,這樣才能顯示出預期的顏色。

      如圖爲一個256色顯示模式中的調色板的工作原理




      Windows是一個多任務操作系統,可以同時運行多個程序。如果有幾個程序都要設置調色板,就有可能產生衝突。爲了避免這種衝突,Windows使用邏輯調色板來作爲使用顏色的應用程序和系統調色板(物理調色板)之間的緩衝。

      在Windows中,應用程序是通過一個或多個邏輯調色板來使用系統調色板(物理調色板)。在256色系統調色板中,Windows保留了20種顏色作爲靜態顏色,這些顏色用作顯示Windows界面,應用程序一般不能改變。缺省的系統調色板只包含這20種靜態顏色,調色板的其它項爲空。應用程序要想使用新的顏色,必須將包含有所需顏色的邏輯調色板實現到系統調色板中。在實現過程中,Windows首先將邏輯調色板中的項與系統調色板中的項作完全匹配,對於邏輯調色板中不能完全匹配的項,Windows將其加入到系統調色板的空白項中,系統調色板總共有236個空白項可供使用,若系統調色板已滿,則Windows將邏輯調色板的剩餘項匹配到系統調色板中儘可能接近的顏色上。

  每個設備上下文都擁有一個邏輯調色板,缺省的邏輯調色板只有20種保留顏色,如果要使用新的顏色,則應該創建一個新的邏輯調色板並將其選入到設備上下文中。但光這樣還不能使用新顏色,程序只有把設備上下文中的邏輯調色板實現到系統調色板中,新的顏色才能實現。在邏輯調色板被實現到系統調色板時,Windows會建立一個調色板映射表。當設備上下文用邏輯調色板中的顏色繪圖時,GDI繪圖函數會查詢調色板映射表以把像素值從邏輯調色板的索引轉換成系統調色板的索引,這樣當像素被輸出到視頻內存中時就具有了正確的顏色值。
      下圖說明了這種映射關係,從圖中讀者可以體會到邏輯調色板的緩衝作用。在該圖中,GDI繪圖函數使用邏輯調色板的索引1中的顏色來繪圖,通過查詢調色板映射表,得知系統調色板中的第23號索引與其完全匹配,這樣實際輸出到視頻內存中的像素值是23。注意圖中還演示了顏色的不完全匹配,即邏輯調色板中的索引15和系統調色板中的索引46。



      每個要使用額外顏色的窗口都會實現自己的邏輯調色板,邏輯調色板中的每種顏色在系統調色板中都有相同或相近的匹配。調色板的實現優先權越高,匹配的精度也就越高。Windows規定,活動窗口的邏輯調色板(如果有的話)具有最高的實現優先權。這是因爲活動窗口是當前與用戶交互的窗口,應該保證其有最佳的顏色顯示。非活動窗口的優先權是按Z順序自上到下確定的(Z順序就是重疊窗口的重疊順序)。活動窗口有權將其邏輯調色板作爲前景調色板實現,非活動窗口則只能實現背景調色板。
      提示:術語活動窗口(Active window)或前臺窗口(Foreground window)是指當前與用戶交互的窗口,活動窗口的頂端的標題條呈高亮顯示,而非活動窗口的標題條則是灰色的。活動窗口肯定是一個頂層窗口(Top-level window),頂層窗口是指沒有父窗口或父窗口是桌面窗口的窗口,這種窗口一般都有標題和邊框,主要包括框架窗口和對話框。術語重疊窗口是指作爲應用程序主窗口的窗口,我們可以把對話框看成是一種特殊的重疊式窗口。

     CreatePalette只是創建了邏輯調色板,此時調色板只是一張孤立的顏色表,還不能對系統產生影響。程序必需調用CDC::SelectPalette把邏輯調色板選入到要使用它的設備上下文中,然後調用CDC::RealizePalette把邏輯調色板實現到系統調色板中。函數的聲明爲:

CPalette* SelectPalette( CPalette* pPalette, BOOL bForceBackground );
該函數把指定的調色板選擇到設備上下文中。參數pPalette指向一個CPalette對象。參數bForceBackground如果是TRUE,那麼被選擇的調色板總是作爲背景調色板使用,如果bForceBackgroundFALSE並且設備上下文是附屬於某個窗口的,那麼當窗口是活動窗口或活動窗口的子窗口時,被選擇的調色板將作爲前景調色板實現,否則作爲背景調色板實現。如果使用調色板的是一個內存設備上下文,則該參數被忽略。函數返回設備上下文原來使用的調色板,若出錯則返回NULL

UINT RealizePalette( );
該函數把設備上下文中的邏輯調色板實現到系統調色板中。函數的返回值表明調色板映射表中有多少項被改變了。

 

如果某一個窗口要顯示特殊的顏色,那麼一般應該在處理WM_PAINT消息時實現自己的邏輯調色板。也就是說,在OnPaintOnDraw函數中重繪以前,要調用SelectPaletteRealizePalette。如果窗口顯示的顏色比較重要,則在調用SelectPalette時應該指定bForceBackground參數爲FALSE

前景調色板具有使用顏色的最高優先級,它有無條件佔用系統調色板(20種保留顏色除外)的權力,也就是說,如果需要,前景調色板將覆蓋系統調色板的236個表項,而不管這些表項是否正被別的窗口使用。背景調色板則無權破壞系統調色板中的已使用項。

請讀者注意,前景調色板應該是唯一。如果一個活動窗口同時要實現幾個邏輯調色板,那麼只能有一個調色板作爲前景調色板實現,也即在調用CDC::SelectPalette時只能有一個bForceBackground被指定爲FALSE,其它的bForceBackground必需爲TRUE。通常是把具有輸入焦點的窗口的調色板作爲前景調色板實現,其它窗口只能使用背景調色板。如果活動窗口的子窗口全都使用前景調色板,則會導致程序的死循環。

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