📄 multimon.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><a name="目录"><font face="宋体" size="6" color="#FF8000">多显示器系统</font></a></b></p>
<p align="right" style="margin-top: -10; margin-bottom: -8"><a href="index.htm"
style="text-decoration: none"><font face="宋体"><span style="text-decoration: none">返回上级</span></font></a></p>
<hr>
<blockquote>
<font FACE="Arial" SIZE="3"><p ALIGN="JUSTIFY">Windows 98</font><font FACE="宋体"
SIZE="3">和</font><font FACE="Arial" SIZE="3">Windows NT 5.0</font><font FACE="宋体"
SIZE="3">可以支持在一个单独的系统中存在多个显示设备和显示器。多显示器架构(通常简称为“</font><font
FACE="Arial" SIZE="3">MultiMon</font><font FACE="宋体" SIZE="3">”)使操作系统使用两个或多个显示设备和显示器来建立一个逻辑桌面成为可能。举例来说,在一个有两台显示器的系统中,用户可以在其中的任何一个显示器上显示他的应用程序,或者将窗口从一个窗口中拖到另一个窗口中。</p>
</font>
</blockquote>
<blockquote>
<font FACE="宋体" SIZE="3"><p ALIGN="JUSTIFY">这一章的内容包含了如何在一个多显示器系统中使用</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋体" SIZE="3">的信息。讨论了一下的主题。</p>
</font>
</blockquote>
<blockquote>
<blockquote>
<font FACE="宋体" SIZE="3"><ol>
<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>
</ol>
</font>
</blockquote>
<font FACE="宋体" SIZE="3"><font FACE="Arial" SIZE="3"><p ALIGN="JUSTIFY">DirectX SDK</font>的\<font
FACE="Arial" SIZE="3">Samples\Misc</font>目录中包含了一些文件,提供了用于多显示器系统中的辅助性的函数。<font
FACE="Arial" SIZE="3">Multimon.h</font>头文件使在<font FACE="Arial" SIZE="3">Windows
98</font>多显示器系统下编译的源代码能够在使用<font FACE="Arial" SIZE="3">Windows
95</font>的机器中顺利的编译和执行。除此之外,<font FACE="Arial" SIZE="3">Ddmm.cpp</font>文件<font
FACE="Arial" SIZE="3">Ddmm.h</font>文件提供了辅助性的函数,允许你从一个窗口句柄或设备字符串中创建或获得<font
FACE="Arial" SIZE="3">DirectDraw</font>对象。</p>
</font>
</blockquote>
<font FACE="宋体" SIZE="3">
<hr>
<blockquote>
<b><font FACE="黑体"><p></font><a name="在多显示器系统中列举显示设备">在多显示器系统中列举显示设备</a></b></p>
<font SIZE="3"><p align="right"><a href="#目录"><font face="宋体">返回目录</font></a></p>
</font>
</blockquote>
<blockquote>
<p ALIGN="JUSTIFY">使用<font FACE="Arial" SIZE="3">DirectDrawEnumerateEx</font>函数可以列举出在多显示器系统中的各显示设备,指定一个标志来决定哪种类型的<font
FACE="Arial" SIZE="3">DirectDraw</font>设备可以被列举出来。该函数每列举出一个设备,就调用一次应用程序定义的<font
FACE="Arial" SIZE="3">DDEnumCallbackEx</font>型回调函数。</p>
</blockquote>
<blockquote>
<ul>
<li><font color="#FF0000">因为显示设备包括了显示卡和显示器,而且在通常情况下,一个显卡对应一个显示器,为了便于理解,以后我们谈到的显示设备,读者可以简单的将其直接视为显示器。</font></li>
</ul>
</blockquote>
</font>
<blockquote>
<font FACE="Arial" SIZE="3"><p ALIGN="JUSTIFY">DirectDrawEnumerateEx</font><font
FACE="宋体" SIZE="3">函数被</font><font FACE="Arial" SIZE="3">Windows 98</font><font
FACE="宋体" SIZE="3">和</font><font FACE="Arial" SIZE="3">Windows NT 5.0</font><font
FACE="宋体" SIZE="3">(或更高版本)所支持,并且只能通过从动态连接库中获得函数地址来调用。在运行期,它是这样实现的:调用</font><font
FACE="Arial" SIZE="3">GetProcAddress Win32</font><font FACE="宋体" SIZE="3">函数,从</font><font
FACE="Arial" SIZE="3">Ddraw.dll</font><font FACE="宋体" SIZE="3">动态连接库中载入函数的地址。下面的例程演示了这个方法。</p>
</font>
</blockquote>
<blockquote>
<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">HINSTANCE h = LoadLibrary("ddraw.dll");</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">// 如果ddraw.dll不存在搜索的路径中,</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">// 那么,可能还没有安装DirectX,返回失败。</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">if (!h)</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">return FALSE;</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">// 在这个例子中,我们使用ANSI版本。</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">LPDIRECTDRAWENUMERATEEX lpDDEnumEx;</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">lpDDEnumEx = (LPDIRECTDRAWENUMERATEEX)
GetProcAddress(h,"DirectDrawEnumerateExA");</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">// 以及所有非显示的DirectDraw设备。</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">if (lpDDEnumEx)</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">lpDDEnumEx(Callback, 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">DDENUM_ATTACHEDSECONDARYDEVICES |</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">DDENUM_NONDISPLAYDEVICES </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">else</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">* 我们一定是运行在一个较老版本的DirectDraw中。</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">* 于是,返回到DirectDrawEnumerate函数以列举出单显示器的标准显示设备。</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">DirectDrawEnumerate(OldCallback,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">/* 注意:这里有一个小的技巧,</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">* 让OldCallback 回调函数包装进DDEnumCallbackEx回调函数。</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">* BOOL FAR PASCAL OldCallback(GUID FAR *lpGUID,</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">* LPSTR pName,</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">* LPSTR pDesc,</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">* LPVOID pContext)</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">* return
Callback(lpGUID,pName,pDesc,pContext,NULL);</font><font FACE="宋体" SIZE="3"></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -