前言
一般情况下,计算机用户都是使用单一的显示屏来观察显示的信息,目前比较流行的是17英寸的显示器,可以满足一般用户的需求。但是在一些特殊的场合下,例如需要对现场进行大范围的监控、cad绘图、或应用电子地图技术等的情况下,需要全景显示时,用户就不得不要求计算机有足够大的显示桌面,以便对场景的细节看的更清楚、操作起来更方便。针对上述情况,即使是二十九寸的显示器其有效的显示尺寸也是十分有限的,这时候解决桌面大小问题就不得不采用多屏显示技术,windows操作系统支持这种技术,这里的多屏显示并不是指采用多屏分配器驱动多个显示器,从而使多个屏幕显示相同的画面,就如同vc界面编程中的动态拆分效果,而是指在一台计算机上安装多个显卡带多台显示器,实现成倍的扩展计算机桌面尺寸的目的。例如台湾dream公司推出的viewpacket软件,可以一边显示视频流,一边编辑word文档,一边上网浏览网络上的信息,极大的方便了用户的使用。
一、多屏显示的系统配置方法
为了安装多显示器,首先检查机器硬件,当前windows操作系统只支持pci适配器来实现多显示器桌面,它要求显卡必须使用以下芯片组中的一种:ati mach64、s3 764和764+、cirrushgic5436、5446和7458、imagine 128 series1和2、s3 virge或et6000、m9711等。一般情况下,一个显卡驱动一个显示器,一台机器最多可以驱动7台显示器,其中一台为主显示器,其余为副显示器。主显示器也是windows启动画面出现的那个显示器。
进入"控制面板"-"显示",双击"显示",弹出"显示属性"对话框,选中"设置",如果安装了多个监视器,这时候对话框的上半部分显示系统中目前显示器的数量。可右键单击一个监视器图标,再单击"标识"查看对应于单击其图标的监视器的显示编号。请将它们拖动到代表在监视器间移动项目方式的位置。例如,如果您正使用两个监视器,并希望通过左右拖动来将项目从一个监视器中移到另一个中,请将图标并排排列。要通过上下拖动来在监视器间移动项目,请将图标上下排列。图标的位置并不一定与监视器的物理位置相对应。您可以将图标上下放置,即使监视器是并排放置的。
二、多屏显示的软件实现
通过上面的设置,虽然使windows支持多显示器扩展桌面的功能,但也仅仅是实现了设备的连接与管理,一般windows应用程序的窗口不能自动运行到副显示器上,用户只能通过鼠标拖动来将程序的窗口扩展到副显示器上,如果需要将程序窗口自动扩展到不同的显示器显示,必须采用相应的多屏显示编程技术。在这种技术中,可以使用windows的user32.dll动态连接库提供的api函数setwindowpos()(如果采用vc这个开发平台,cwnd类提供了一个同样的成员函数),它的功能是更改窗口的大小、位置及窗口的顺序,因此可以用来在多显示器桌面上实现应用程序窗体的定位显示。下面对这个函数进行详细的解释:
| bool setwindowpos( hwnd hwnd, // 窗口的句柄; hwnd hwndinsertafter, // 窗口次序句柄, int x, // 窗口左上角的水平位置; int y, // 窗口左上角的垂直位置; int cx, // 窗口的宽度; int cy, // 窗口的高度; uint uflags file://标志位; ); |
这里需要解释的有hwndinsertafter、uflags两个参数
hwndinsertafter
在窗口的"z"序中排在需要的设置的窗口之前的窗口句柄;这个参数取以下值:
| value | meaning |
| hwnd_bottom | 将要操作的窗口放置在所有窗口之下; |
| hwnd_notopmost | 将要操作的窗口放置在"non-topmost"窗口之下; |
| hwnd_top | 将操作的窗口放置在所有的窗口之上; |
| hwnd_topmost | 将要操作的窗口放置在"non-topmost"窗口之上; |
uflags
规定窗口的尺寸和位置的标志,这个参数通常取以下值:
| value | meaning |
| swp_drawframe | 窗口重画时,绘制出窗口类中所描述的窗口的框架 |
| swp_hidewindow | 隐藏窗口; |
| swp_noactivate | 窗口无任何动作; |
| swp_nomove | 保持窗口的当前位置; |
| swp_noredraw | 在新位置并不重画窗口; |
| swp_nosize | 改变窗口的位置,并不改变窗口的大小,既忽略cx,cy两个参数的值; |
| swp_nozorder | 窗口重画时,保留当前的顺序,既忽略hwndinsertafter参数的值 |
| swp_showwindow | displays the window. |
另,该参数还可以取其它的值,具体含义读者可以参考msdn。
为了说明问题,下面的vb代码仅仅实现了在两个显示器分别显示不同的窗口,用户点击按钮后,主显示器显示窗口form1,副显示器显示窗口form2,感兴趣的读者可以稍加修改,就可以应用到实际项目开发中去。
首先在vb全局模块中声明:
| public declare function setwindowpos lib "user32" alias "setwindowpos" (byval hwnd as long, byval hwndinsertafter as long, byval x as long, byval y as long, byval cx as long, byval cy as long, byval wflags as long) as long |
其次在需要定位的两个窗口模块中调用该函数。具体的vb代码是:
private sub form1_load( ) end sub |
为了正确的显示,需要将窗体的scalemode属性设置为twips,这样才可以与windows系统中screenwidth和screenheight的计量单位twips保持一致。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器