?? surface.htm
字號:
</font></b><font FACE="宋體" SIZE="3"><font SIZE="3"><p align="right"></font><a
href="#目錄">返回目錄</a></p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">當代表頁面內存的</font><font
FACE="Arial" SIZE="3">DirectDrawSurface</font><font FACE="宋體" SIZE="3">對象被不得已的釋放時,與該對象相關聯的頁面內存也會被釋放。當一個</font><font
FACE="Arial" SIZE="3">DirectDrawSurface</font><font FACE="宋體" SIZE="3">對象丟失其頁面內存的時候,它的許多函數將返回</font><font
FACE="Arial" SIZE="3">DDERR_SURFACELOST</font><font FACE="宋體" SIZE="3">,并且不進行任何其它操作。</p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">頁面可能被丟失是因為:</font><font
FACE="Arial" SIZE="3">.</font><font FACE="宋體" SIZE="3">顯示設備(顯示器)顯示模式的改變,或另一個應用程序獲得了對顯卡的獨占訪問模式,并且釋放了顯卡上當前被分派其它應用程序的所有頁面內存。對頁面調用</font><font
FACE="Arial" SIZE="3">IDirectDrawSurface3::Restore</font><font FACE="宋體" SIZE="3">方法可以為這些丟失了內存的頁面重新分配內存,并且將這些內存與</font><font
FACE="Arial" SIZE="3">DirectDrawSurface</font><font FACE="宋體" SIZE="3">對象聯系上。重建內存并不會使以前存在于該頁面上的圖象重新顯現出來,因此,如果你的頁面丟失了其內存,在調用</font><font
FACE="Arial" SIZE="3">Restore</font><font FACE="宋體" SIZE="3">函數重建之后,必須親手重新繪制所有的圖象。</p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">要得到更多資料,請參閱“設置顯示模式”。</p>
</font><hr>
</blockquote>
<blockquote>
<b><font FACE="黑體"><p></font><a name="釋放頁面"><font color="#FF8000"
face="宋體"><big>釋放頁面</big></font></a><font FACE="黑體"></p>
</font></b><font FACE="宋體" SIZE="3"><font SIZE="3"><p align="right"></font><a
href="#目錄">返回目錄</a></p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">與所有的</font><font FACE="Arial"
SIZE="3">COM</font><font FACE="宋體" SIZE="3">接口一樣,在你不再需要某頁面的時候,你可以通過調用</font><font
FACE="Arial" SIZE="3">Release</font><font FACE="宋體" SIZE="3">方法釋放它。</p>
<p ALIGN="JUSTIFY">每一個單獨創建的頁面必須逐個的明確的釋放掉。然而,如果頁面是通過單步調用</font><font
FACE="Arial" SIZE="3">IDirectDraw2::CreateSurface</font><font FACE="宋體" SIZE="3">或</font><font
FACE="Arial" SIZE="3">IDirectDraw::CreateSurface</font><font FACE="宋體" SIZE="3">函數創建一個多頁面結構(例如一個換頁鏈)時暗中形成的,那么,你只需要明確的釋放前臺緩存就可以了。在這種情況下,所有的后臺緩存都被暗中的釋放了,指向它們的指針將不再合法。</p>
</font><hr>
</blockquote>
<blockquote>
<b><font FACE="黑體"><p></font><a name="更新頁面屬性"><font face="宋體"
color="#FF8000"><big>更新頁面屬性</big></font></a><font FACE="黑體"></p>
</font></b><font FACE="宋體" SIZE="3"><font SIZE="3"><p align="right"></font><a
href="#目錄">返回目錄</a></p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">你可以通過調用</font><font
FACE="Arial" SIZE="3">IDirectDrawSurface3::SetSurfaceDesc</font><font FACE="宋體"
SIZE="3">函數來更新一個現存頁面的屬性。有了這個函數,你可以更改頁面的像素格式,還可以使該</font><font
FACE="Arial" SIZE="3">DirectDrawSurface</font><font FACE="宋體" SIZE="3">對象指針重定位,使其指向一塊應用程序已經明確分配了的系統</font><font
FACE="Arial" SIZE="3">RAM</font><font FACE="宋體" SIZE="3">。這是很有用的,因為它使得你的頁面可以直接使用一個已經存在的緩沖區的數據,而不用進行復制操作。新的頁面內存是由客戶程序所分配,同樣的,這些內存也必須由客戶程序釋放掉。要得到更多關于如何使用</font><font
FACE="Arial" SIZE="3">SetSurfaceDesc</font><font FACE="宋體" SIZE="3">函數的資料,請參閱“</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">參考手冊”中關于此函數的幫助。</p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">在調用</font><font FACE="Arial"
SIZE="3">IDirectDrawSurface3::SetSurfaceDesc</font><font FACE="宋體" SIZE="3">函數時,</font><font
FACE="Arial" SIZE="3">lpddsd</font><font FACE="宋體" SIZE="3">參數必須是一個</font><font
FACE="Arial" SIZE="3">DDSURFACEDESC</font><font FACE="宋體" SIZE="3">結構的地址,描述了新的頁面內存并且提供了指向該內存的指針。在這個結構中,你只能設置</font><font
FACE="Arial" SIZE="3">dwFlags</font><font FACE="宋體" SIZE="3">成員為反映了頁面內存的地址、大小、寬距、和像素格式的標志符。因此,</font><font
FACE="Arial" SIZE="3">dwFlags</font><font FACE="宋體" SIZE="3">只能是以下標志符的集合:</font><font
FACE="Arial" SIZE="3">DDSD_WIDTH</font><font FACE="宋體" SIZE="3">、</font><font
FACE="Arial" SIZE="3">DDSD_HEIGHT</font><font FACE="宋體" SIZE="3">、</font><font
FACE="Arial" SIZE="3">DDSD_PITCH</font><font FACE="宋體" SIZE="3">、</font><font
FACE="Arial" SIZE="3">DDSD_LPSURFACE</font><font FACE="宋體" SIZE="3">、和</font><font
FACE="Arial" SIZE="3">DDSD_PIXELFORMAT</font><font FACE="宋體" SIZE="3">。</p>
<p ALIGN="JUSTIFY">在向</font><font FACE="Arial" SIZE="3">DDSURFACEDESC</font><font
FACE="宋體" SIZE="3">結構中填充數據之前,你必須為新的頁面分配內存。你所分配的內存的大小是非常重要的,它不僅要能容納滿足頁面的長和寬所需要的內存,還必須能夠容納頁面的寬距,寬距必須是</font><font
FACE="Arial" SIZE="3">WORD</font><font FACE="宋體" SIZE="3">(</font><font FACE="Arial"
SIZE="3">8</font><font FACE="宋體" SIZE="3">位)的倍數。應該注意的是,寬距是以字節為單位,而非像素。</p>
<p ALIGN="JUSTIFY">在向</font><font FACE="Arial" SIZE="3">DDSURFACEDESC</font><font
FACE="宋體" SIZE="3">結構中填充數據的時候,</font><font FACE="Arial" SIZE="3">lpSurface</font><font
FACE="宋體" SIZE="3">成員是一個指向你剛分配的內存的指針,并且</font><font
FACE="Arial" SIZE="3">dwHeight</font><font FACE="宋體" SIZE="3">和</font><font
FACE="Arial" SIZE="3">dwWidth</font><font FACE="宋體" SIZE="3">成員描述了頁面的大小(以像素為單位)。如果你指定了頁面的大小,你還必須填充</font><font
FACE="Arial" SIZE="3">lPitch</font><font FACE="宋體" SIZE="3">成員以反映頁面寬距的大小。</font><font
FACE="Arial" SIZE="3">Pitch</font><font FACE="宋體" SIZE="3">必須是</font><font
FACE="Arial" SIZE="3">DWORD</font><font FACE="宋體" SIZE="3">的倍數。同樣的,如果你指定了寬距,你還必須為其指定一個寬度值。最后,</font><font
FACE="Arial" SIZE="3">ddpfPixelFormat</font><font FACE="宋體" SIZE="3">成員描述了頁面的像素格式。如果你沒有給這些成員指定新的值,那么,</font><font
FACE="Arial" SIZE="3">SetSurfaceDesc</font><font FACE="宋體" SIZE="3">函數將使用當前頁面的原始值,只有</font><font
FACE="Arial" SIZE="3">lpSurface</font><font FACE="宋體" SIZE="3">成員是例外。</p>
<p ALIGN="JUSTIFY">在使用</font><font FACE="Arial" SIZE="3">IDirectDrawSurface3::SetSurfaceDesc</font><font
FACE="宋體" SIZE="3">方法的過程中,你還應當注意到這樣一些細節,當然,它們只是常識。舉例來說,</font><font
FACE="Arial" SIZE="3">DDSURFACEDESC</font><font FACE="宋體" SIZE="3">結構的</font><font
FACE="Arial" SIZE="3">lpSurface</font><font FACE="宋體" SIZE="3">成員必須是一個指向系統</font><font
FACE="Arial" SIZE="3">RAM</font><font FACE="宋體" SIZE="3">的合法的指針(</font><font
FACE="Arial" SIZE="3">SetSurfaceDesc</font><font FACE="宋體" SIZE="3">函數目前還不支持指向視頻</font><font
FACE="Arial" SIZE="3">RAM</font><font FACE="宋體" SIZE="3">的指針)。同樣,</font><font
FACE="Arial" SIZE="3">dwWidth</font><font FACE="宋體" SIZE="3">和</font><font
FACE="Arial" SIZE="3">dwHeight</font><font FACE="宋體" SIZE="3">成員的值不能為</font><font
FACE="Arial" SIZE="3">0</font><font FACE="宋體" SIZE="3">。最后一點,你不能為主頁面或換頁鏈中的任何頁面調用此函數。</p>
<p ALIGN="JUSTIFY">你可以將同一塊內存設置給若干個</font><font FACE="Arial"
SIZE="3">DirectDrawSurface</font><font FACE="宋體" SIZE="3">對象,但是,你必須注意到,這塊內存被所有的頁面對象所使用,它不會因為某一個頁面的釋放而被釋放掉。</p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">不正確的使用</font><font
FACE="Arial" SIZE="3">SetSurfaceDesc</font><font FACE="宋體" SIZE="3">函數將導致不可預知的行為。因為</font><font
FACE="Arial" SIZE="3">DirectDrawSurface</font><font FACE="宋體" SIZE="3">對象不會釋放并不是它分配的頁面內存,因此,當頁面內存不再需要的時候,將其及時的釋放掉是你的責任。但是,不管怎樣,當</font><font
FACE="Arial" SIZE="3">SetSurfaceDesc</font><font FACE="宋體" SIZE="3">函數被調用的時候,</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">將釋放掉該頁面在創建的時候被暗中分配的原始的頁面內存。</p>
</font><hr>
</blockquote>
<blockquote>
<b><font FACE="黑體"><p></font><a name="直接訪問幀緩存"><font face="宋體"
color="#FF8000"><big>直接訪問幀緩存</big></font></a></b></p>
<font FACE="宋體" SIZE="3"><font SIZE="3"><p align="right"></font><a href="#目錄">返回目錄</a></p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">一個</font><font FACE="Arial" SIZE="3">DirectDrawSurface</font><font
FACE="宋體" SIZE="3">對象允許應用程序通過調用</font><font FACE="Arial"
SIZE="3">IDirectDrawSurface3::Lock</font><font FACE="宋體" SIZE="3">鎖定頁面以獲得對頁面內存的直接的訪問。當應用程序調用這個函數的時候,需要給</font><font
FACE="Arial" SIZE="3">lpDestRect</font><font FACE="宋體" SIZE="3">參數提供一個指向</font><font
FACE="Arial" SIZE="3">RECT</font><font FACE="宋體" SIZE="3">結構的指針,描述了頁面中你所想要直接訪問的矩形區域。如果應用程序需要訪問整個頁面,設置這個參數為</font><font
FACE="Arial" SIZE="3">NULL</font><font FACE="宋體" SIZE="3">即可。兩個線程或進程可以同時鎖定同一個頁面上的若干個矩形區域,條件是這些矩形區域沒有相互重疊。</font><font
FACE="Arial" SIZE="3"></p>
<p ALIGN="JUSTIFY">Lock</font><font FACE="宋體" SIZE="3">函數調用成功的話,將填充一個</font><font
FACE="Arial" SIZE="3">DDSURFACEDESC</font><font FACE="宋體" SIZE="3">結構,描述了你要正確的訪問頁面內存所需要的所有信息。如果頁面的像素格式與主頁面的不一樣,該結構中還包含了關于頁面的寬距(</font><font
FACE="Arial" SIZE="3">pitch</font><font FACE="宋體" SIZE="3">)和像素格式的信息。當應用程序結束了對頁面內存的訪問,可以調用</font><font
FACE="Arial" SIZE="3">IDirectDrawSurface3::Unlock</font><font FACE="宋體" SIZE="3">以解鎖頁面。</p>
<p ALIGN="JUSTIFY">當你鎖定了一個頁面,你就可以對頁面內存中的數據進行直接的操作。以下介紹了一些小技巧,可以避免在頁面被鎖定的過程中,直接向頁面內存進行繪圖的時候發生的絕大多數一般的錯誤。</p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><ul>
<li>決不要假想頁面的寬距(</font><font FACE="Arial" SIZE="3">pitch</font><font
FACE="宋體" SIZE="3">)為一恒定值,每次調用</font><font FACE="Arial" SIZE="3">IDirectDrawSurface3::Lock</font><font
FACE="宋體" SIZE="3">函數的時候都要檢查返回信息中的寬距值。這個值的改變可以有各種各樣的原因,包括頁面內存在內存中的位置,顯卡的類型,甚至是</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">引擎的版本。</li>
<li>確保你要進行</font><font FACE="Arial" SIZE="3">Blit</font><font FACE="宋體"
SIZE="3">操作的目標頁面是沒有被鎖定的。如果對一個鎖定的頁面調用</font><font
FACE="Arial" SIZE="3">Dir
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -