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

📄 surface.htm

📁 这是用C++实现语音识别的一个插件。大家一起分享一下!
💻 HTM
📖 第 1 页 / 共 5 页
字号:
  </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 + -