⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 topitem.htm

📁 DirectX 编程初级教程中文版。只要有C++基础和一点三维知识即可。
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  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">// 更新调色板,不需要传递指向整个调色板的指针,</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-&gt;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, // 要更新的入口个数</font></p>
  <p
  style="background-color: rgb(0,0,128); margin-top: 00; margin-bottom: 0; padding-top: 2"><font
  color="#FFFFFF">&amp; (pPaletteEntry[10])); // 数据来源</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操作的状态"><font color="#FF8000"><b><font
  FACE="黑体" size="4">获得换页和</font><font FACE="Arial" size="4">Blit</font><font
  FACE="宋体" size="4">操作的状态</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">当你调用<font FACE="Arial" SIZE="3">IDirectDrawSurface3::Flip</font>函数,你所期望的结果是将前台缓冲区与后台缓存进行交换。然而,这个函数调用并不一定都会成功,而且如果成功也并不是说就会立即进行换页的,举例来说,如果上一次的换页操作还没有完毕或没有成功,那么这次调用的换页函数将返回一个名为<font
  FACE="Arial" SIZE="3">DDERR_WASSTILLDRAWING</font>的错误。对于这个问题,仅仅依靠该函数本身的一个较为简单的解决办法是:用<font
  FACE="Arial" SIZE="3">While</font>循环反复调用<font FACE="Arial" SIZE="3">IDirectDrawSurface3::Flip</font>函数,直到返回<font
  FACE="Arial" SIZE="3">DD_OK</font>为止。还应注意的一点是,即使<font
  FACE="Arial" SIZE="3">Flip</font>函数调用成功,也不是说马上就能进行换页,换页被显示系统安排在显示器的下一次垂直回扫发生的时候进行,这就是说,换页一定是与显示器的刷新同步进行的。</p>
  <p ALIGN="JUSTIFY">然而,上面的这种方法其实是非常低效的,因为在循环的过程中,你将有可能多次调用<font
  FACE="Arial" SIZE="3">Flip</font>函数,而该函数不管是否成功,都会占用相对较长的<font
  FACE="Arial" SIZE="3">CPU</font>时间,于是就会产生这样一种情况:虽然上一次循环调用<font
  FACE="Arial" SIZE="3">Flip</font>函数没有成功,而在调用的过程中正在进行的换页完毕了,所以当再次循环调用<font
  FACE="Arial" SIZE="3">Flip</font>函数的时候,此时已经离上次换页结束有一段时间了,那么在这两次的换页中将会存在一个较长的时间差(这里所指的时间其实都相当短,可以说是在瞬间完成,其数量级为毫秒,远远超出人的感觉器官的灵敏度)。</p>
  <p ALIGN="JUSTIFY">最好的方法就是使用另一个用以检测换页操作行进状态的<font
  FACE="Arial" SIZE="3">GetFlipStatus</font>函数。该函数相对于<font FACE="Arial"
  SIZE="3">Flip</font>函数来说只占用相当短的时间,所以可以使两次换页的时间间隔达到最小。如果上一次的换页尚未结束,并且返回<font
  FACE="Arial" SIZE="3">DDERR_WASSTILLDRAWING</font>,你的应用程序可以利用这段时间来进行另外的任务,然后再次调用<font
  FACE="Arial" SIZE="3">IDirectDrawSurface3::GetFlipStatus</font>函数检测换页是否完毕。一直到函数返回<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-&gt;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-&gt;Flip(NULL, 0); </font></p>
  </font><font FACE="宋体" size="4"><p ALIGN="JUSTIFY"></font><font FACE="宋体" SIZE="3"><br>
  这种方法打个比方说就是在你攻城之前先派个小兵去打探敌情,直到探得条件已经成熟再大军压境,而不必每次都兴师动众却无功而返。</p>
  <p ALIGN="JUSTIFY">对于基于窗口模式的应用程序,你会取而代之使用<font
  FACE="Arial" SIZE="3">Blit</font>函数,这时,你可以使用另一个与<font
  FACE="Arial" SIZE="3">GetFlipStatus</font>函数相类似的<font FACE="Arial" SIZE="3">IDirectDrawSurface3::GetBltStatus</font>函数以检测正在进行的<font
  FACE="Arial" SIZE="3">Blit</font>操作的状态,这个函数与<font FACE="Arial"
  SIZE="3">GetFlipStatus</font>函数一样,都会占用相当短的<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>函数有很多用法,对你来说最熟悉不过的莫过于将图象从一个页面复制到另一个页面,然而,<font
  FACE="Arial" SIZE="3">Blt</font>函数也可用于单色填充却是鲜为人知的。不熟悉<font
  FACE="Arial" SIZE="3">DirectDraw</font>的程序员经常使用<font FACE="Arial" SIZE="3">Win32</font>的<font
  FACE="Arial" SIZE="3">FillRect</font>函数来实现这一功能,要知道<font
  FACE="Arial" SIZE="3">FillRect</font>是<font FACE="Arial" SIZE="3">GDI</font>的函数,其速度受到<font
  FACE="Arial" SIZE="3">GDI</font>模式的限制,其实是非常低效的。</p>
  <p ALIGN="JUSTIFY">在页面上,你可以将最常用的颜色作为该页面的底色,使用<font
  FACE="Arial" SIZE="3">IDirectDrawSurface3::Blt</font>函数可以为该页面“打底”,或者用该函数来实现清屏(使整个页面为黑色)。例如,如果你的应用程序画面的底色是兰色,首先填充一个<font
  FACE="Arial" SIZE="3">DDBLTFX</font>结构,并且设置其<font FACE="Arial" SIZE="3">dwFillColor</font>成员,该值必须与目标页面的像素格式一致。对于基于调色板的页面来说,该值应该是一调色板索引;对于一个<font
  FACE="Arial" SIZE="3">16</font>位<font FACE="Arial" SIZE="3">RGB</font>像素格式的页面来说,该值应该是一个<font
  FACE="Arial" SIZE="3">16</font>位的像素颜色值。然后,调用<font FACE="Arial"
  SIZE="3">Blt</font>函数,指定其<font FACE="Arial" SIZE="3">dwFlags</font>成员为<font
  FACE="Arial" SIZE="3">DDBLT_COLORFILL</font>,表示使用该函数的单色矩形填充功能。“打底”之后,你就可以在该页面上绘制图象了。使用<font
  FACE="Arial" SIZE="3">DirectDrawSurface</font>的<font FACE="Arial" SIZE="3">Blt</font>函数是进行单色填充最快捷的一种方法,而调用常规的<font
  FACE="Arial" SIZE="3">FillRect</font>函数绘制实心矩形将耗时得多。</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>结构的<font FACE="Arial" SIZE="3">dwFillColor</font>成员是错误的,你必须给它红色所对应的调色板索引值,可以用<font
  FACE="Arial" SIZE="3">DDColorMatch</font>函数获得。<font FACE="Arial" SIZE="3">DDColorMatch</font>函数是在随微软<font
  FACE="Arial" SIZE="3">DirectX SDK</font>附带的<font FACE="Arial" SIZE="3">Ddutil.cpp</font>文件中提供的,你必须将该文件连结到你的工程中去。如何连结在前面的章节中已有详细的介绍。</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-&gt;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, &amp;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 + -