?? surface.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>頁面</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>
<body>
<b><font FACE="黑體" SIZE="5">
<p align="center"></font><font size="6"><font face="宋體"><font color="#FF8000"><a
name="目錄">頁面</a></font></font></p>
<p align="right" style="margin-top: -10; margin-bottom: -8"></font></b><a href="index.htm"
style="text-decoration: none"><font face="宋體" size="3"><span
style="text-decoration: none">返回上級</span></font></a><font FACE="黑體" size="3"></p>
<hr>
</font>
<blockquote>
<font face="宋體" size="3"><p ALIGN="JUSTIFY">該節包含了關于</font><font
FACE="Arial" SIZE="3">DirectDrawSurface</font><font face="宋體" size="3">對象的信息,探討了以下主題:</font><font
SIZE="3"> </font><font FACE="Arial" SIZE="3"></p>
</font><table border="0" width="84%" height="171">
<tr>
<td width="47%" height="165" valign="top"><ol>
<font FACE="宋體" SIZE="3">
<li><a href="#頁面的基本概念">頁面的基本概念</a><br>
<a href="#什么是頁面?">什么是頁面</a><br>
<a href="#頁面接口">頁面接口</a><br>
<a href="#寬度(Width)和寬距(Pitch)">寬度和寬距</a><br>
<a href="#關鍵色">關鍵色</a><br>
<a href="#像素格式">像素格式</a></li>
<li><a href="#創建頁面">創建頁面</a><br>
<a href="#創建主頁面">創建主頁面</a><br>
<a href="#創建離屏頁面">創建離屏頁面</a><br>
<a href="#創建復雜頁面和換頁鏈">創建復雜頁面和換頁鏈</a><br>
<a href="#創建超寬頁面">創建超寬頁面</a></li>
<li><a href="#換頁">換頁</a></li>
<li><a href="#頁面丟失">頁面丟失</a></li>
<li><a href="#釋放頁面">釋放頁面</a></li>
<li><a href="#更新頁面屬性">更新頁面屬性</a></li>
<li><a href="#直接訪問幀緩存">直接訪問幀緩存</a></li>
</font>
</ol>
</td>
<td width="53%" height="165" valign="top"><ol>
<font FACE="宋體" SIZE="3">
<li type="disc" value="8"><a href="#使用非本地視頻RAM頁面">使用非本地視頻<font
FACE="Arial" SIZE="3">RAM</font>頁面</a></li>
<li type="disc" value="9"><a href="#色彩和格式轉換">色彩和格式轉換</a></li>
<li type="disc" value="10"><a href="#覆蓋頁面">覆蓋頁面</a><br>
<a href="#覆蓋頁面概覽">覆蓋頁面概覽</a><br>
<font FACE="Arial" SIZE="3"> <a
href="#DDCAPS結構中的重要成員和標志">DDCAPS</font>的重要成員和標志</a><br>
<a href="#源和目標矩形">源和目標矩形</a><br>
<a href="#邊界(Boundary)和大小(Size)限制">邊界和大小限制</a><br>
<a href="#最小和最大縮放系數">最小和最大縮放系數</a><br>
<a href="#覆蓋頁面的關鍵色">覆蓋頁面關鍵色</a><br>
<a href="#覆蓋頁面的定位">覆蓋頁面的定位</a><br>
<a href="#創建覆蓋頁面">創建覆蓋頁面</a><br>
<a href="#覆蓋頁面的Z軸排序(Z-order)">覆蓋頁面的<font
FACE="Arial" SIZE="3">Z</font>軸次序</a><br>
<a href="#覆蓋頁面的換頁">覆蓋頁面的換頁</a></li>
<font FACE="Arial" SIZE="3">
<li type="disc" value="11"><a href="#Blit到多窗口">Blit</font></font><font SIZE="3">到多窗口</font></a><font
FACE="宋體" SIZE="3"></li>
</font>
</ol>
</td>
</tr>
</table>
</blockquote>
<font FACE="宋體" SIZE="3">
<hr>
<blockquote>
<b><font FACE="黑體"><p></font></font><font size="4"><a name="頁面的基本概念"><font
face="宋體"><font color="#FF8000">頁面的基本概念</font></font></a></p>
</b><p align="right"></font><font face="宋體" size="3"><a href="#目錄">返回目錄</a></font></p>
<p><b><font face="宋體" size="3">1、</font><font FACE="黑體" SIZE="3"><a
name="什么是頁面?">什么是頁面?</a></font></b><font face="宋體" size="3"><ol>
<p ALIGN="JUSTIFY">頁面,或被我們稱作<font FACE="Arial" SIZE="3">DirectDrawSurface</font>對象,代表了內存里的一個連續的線性的數據區。這個數據區可以被代表顯示硬件的<font
FACE="Arial" SIZE="3">DirectDraw</font>對象所識別和確認。通常,<font
FACE="Arial" SIZE="3">DirectDrawSurface</font>對象被置于顯卡上的視頻<font
FACE="Arial" SIZE="3">RAM</font>中,而這并不是絕對的。除非明確的指定是在視頻<font
FACE="Arial" SIZE="3">RAM</font>還是系統<font FACE="Arial" SIZE="3">RAM</font>中創建<font
FACE="Arial" SIZE="3">DirectDrawSurface</font>對象,<font FACE="Arial" SIZE="3">DirectDraw</font>可以將其放置在其中任一位置,條件是這樣可以獲得最佳性能。</p>
<font FACE="Arial" SIZE="3"><p ALIGN="JUSTIFY">DirectDrawSurface</font>對象可以從顯卡上的特效處理器上獲得好處,不僅僅是通常意義上的加快處理速度,而是可以與系統<font
FACE="Arial" SIZE="3">CPU</font>并行工作,以達到最優的效率和速度。<font
SIZE="3"> </font><font FACE="Arial" SIZE="3"></p>
</font><p ALIGN="JUSTIFY">調用<font FACE="Arial" SIZE="3">IDirectDraw2::CreateSurface</font>函數可以創建若干類型的<font
FACE="Arial" SIZE="3">DirectDrawSurface</font>對象,包括最簡單的單頁面對象,復雜的由若干個頁面組成的換頁鏈,以及三維頁面等等。<font
FACE="Arial" SIZE="3">CreateSurface</font>函數創建我們所請求的頁面或換頁鏈,并且返回指向主頁面的<font
FACE="Arial" SIZE="3">IDirectDrawSurface</font>接口的指針,通過該接口可以暴露<font
FACE="Arial" SIZE="3">DirectDrawSurface</font>對象的函數性。如果你想使用該接口的較高級的版本,如<font
FACE="Arial" SIZE="3">IDirectDrawSurface3</font>,你也可以詢問系統并且得到它。</p>
<font FACE="Arial" SIZE="3"><p ALIGN="JUSTIFY">IDirectDrawSurface3</font>接口通過<font
FACE="Arial" SIZE="3">Blit</font>函數可以使你間接的訪問頁面內存,例如:<font
FACE="Arial" SIZE="3">IDirectDrawSurface3::BltFast</font>函數。<font FACE="Arial"
SIZE="3">DirectDrawSurface</font>對象可以創建<font FACE="Arial" SIZE="3">Windows</font>的<font
FACE="Arial" SIZE="3">GDI</font>設備環境句柄(<font FACE="Arial" SIZE="3">HDC</font>),這樣,就可以允許使用<font
FACE="Arial" SIZE="3">Win32</font>的<font FACE="Arial" SIZE="3">API</font>函數來訪問代表<font
FACE="Arial" SIZE="3">DirectDrawSurface</font>對象的頁面。<font FACE="Arial"
SIZE="3">GDI</font>識別這些<font FACE="Arial" SIZE="3">HDC</font>(設備環境句柄),如果它們存在于視頻<font
FACE="Arial" SIZE="3">RAM</font>中,那么就可以獲得硬件的加速特性。除此之外,你還可以使用<font
FACE="Arial" SIZE="3">IDirectDrawSurface3</font>接口的函數直接訪問頁面內存。例如:可以使用<font
FACE="Arial" SIZE="3">IDirectDrawSurface3::Lock</font>函數鎖定頁面內存,并且獲得指向該頁面上相應區域(用戶指定的矩形區域)的內存區的地址。視頻<font
FACE="Arial" SIZE="3">RAM</font>上的地址可以指向可見的禎緩存(存儲了當前顯示畫面的緩沖區,也稱作主頁面),也可以是不可見的緩存(離屏頁面或覆蓋頁面)。不可見的緩存通常被置于視頻<font
FACE="Arial" SIZE="3">RAM</font>中,但是如果是受硬件限制或<font FACE="Arial"
SIZE="3">DirectDraw</font>正以仿真模式運行,它也可以被置于系統<font
FACE="Arial" SIZE="3">RAM</font>中。<font FACE="Arial" SIZE="3">IDirectDrawSurface3</font>接口還擴展了另外一些函數,比如可以用來設置或獲得調色板的函數,專門用于某特定類型頁面的函數(如換頁鏈或覆蓋頁面)。</p>
<p ALIGN="JUSTIFY">從下面這個例圖中,你可以看到所有的<font FACE="Arial"
SIZE="3">DirectDrawSurface</font>頁面對象都是由<font FACE="Arial" SIZE="3">DirectDraw</font>對象創建的,并且與調色板協同工作。盡管每一個頁面對象都可以被分配一個調色板,除了像素格式的位深度小于等于<font
FACE="Arial" SIZE="3">8</font>的主頁面以外,調色板并不總是必須的。</p>
<hr>
</ol>
<b><p></font><font FACE="黑體" SIZE="3">2、<a name="頁面接口">頁面接口</a></p>
</font></b><font SIZE="3"><p align="right"></font><a href="#目錄"><font face="宋體"
size="3">返回目錄</font></a></p>
<font face="宋體" size="3"><ol>
<p ALIGN="JUSTIFY">前面已經提到過,<font FACE="Arial" SIZE="3">DirectDrawSurface</font>對象是通過<font
FACE="Arial" SIZE="3">IDirectDrawSurface</font>、<font FACE="Arial" SIZE="3">IdirectDrawSurface2</font>和<font
FACE="Arial" SIZE="3">IDirectDrawSurface3</font>接口來暴露其函數性的。接口的每一個新的版本與舊的版本相比,除了提供所有原有的函數并且擴充其功能之外,還提供了一些新的函數。</p>
<p ALIGN="JUSTIFY">三種接口中,<font FACE="Arial" SIZE="3">IDirectDrawSurface</font>接口是最早的一個版本,當你調用<font
FACE="Arial" SIZE="3">IDirectDraw2::CreateSurface</font>函數時,系統會為你缺省的創建一個該接口的頁面對象。要利用新版接口的函數性,你必須通過調用<font
FACE="Arial" SIZE="3">QueryInterface</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
FACE="宋體" size="3" color="#FFFFFF">LPDIRECTDRAWSURFACE lpSurf; </font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" size="3" color="#FFFFFF">LPDIRECTDRAWSURFACE2 lpSurf2; </font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" size="3" color="#FFFFFF">//填充頁面結構</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" size="3" color="#FFFFFF">memset(&ddsd, 0, sizeof(ddsd)); //調用Win32
API函數清空ddsd結構</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" size="3" color="#FFFFFF">ddsd.dwSize = sizeof(ddsd); </font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" size="3" color="#FFFFFF">ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH |
DDSD_HEIGHT;</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" size="3" color="#FFFFFF">ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
DDSCAPS_SYSTEMMEMORY; </font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" size="3" color="#FFFFFF">ddsd.dwWidth = 10; </font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -