?? topitem.htm
字號:
<blockquote>
<b><p></font><a name="在窗口模式下使用DirectDraw調色板"><font color="#FF8000"><font
FACE="黑體" size="4">在窗口模式下使用</font><font FACE="Arial" size="4">DirectDraw</font><font
FACE="宋體" size="4">調色板</font></font></a></b><font FACE="宋體" SIZE="3"></p>
<font size="4"><p align="right"></font><a href="#目錄">返回目錄</a></p>
</blockquote>
<blockquote>
<p ALIGN="JUSTIFY">當應用程序為獨占(全屏)模式時,<font FACE="Arial"
SIZE="3">IDirectDrawPalette</font>接口的函數擁有直接寫硬件的能力。然而,當應用程序處于非獨占(窗口)模式時,<font
FACE="Arial" SIZE="3">IDirectDrawPalette</font>接口的調用的是<font FACE="Arial"
SIZE="3">GDI</font>的調色板函數句柄來與其它應用程序協同工作。</p>
<p ALIGN="JUSTIFY">對以下主題的討論,我們假使桌面是<font FACE="Arial"
SIZE="3">8</font>位調色板模式,并且你已經創建了一個主頁面和一個標準的窗口。</p>
</blockquote>
<blockquote>
<blockquote>
<ol>
<li>窗口模式的調色板入口類型</li>
<li>在窗口模式下創建調色板</li>
<li>在窗口模式下設置調色板入口</li>
</ol>
</blockquote>
</blockquote>
<blockquote>
<font FACE="黑體" SIZE="3"><b><p><a name="窗口模式的調色板入口類型">窗口模式的調色板入口類型</a></b></font></p>
<font size="4"><p align="right"></font><a href="#目錄">返回目錄</a></p>
</blockquote>
<blockquote>
<p ALIGN="JUSTIFY">與全屏模式的應用程序不同,窗口模式的應用程序必須與其它的應用程序共享桌面調色板。這就給開發者帶來了一些困難,如怎樣修改調色板入口,以及如何才能安全的修改等。用于<font
FACE="Arial" SIZE="3">DirectDrawPalette</font>對象和<font FACE="Arial" SIZE="3">GDI</font>的<font
FACE="Arial" SIZE="3">PALETTEENTRY</font>結構中,包含了一個<font FACE="Arial"
SIZE="3">peFlags</font>成員,它攜帶了系統如何解釋<font FACE="Arial" SIZE="3">PALETTEENTRY</font>結構的描述信息。<font
FACE="Arial" SIZE="3"></p>
<p ALIGN="JUSTIFY">PALETTEENTRY</font>結構是這樣定義的:</p>
</blockquote>
</font>
<blockquote>
<font FACE="宋體" SIZE="1"><p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" size="3"><font color="#FFFFFF">typedef struct tagPALETTEENTRY { // pe</font></p>
<p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">BYTE peRed;</font></p>
<p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">BYTE peGreen; </font></p>
<p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">BYTE peBlue;</font></p>
<p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">BYTE peFlags; </font></p>
<p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">} PALETTEENTRY;</font></font><font FACE="宋體" size="5"></p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" size="3"><p ALIGN="JUSTIFY">前三個成員我們都很熟悉,它們是該入口所代表的顏色的三原色分量的值,分別是紅、綠、藍。最后一個成員</font><font
FACE="Arial" SIZE="3">peFlags</font><font FACE="宋體" size="3">描述了該調色板入口是以下三種類型的哪一種:</p>
</font>
</blockquote>
<blockquote>
<blockquote>
<font FACE="宋體" size="3"><ol>
<font FACE="Arial" SIZE="3">
<li>Windows</font>靜態入口</li>
<li>動態入口</li>
<li>非動態入口</li>
</ol>
</font>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<b><font FACE="Arial" SIZE="3"><p ALIGN="JUSTIFY">Windows</font><font FACE="宋體"
size="3">靜態入口:</b></p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" size="3"><p ALIGN="JUSTIFY">在窗口模式中,</font><font
FACE="Arial" SIZE="3">Windows</font><font FACE="宋體" size="3">保留了調色板的前</font><font
FACE="Arial" SIZE="3">10</font><font FACE="宋體" size="3">個(</font><font
FACE="Arial" SIZE="3">0</font><font FACE="宋體" size="3">到</font><font FACE="Arial"
SIZE="3">9</font><font FACE="宋體" size="3">)和后</font><font FACE="Arial" SIZE="3">10</font><font
FACE="宋體" size="3">個(</font><font FACE="Arial" SIZE="3">246</font><font
FACE="宋體" size="3">到</font><font FACE="Arial" SIZE="3">255</font><font FACE="宋體"
size="3">)共</font><font FACE="Arial" SIZE="3">20</font><font FACE="宋體" size="3">個入口,將它們作為系統保留色來顯示窗口,如:菜單條、菜單文字、窗口邊框、按鈕底色等。為了使你的應用程序與系統保持一致的外觀,以及避免破壞其它的應用程序,你有必要保護主頁面調色板的這些入口。通常,開發者調用</font><font
FACE="Arial" SIZE="3">Win32</font><font FACE="宋體" size="3">的</font><font
FACE="Arial" SIZE="3">GetSystemPaletteEntries</font><font FACE="宋體" size="3">函數獲得系統調色板的入口,然后,在將用戶定制的調色板指派給主頁面之前,將系統調色板中這</font><font
FACE="Arial" SIZE="3">20</font><font FACE="宋體" size="3">個保留入口的值明確的匹配給該定制調色板。在定制調色板中復制系統調色板的入口項在應用程序初始化時可以正常工作,但如果用戶更改了桌面的配色方案,它會變得無法使用。</p>
</font>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<font FACE="宋體" size="3"><p ALIGN="JUSTIFY">要避免你的調色板在用戶更改了配色方案之后變得面目全非,你可以通過提供一個指向系統調色板的引用,而不是直接指定一個顏色值來保護這些被保留的入口。用這種方法,不管系統對某一個保留入口使用什么樣的顏色,你的定制調色板將總會符合系統顏色,而且不需要做任何更新工作。在</font><font
FACE="Arial" SIZE="3">peFlags</font><font FACE="宋體" size="3">成員中使用</font><font
FACE="Arial" SIZE="3">PC_EXPLICIT</font><font FACE="宋體" size="3">標志,使你將定制調色板的入口直接指向一個系統調色板成為可能。當你使用這個標志,系統將不會再認為其它的成員中包含顏色信息,你應該設置</font><font
FACE="Arial" SIZE="3">peRed</font><font FACE="宋體" size="3">成員的值為系統調色板的一個索引,并且將其它成員的值設為</font><font
FACE="Arial" SIZE="3">0</font><font FACE="宋體" size="3">。</p>
</font>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<font FACE="宋體" size="3"><p ALIGN="JUSTIFY">舉例來說,如果你想要確保你定制調色板的保留入口與系統調色板相一致,你應該使用如下的代碼:</p>
</font>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<font FACE="宋體" SIZE="1"><p
style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" size="3"><font color="#FFFFFF">// 設置前10項和后10項入口與系統調色板相匹配</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">PALETTEENTRY pe[256];</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">ZeroMemory(pe, sizeof(pe));</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">for(int i=0;i<10;i++){</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">pe[i].peFlags = pe[i+246].peFlags = PC_EXPLICIT;</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">pe[i].peRed = i;</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">pe[i+246].peRed = i+246;</font></p>
</font><p
style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF" face="宋體" size="3">}</font></p>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<font FACE="宋體" size="3"><p ALIGN="JUSTIFY">你可以強迫</font><font FACE="Arial"
SIZE="3">Windows</font><font FACE="宋體" size="3">僅保留使用調色板入口的第一項和最后一項(</font><font
FACE="Arial" SIZE="3">0</font><font FACE="宋體" size="3">和</font><font FACE="Arial"
SIZE="3">255</font><font FACE="宋體" size="3">),方法是調用</font><font
FACE="Arial" SIZE="3">Win32</font><font FACE="宋體" size="3">的</font><font
FACE="Arial" SIZE="3">SetSystemPaletteUse</font><font FACE="宋體" size="3">函數。在這種情況下,你應該設置</font><font
FACE="Arial" SIZE="3">0</font><font FACE="宋體" size="3">號與</font><font FACE="Arial"
SIZE="3">255</font><font FACE="宋體" size="3">號</font><font FACE="Arial" SIZE="3">PALETTEENTRY</font><font
FACE="宋體" size="3">結構的</font><font FACE="Arial" SIZE="3">peFlags</font><font
FACE="宋體" size="3">成員值為</font><font FACE="Arial" SIZE="3">PC_EXPLICIT</font><font
FACE="宋體" size="3">。</p>
</font>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<font FACE="宋體" size="3"><b><p ALIGN="JUSTIFY">動態入口:</b></p>
</font>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<font FACE="宋體" size="3"><p ALIGN="JUSTIFY">在相應的</font><font FACE="Arial"
SIZE="3">PALETTEENTRY</font><font FACE="宋體" size="3">結構的</font><font
FACE="Arial" SIZE="3">peFlags</font><font FACE="宋體" size="3">成員中設置</font><font
FACE="Arial" SIZE="3">PC_RESERVED</font><font FACE="宋體" size="3">標志,表示調色板的該項入口即為用戶所保留,</font><font
FACE="Arial" SIZE="3">Windows</font><font FACE="宋體" size="3">將不會允許任何其它的應用程序將它們的邏輯調色板映射到這個物理入口中。因此,只有你的應用程序能夠修改這個入口的顏色值,實現調色板動畫,而其它的應用程序卻無法修改它。</p>
</font>
</blockquote>
</blockquote>
<blockquote>
<blockquote>
<font FACE="宋體" size="3"><b><p ALIGN="JUSTIFY">非動態入口:</b></p>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -