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

📄 multimon.htm

📁 DirectX 编程初级教程中文版。只要有C++基础和一点三维知识即可。
💻 HTM
📖 第 1 页 / 共 2 页
字号:
  <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">}</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">// 最后,必须调用FreeLibrary函数释放动态连接库。</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">FreeLibrary(h);</font><font FACE="Arial" size="5"></p>
  </font>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">上面的例程代码可以在运行期或装载期为连接到</font><font
  FACE="Arial" SIZE="3">Ddraw.dll</font><font FACE="宋体" SIZE="3">的应用程序所用。</p>
  <p ALIGN="JUSTIFY">应该注意的是,你必须获得</font><font FACE="Arial" SIZE="3">DirectDrawEnumerateEx 
  </font><font FACE="宋体" SIZE="3">函数的</font><font FACE="Arial" SIZE="3">ANSI</font><font
  FACE="宋体" SIZE="3">或</font><font FACE="Arial" SIZE="3">Unicode</font><font
  FACE="宋体" SIZE="3">版本中的哪一个,依赖于你的应用程序的字符串类型。当声明相应的回调函数时,为字符串参数使用</font><font
  FACE="Arial" SIZE="3">LPTSTR</font><font FACE="宋体" SIZE="3">数据类型。如果你声明了</font><font
  FACE="Arial" SIZE="3">_UNICODE</font><font FACE="宋体" SIZE="3">符号,</font><font
  FACE="Arial" SIZE="3">LPTSTR</font><font FACE="宋体" SIZE="3">数据类型在编译时使用</font><font
  FACE="Arial" SIZE="3">Unicode</font><font FACE="宋体" SIZE="3">字符串,否则使用</font><font
  FACE="Arial" SIZE="3">ANSI</font><font FACE="宋体" SIZE="3">字符串。通过使用</font><font
  FACE="Arial" SIZE="3">LPTSTR</font><font FACE="宋体" SIZE="3">数据类型,该函数能够正常工作,而不论你的应用程序使用的是什么样的字符串。</p>
  </font><hr>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><b><p><a name="焦点窗口与设备窗口">焦点窗口与设备窗口</a></p>
  </b></font><font SIZE="3"><p align="right"><a href="#目录"><font face="宋体">返回目录</font></a></p>
  </font>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">在单独显示器系统中,当你为一个应用程序设置了全屏独占的控制级时(通过调用<font
  FACE="Arial" SIZE="3">IDirectDraw2::SetCooperativeLevel</font>函数),你必须指定你的应用程序窗口句柄。<font
  FACE="Arial" SIZE="3">DirectDraw</font>使用应用程序的窗口句柄来勾住系统的消息,用来获得应用程序的状态信息、传递键盘输入的消息、和调整窗口大小的消息等。<font
  FACE="Arial" SIZE="3">DirectDraw</font>不需要为普通控制级(窗口模式)的应用程序设置一个窗口句柄。</p>
  <p ALIGN="JUSTIFY">因为多显示器系统必不可少的会用到至少一个显示设备,因此,要用<font
  FACE="Arial" SIZE="3">DirectDraw</font>访问到每一个设备,<font SIZE="3"> </font>你必须为每一个显示设备创建一个<font
  FACE="Arial" SIZE="3">DirectDraw</font>对象。然而,你所创建的每一个<font
  FACE="Arial" SIZE="3">DirectDraw</font>对象需要知道哪一个应用程序的窗口是它可以控制的,以及哪一个是可以接收到击键消息的。换句话说,应用程序需要有一个方法来告诉<font
  FACE="Arial" SIZE="3">DirectDraw</font>哪一个窗口将被用于哪些操作。这个特性是通过焦点窗口(<font
  FACE="Arial" SIZE="3">Focus window</font>)和设备窗口(<font FACE="Arial" SIZE="3">Device 
  window</font>)的概念提供的。<font FACE="Arial" SIZE="3">IDirectDraw2::SetCooperativeLevel</font>函数支持三个标志符使这个特性连接到一个<font
  FACE="Arial" SIZE="3">DirectDraw</font>对象:<font FACE="Arial" SIZE="3">DDSCL_SETFOCUSWINDOW</font>、<font
  FACE="Arial" SIZE="3">DDSCL_SETDEVICEWINDOW</font>、和<font FACE="Arial" SIZE="3">DDSCL_CREATEDEVICEWINDOW</font>。</p>
  <p ALIGN="JUSTIFY">一个“设备窗口”只是一个简单的可见窗口,<font
  FACE="Arial" SIZE="3">DirectDraw</font>可以调整其大小以占据显示器的整个显示区域。你可以手工创建与安装与显示设备一样多的设备窗口,或者你可以让<font
  FACE="Arial" SIZE="3">DirectDraw</font>来为你处理这些细节(当你让<font
  FACE="Arial" SIZE="3">DirectDraw</font>来管理这些设备窗口的创建时,会存在一些协定,这些协定将在“缺省设备窗口”一节中讨论)。</p>
  <p ALIGN="JUSTIFY">一个焦点窗口指的是<font FACE="Arial" SIZE="3">DirectDraw</font>对象可以对其发送击键消息的窗口。一个<font
  FACE="Arial" SIZE="3">DirectDraw</font>应用程序只能拥有一个焦点窗口。</p>
  <p ALIGN="JUSTIFY">要得到更多的资料,请参阅“设置焦点和设备窗口”和“缺省设备窗口”。</p>
  </font><hr>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><b><p><a name="设置焦点窗口和设备窗口">设置焦点窗口和设备窗口</a></p>
  </b></font><font SIZE="3"><p align="right"><a href="#目录"><font face="宋体">返回目录</font></a></p>
  </font>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">调用<font FACE="Arial" SIZE="3">IDirectDraw2::SetCooperativeLevel</font>函数,并且指定<font
  FACE="Arial" SIZE="3">DDSCL_SETDEVICEWINDOW</font>或<font FACE="Arial" SIZE="3">DDSCL_SETFOCUSWINDOW</font>标志,你可以设置一个<font
  FACE="Arial" SIZE="3">DirectDraw</font>对象的焦点窗口和设备窗口。(<font
  FACE="Arial" SIZE="3">SetCooperativeLevel</font>函数同样接受<font FACE="Arial"
  SIZE="3">DDSCL_CREATEDEVICEWINDOW</font>标志,要得到更多的资料,请参阅“缺省设备窗口”。)</p>
  <p ALIGN="JUSTIFY">注意:只有当你想要获得对多显示器的全屏独占的访问时,才能设置焦点和设备窗口。如果你只想对主显示设备和显示器获得独占访问,你可以调用<font
  FACE="Arial" SIZE="3">SetCooperativeLevel</font>函数,在<font FACE="Arial" SIZE="3">dwFlags</font>参数中仅仅指定<font
  FACE="Arial" SIZE="3">DDSCL_FULLSCREEN</font>和<font FACE="Arial" SIZE="3">DDSCL_EXCLUSIVE</font>标志。</p>
  <p ALIGN="JUSTIFY">设置焦点和设备窗口是一个两步的过程:在为一个显示设备创建了<font
  FACE="Arial" SIZE="3">DirectDraw</font>对象之后,你必须首先为它设置焦点窗口。焦点窗口对你的应用程序中所有<font
  FACE="Arial" SIZE="3">DirectDraw</font>对象来说都是同一个,并且通过调用<font
  FACE="Arial" SIZE="3">SetCooperativeLevel</font>函数来设置。在调用中,第一个参数是获取击键消息的窗口的句柄,第二个参数是<font
  FACE="Arial" SIZE="3">DDSCL_SETFOCUSWINDOW</font>标志。</p>
  <p ALIGN="JUSTIFY">在设置了<font FACE="Arial" SIZE="3">DirectDraw</font>对象的焦点窗口后,你应该设置设备窗口和控制级(在这种情况下,为全屏独占模式)。这一步是通过另一次调用<font
  FACE="Arial" SIZE="3">SetCooperativeLevel</font>函数完成的。在这一次的调用中,第一个参数是<font
  FACE="Arial" SIZE="3">DirectDraw</font>将调整其大小为全屏的窗口的句柄,第二个参数是<font
  FACE="Arial" SIZE="3">DDSCL_SETDEVICEWINDOW</font>、<font FACE="Arial" SIZE="3">DDSCL_FULLSCREEN</font>、和<font
  FACE="Arial" SIZE="3">DDSCL_EXCLUSIVE</font>标志的结合。</p>
  <p ALIGN="JUSTIFY">尽管你必须指定一个焦点窗口,你仍然可以让<font
  FACE="Arial" SIZE="3">DirectDraw</font>来操纵你的设备窗口的创建和管理工作。要得到更多的资料,请参阅“缺省设备窗口”。</p>
  </font><hr>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><b><p><a name="缺省设备窗口">缺省设备窗口</a></p>
  </b></font><font SIZE="3"><p align="right"><a href="#目录"><font face="宋体">返回目录</font></a></p>
  </font>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">你可以选择让<font FACE="Arial"
  SIZE="3">DirectDraw</font>来为你完成创建、管理、和销毁设备窗口的工作。简单的说,<font
  FACE="Arial" SIZE="3">DirectDraw</font>管理的窗口被称为是“缺省设备窗口”。尽管使用缺省设备窗口可以把你从创建、管理、销毁设备窗口的繁重任务中解放出来,但是你的应用程序将不能够获得操作系统发送到那些缺省设备窗口的鼠标消息。因此,只有在你的应用程序不需要从那些设备窗口接收鼠标消息的情况下,你才应该选择使用缺省设备窗口。</p>
  <p ALIGN="JUSTIFY">启用缺省设备窗口的过程是很简单的。在首先调用<font
  FACE="Arial" SIZE="3">IDirectDraw2::SetCooperativeLevel</font>函数设置了一个<font
  FACE="Arial" SIZE="3">DirectDraw</font>对象的焦点窗口之后,再次调用该函数,将<font
  FACE="Arial" SIZE="3">dwFlags</font>参数指定为<font FACE="Arial" SIZE="3">DDSCL_CREATEDEVICEWINDOW</font>、<font
  FACE="Arial" SIZE="3">DDSCL_FULLSCREEN</font>和<font FACE="Arial" SIZE="3">DDSCL_EXCLUSIVE</font>标志符的结合。</p>
  <p ALIGN="JUSTIFY">注意:在一个单步调用<font FACE="Arial" SIZE="3">SetCooperativeLevel</font>函数的过程中,设置一个<font
  FACE="Arial" SIZE="3">DirectDraw</font>对象的焦点窗口、告诉<font FACE="Arial"
  SIZE="3">DirectDraw</font>创建一个缺省设备窗口、并且设置<font FACE="Arial"
  SIZE="3">DirectDraw</font>的控制级也是可能的。下面的例程演示了这是怎样完成的:</p>
  </font>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><font FACE="宋体" SIZE="1"><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></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">*/</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">HRESULT hr;</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">hr = g_lpDD-&gt;SetCooperativeLevel(</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">// 该窗口句柄仅仅是焦点窗口的</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">hwndFocus,</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">DDSCL_SETFOCUSWINDOW | DDSCL_FULLSCREEN |</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">DDSCL_EXCLUSIVE | DDSCL_CREATEDEVICEWINDOW);</font></p>
  </font>
</blockquote>

<hr>

<blockquote>
  <p><a name="多显示器系统中的显示设备与加速特性"><font face="宋体"><b>多显示器系统中的显示设备与加速特性</b></font></a></p>
  <font SIZE="3"><p align="right"><a href="#目录"><font face="宋体">返回目录</font></a></p>
  </font>
</blockquote>

<blockquote>
  <font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">一个</font><font FACE="Arial" SIZE="3">DirectDraw</font><font
  FACE="宋体" SIZE="3">应用程序应该列举出所有显示设备,并且从中选择一个显示设备(或让用户来选择),然后通过使用它的硬件全局唯一标志符(</font><font
  FACE="Arial" SIZE="3">GUID</font><font FACE="宋体" SIZE="3">)为该显示设备创建一个</font><font
  FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">对象。这种技术可以使无论是在多显示器系统还是单显示器系统中,以及在任何一种控制级上都能获得最好的显示效果。</p>
  <p ALIGN="JUSTIFY">当前所激活的显示设备也被称为“缺省设备(</font><font
  FACE="Arial" SIZE="3">Default device</font><font FACE="宋体" SIZE="3">)”,或“空设备(</font><font
  FACE="Arial" SIZE="3">Null device</font><font FACE="宋体" SIZE="3">)。后一个名称的得来是因为当前所激活的显示设备是将</font><font
  FACE="Arial" SIZE="3">NULL</font><font FACE="宋体" SIZE="3">作为它的</font><font
  FACE="Arial" SIZE="3">GUID</font><font FACE="宋体" SIZE="3">而列举出来的。许多现有的应用程序为缺省设备创建一个</font><font
  FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">对象,并且假定该设备是硬件加速的。然而,在多显示器系统上,缺省设备并不一定是硬件加速的,这取决于当时对</font><font
  FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">所设置的控制级。</p>
  <p ALIGN="JUSTIFY">在全屏独占模式中,缺省设备是硬件加速的,但是已安装的其它显示设备则不是。这意味着,具有全屏独占模式的应用程序在多显示器系统中可以和任何其它系统一样运行得非常快速,但是不能利用系统内置的跨显示器的图形操作。需要使用到多显示设备(显示器)的全屏独占模式的应用程序,可以为每一个他想要使用的显示设备(显示器)创建一个</font><font
  FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">对象。应注意的是:为一个特定的设备创建一个</font><font
  FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">对象,你必须提供该设备的</font><font
  FACE="Arial" SIZE="3">GUID</font><font FACE="宋体" SIZE="3">(在调用</font><font
  FACE="Arial" SIZE="3">DirectDrawEnumerate</font><font FACE="宋体" SIZE="3">函数时可以被列举出来)。</p>
  <p ALIGN="JUSTIFY">当你把控制级设置为普通(窗口模式)时,缺省设备则不具有硬件加速性;此时的缺省设备成为了一个有效的、将两个物理显示设备的资源联合起来的逻辑仿真显示设备,因此,当设置了控制级为普通时,缺省设备是根本没有被硬件加速的。从另一个方面来说,当设置了控制级为普通时,缺省设备自动具有了跨越各显示器(显示设备)的图形操作的能力。典型的实例是,当第二显示器的逻辑地址位于主显示器的左边时,对主显示器进行带负坐标的</font><font
  FACE="Arial" SIZE="3">Blit</font><font FACE="宋体" SIZE="3">操作是有效的。</p>
  <p ALIGN="JUSTIFY">如果了你给应用程序设置控制级为普通模式,却仍需要利用硬件的加速特性,你必须只创建一个单独的</font><font
  FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">对象,使用一个特定显示设备的</font><font
  FACE="Arial" SIZE="3">GUID</font><font FACE="宋体" SIZE="3">。应注意的是:如果你不使用缺省设备,你不会获得自动跨越设备的能力。这就是说,对主页面的</font><font
  FACE="Arial" SIZE="3">Blit</font><font FACE="宋体" SIZE="3">操作超出了显示器边界的部分将会被裁减掉(如果你使用了裁减器),或操作失败,返回</font><font
  FACE="Arial" SIZE="3">DDERR_INVALIDRECT</font><font FACE="宋体" SIZE="3">的错误。</p>
  <p ALIGN="JUSTIFY">作为所有系统上的惯例,在创建了</font><font FACE="Arial"
  SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">对象后,获得其能力或查询其它接口之前,你应该立即设置其控制级。除此之外,还应该避免在多显示器系统中多次设置控制级。如果你的应用程序需要从全屏模式切换到窗口模式运行,最好的做法是新建一个</font><font
  FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">对象。</p>
  </font>
</blockquote>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -