?? topitem.htm
字號:
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"> </p>
<p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">// 更新調(diào)色板,不需要傳遞指向整個調(diào)色板的指針,</font></p>
<p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">// 只用提供那些修改了的入口。 </font></p>
<p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">ddrval = lpDDPal->SetEntries( </font></p>
<p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">0, // 該標志必須為0</font></p>
<p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">10, // 要更新的第一個入口</font></p>
<p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">16, // 要更新的入口個數(shù)</font></p>
<p
style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">& (pPaletteEntry[10])); // 數(shù)據(jù)來源</font></font><font
FACE="宋體" size="5"></p>
</font>
</blockquote>
<font FACE="宋體" SIZE="3">
<blockquote>
<hr>
</blockquote>
<font FACE="黑體"><b>
<p> </p>
</b></font>
<blockquote>
<p></font><a name="獲得換頁和Blit操作的狀態(tài)"><font color="#FF8000"><b><font
FACE="黑體" size="4">獲得換頁和</font><font FACE="Arial" size="4">Blit</font><font
FACE="宋體" size="4">操作的狀態(tài)</font></b></font></a><font FACE="宋體" SIZE="3"></p>
<font size="4"><p align="right"></font><a href="#目錄">返回目錄</a></p>
</blockquote>
<blockquote>
<p ALIGN="JUSTIFY">當你調(diào)用<font FACE="Arial" SIZE="3">IDirectDrawSurface3::Flip</font>函數(shù),你所期望的結(jié)果是將前臺緩沖區(qū)與后臺緩存進行交換。然而,這個函數(shù)調(diào)用并不一定都會成功,而且如果成功也并不是說就會立即進行換頁的,舉例來說,如果上一次的換頁操作還沒有完畢或沒有成功,那么這次調(diào)用的換頁函數(shù)將返回一個名為<font
FACE="Arial" SIZE="3">DDERR_WASSTILLDRAWING</font>的錯誤。對于這個問題,僅僅依靠該函數(shù)本身的一個較為簡單的解決辦法是:用<font
FACE="Arial" SIZE="3">While</font>循環(huán)反復調(diào)用<font FACE="Arial" SIZE="3">IDirectDrawSurface3::Flip</font>函數(shù),直到返回<font
FACE="Arial" SIZE="3">DD_OK</font>為止。還應注意的一點是,即使<font
FACE="Arial" SIZE="3">Flip</font>函數(shù)調(diào)用成功,也不是說馬上就能進行換頁,換頁被顯示系統(tǒng)安排在顯示器的下一次垂直回掃發(fā)生的時候進行,這就是說,換頁一定是與顯示器的刷新同步進行的。</p>
<p ALIGN="JUSTIFY">然而,上面的這種方法其實是非常低效的,因為在循環(huán)的過程中,你將有可能多次調(diào)用<font
FACE="Arial" SIZE="3">Flip</font>函數(shù),而該函數(shù)不管是否成功,都會占用相對較長的<font
FACE="Arial" SIZE="3">CPU</font>時間,于是就會產(chǎn)生這樣一種情況:雖然上一次循環(huán)調(diào)用<font
FACE="Arial" SIZE="3">Flip</font>函數(shù)沒有成功,而在調(diào)用的過程中正在進行的換頁完畢了,所以當再次循環(huán)調(diào)用<font
FACE="Arial" SIZE="3">Flip</font>函數(shù)的時候,此時已經(jīng)離上次換頁結(jié)束有一段時間了,那么在這兩次的換頁中將會存在一個較長的時間差(這里所指的時間其實都相當短,可以說是在瞬間完成,其數(shù)量級為毫秒,遠遠超出人的感覺器官的靈敏度)。</p>
<p ALIGN="JUSTIFY">最好的方法就是使用另一個用以檢測換頁操作行進狀態(tài)的<font
FACE="Arial" SIZE="3">GetFlipStatus</font>函數(shù)。該函數(shù)相對于<font FACE="Arial"
SIZE="3">Flip</font>函數(shù)來說只占用相當短的時間,所以可以使兩次換頁的時間間隔達到最小。如果上一次的換頁尚未結(jié)束,并且返回<font
FACE="Arial" SIZE="3">DDERR_WASSTILLDRAWING</font>,你的應用程序可以利用這段時間來進行另外的任務,然后再次調(diào)用<font
FACE="Arial" SIZE="3">IDirectDrawSurface3::GetFlipStatus</font>函數(shù)檢測換頁是否完畢。一直到函數(shù)返回<font
FACE="Arial" SIZE="3">DD_OK</font>,就表示你被獲準可以進行下一次的換頁操作了。下面的例程片段演示了這種方法:</p>
<font FACE="宋體" SIZE="1"><p
style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
color="#FFFFFF">while(lpDDSBack->GetFlipStatus(DDGFS_ISFLIPDONE) == </font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">DDERR_WASSTILLDRAWING) </font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">// 等待上一次的換頁操作完畢,</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">// 應用程序可以在這里進行另外的任務。</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">;</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
color="#FFFFFF">ddrval = lpDDSPrimary->Flip(NULL, 0); </font></p>
</font><font FACE="宋體" size="4"><p ALIGN="JUSTIFY"></font><font FACE="宋體" SIZE="3"><br>
這種方法打個比方說就是在你攻城之前先派個小兵去打探敵情,直到探得條件已經(jīng)成熟再大軍壓境,而不必每次都興師動眾卻無功而返。</p>
<p ALIGN="JUSTIFY">對于基于窗口模式的應用程序,你會取而代之使用<font
FACE="Arial" SIZE="3">Blit</font>函數(shù),這時,你可以使用另一個與<font
FACE="Arial" SIZE="3">GetFlipStatus</font>函數(shù)相類似的<font FACE="Arial" SIZE="3">IDirectDrawSurface3::GetBltStatus</font>函數(shù)以檢測正在進行的<font
FACE="Arial" SIZE="3">Blit</font>操作的狀態(tài),這個函數(shù)與<font FACE="Arial"
SIZE="3">GetFlipStatus</font>函數(shù)一樣,都會占用相當短的<font FACE="Arial"
SIZE="3">CPU</font>時間,并且立即返回,利用它們可以使你的應用程序達到最快的換頁或<font
FACE="Arial" SIZE="3">Blit</font>速度,而其間只有很少的時間損失。</p>
<hr>
</blockquote>
<blockquote>
<b><p></font><a name="使用Blit進行單色填充"><font color="#FF8000"><font
FACE="黑體" size="4">使用</font><font FACE="宋體" size="4">Blit進行單色填充</font></font></a><font
FACE="黑體" SIZE="3"></p>
</font></b><font FACE="宋體" SIZE="3"><font size="4"><p align="right"></font><a
href="#目錄">返回目錄</a></p>
</blockquote>
<blockquote>
<font FACE="Arial" SIZE="3"><p ALIGN="JUSTIFY">Blt</font>函數(shù)有很多用法,對你來說最熟悉不過的莫過于將圖象從一個頁面復制到另一個頁面,然而,<font
FACE="Arial" SIZE="3">Blt</font>函數(shù)也可用于單色填充卻是鮮為人知的。不熟悉<font
FACE="Arial" SIZE="3">DirectDraw</font>的程序員經(jīng)常使用<font FACE="Arial" SIZE="3">Win32</font>的<font
FACE="Arial" SIZE="3">FillRect</font>函數(shù)來實現(xiàn)這一功能,要知道<font
FACE="Arial" SIZE="3">FillRect</font>是<font FACE="Arial" SIZE="3">GDI</font>的函數(shù),其速度受到<font
FACE="Arial" SIZE="3">GDI</font>模式的限制,其實是非常低效的。</p>
<p ALIGN="JUSTIFY">在頁面上,你可以將最常用的顏色作為該頁面的底色,使用<font
FACE="Arial" SIZE="3">IDirectDrawSurface3::Blt</font>函數(shù)可以為該頁面“打底”,或者用該函數(shù)來實現(xiàn)清屏(使整個頁面為黑色)。例如,如果你的應用程序畫面的底色是蘭色,首先填充一個<font
FACE="Arial" SIZE="3">DDBLTFX</font>結(jié)構(gòu),并且設(shè)置其<font FACE="Arial" SIZE="3">dwFillColor</font>成員,該值必須與目標頁面的像素格式一致。對于基于調(diào)色板的頁面來說,該值應該是一調(diào)色板索引;對于一個<font
FACE="Arial" SIZE="3">16</font>位<font FACE="Arial" SIZE="3">RGB</font>像素格式的頁面來說,該值應該是一個<font
FACE="Arial" SIZE="3">16</font>位的像素顏色值。然后,調(diào)用<font FACE="Arial"
SIZE="3">Blt</font>函數(shù),指定其<font FACE="Arial" SIZE="3">dwFlags</font>成員為<font
FACE="Arial" SIZE="3">DDBLT_COLORFILL</font>,表示使用該函數(shù)的單色矩形填充功能。“打底”之后,你就可以在該頁面上繪制圖象了。使用<font
FACE="Arial" SIZE="3">DirectDrawSurface</font>的<font FACE="Arial" SIZE="3">Blt</font>函數(shù)是進行單色填充最快捷的一種方法,而調(diào)用常規(guī)的<font
FACE="Arial" SIZE="3">FillRect</font>函數(shù)繪制實心矩形將耗時得多。</p>
<p ALIGN="JUSTIFY">應該注意的是,如果頁面是<font FACE="Arial" SIZE="3">8</font>位像素格式的頁面,將一個顏色如紅色,用<font
FACE="Arial" SIZE="3">RGB</font>(<font FACE="Arial" SIZE="3">255</font>,<font
FACE="Arial" SIZE="3">0</font>,<font FACE="Arial" SIZE="3">0</font>)的三原色方式賦給<font
FACE="Arial" SIZE="3">DDBLTFX</font>結(jié)構(gòu)的<font FACE="Arial" SIZE="3">dwFillColor</font>成員是錯誤的,你必須給它紅色所對應的調(diào)色板索引值,可以用<font
FACE="Arial" SIZE="3">DDColorMatch</font>函數(shù)獲得。<font FACE="Arial" SIZE="3">DDColorMatch</font>函數(shù)是在隨微軟<font
FACE="Arial" SIZE="3">DirectX SDK</font>附帶的<font FACE="Arial" SIZE="3">Ddutil.cpp</font>文件中提供的,你必須將該文件連結(jié)到你的工程中去。如何連結(jié)在前面的章節(jié)中已有詳細的介紹。</p>
<p ALIGN="JUSTIFY">下面的例程演示了如何對頁面進行清屏,即進行黑色填充:</p>
<font FACE="宋體" SIZE="1"><p
style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font></font><font
FACE="宋體" color="#FFFFFF" size="3">DDBLTFX ddbltfx; </font><font FACE="宋體"
size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">ddbltfx.dwSize = sizeof(ddbltfx);</font><font
FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">ddbltfx.dwFillColor =0 ;</font><font FACE="宋體"
size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">ddrval = lpDDSPrimary->Blt(</font><font
FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">NULL, // 目標矩形</font><font FACE="宋體"
size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">NULL, NULL, // 源頁面和源矩形</font><font
FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">DDBLT_COLORFILL, &ddbltfx);</font><font
FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">switch(ddrval) </font><font FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">{ </font><font FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">case DDERR_WASSTILLDRAWING: </font><font
FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">. </font><font FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">. </font><font FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">case DDERR_SURFACELOST: </font><font FACE="宋體"
size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">. </font><font FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">. </font><font FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">case DD_OK: </font><font FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">. </font><font FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">. </font><font FACE="宋體" size="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" color="#FFFFFF" size="3">. </font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" color="#FFFFFF" size="3">default: </font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">} </font><font FACE="宋體" size="3"><font
FACE="宋體" SIZE="1"></p>
</font>
</blockquote>
<blockquote>
<hr>
<b><p></font><a name="測定顯示硬件的能力"><font FACE="黑體" size="4"
color="#FF8000">測定顯示硬件的能力</font></a><font FACE="黑體" SIZE="3"></p>
</font></b><font FACE="宋體" size="3"><font size="4"><p align="right"></font><a
href="#目錄">返回目錄</a></p>
</
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -