📄 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 + -