delphi开发与应用:在Delphi中开发使用多显示器的应用程序

Windows可以将多个显示器映射为虚拟桌面使我们可以利用这点设计出方便工作应用例如PowerPo就充分发挥了双显示器优势(大多数笔记本电脑都支持)它可以在个显示器上播放幻灯片而在另个显示器上显示备注可以控制播放进程使使用者做商务演说时候非常等心应手那么我们如何开发这种应用呢?这篇文章将向你展示如果用Delphi实现使用多显示器应用



Windows还支持克隆显示方式每个显示器输出同样内容这对某些应用也是有意义还有些显卡虽然也支持两个显示器不过他们并不是真正意义上多显示器而是虚拟高分辨率显示模式(如2048×768或者1024×1536)通过显卡将画面分别显示到两个显示器上这两种显示模式都不是本文介绍zhongdian而且也非常简单所以我们也就不再赘述了



Windows最多支持10个显示器Windows将所有显示器映射为个大虚拟桌面可以将显示器理解为桌面某个局部视图在显示属性中可以根据显示器物理位置任意排布这些显示器如果显示器排列不规则虚拟桌面上某些部分可能无法显示在任何个显示器上为了不使个窗体显示在两个显示器的间等原因考虑Windows将个显示器作为主显示器启动计算机时登录对话框就显示在主显示器中绝大多数启动示都会显示在主监视器中



根据上述介绍不难发现几个重要概念:桌面、显示器、主显示器等首先必须先弄清楚这些概念以及他们的前关系这是掌握多显示器应用开发思路方法重点理解了这些概念其他部分就非常好理解了



桌面实际上是指Windows可显示逻辑区域实际上是可以将个窗体显示到桌面的外然而这并不是说桌面所有部分都会显示在某台显示器上(原因如前所述);但反过来说任何个显示器显示内容都必然是桌面部分



桌面是个矩形区域可以通过顶点坐标(TopLeft)和宽高来描述桌面尺寸为什么还需要顶点坐标呢?顶点坐标不是想当然(0,0)那么(0,0)在哪里呢?说来话长还是让我们先来回顾下刚才提到地个概念——主显示器吧Windows希望时候显示到主显示器人们习惯于关注个离自己最近显示器而Windows也不可能强制用户把最左边个显示器作为主显示器这样来应用为了把自己显示到主显示器就需要费脑筋计算然而多数用户都只有个显示器(两个显示器实在太占地方了)应用也不希望大费周章去计算主显示器在哪里自己应该显示在什么位置所以Windows提出了个合理解决方案:以主显示器顶点坐标作为坐标系原点这样普通的需要想在单显示器环境中样考虑问题就可以了



显示器是桌面局部视图就好像透过窗户看窗外风景站在区别窗前就可以看到区别画面同样显示器也是个矩形区域同样可以通过顶点坐标(TopLeft)和宽高来描述它尺寸顶点坐标是相对于桌面坐标系原点也就是相对于主显示器顶点



工作区概念比较简单它是指显示器中除了任务条和其他停靠在桌面上窗体的外矩形区域



Windows为多显示器应用开发提供了组APIVCL将这些API封装起来非常自然融入整个Framework的中使得开发多显示器应用变得非常简单下面就介绍和的相关内容



在VCL的中大家最熟悉恐怕非TCustomForm莫属了它是所有窗体基类TCustomFormPosition属性用来设置窗体现实位置其可选值中有两个是值得关心:个是poScreenCenter当Position属性被设置成poScreenCenter时窗体会显示到主显示器中央;另个是poDesktopCenter当Position属性被设置成poDesktopCenter时窗体显示在整个桌面中央如果把这个属性设成poDesktopCenter又运行在个有多台显示器系统上那么这个窗口就会显示在两个显示器的间会给用户带来不必要麻烦因此即使我们不是针对多显示器而设计也应该细心处理这个值另外个属性是DefaultMonitor作用和Position有些类似决定窗口最初显示在哪个显示器内它有 4个备选值:dmDesktopdmPrimarydmMainForm和dmActiveForm他们含义如下:



Value
Meaning

dmDesktop
不特别处理

dmPrimary
将窗体显示到第个显示器上这又是个陷阱字面上理解是主显示器而事实上它是指Screen.Monitor[0]这个显示器

dmMainForm
将窗体显示到主窗体所在显示器

dmActiveForm
将窗体显示到桌面上活动窗体所在显示器





TCustomForm还有个只读共有属性(没有Published)Monitor它提供了访问窗体所在显示器例子引用这个值和DefaultMonitor是有紧密关联

那么如何在使窗体在区别显示器的间移动呢?这并不困难估计你也想到了这里介绍两种思路方法:

   可以设置TCustomFormTop和Left使窗体显示在桌面任意位置正如前面所述桌面是由所有显示器组成它们有共同坐标系所以可以根据显示器逻辑位置决定窗体位置现在问题是如何获得每个显示器逻辑位置和尺寸后面就会介绍

第 2   可以TCustomFormMakeFullyVisible思路方法将窗体完全显示到指定显示器的中可以通过这个思路方法避免窗口在两个显示器上各显示部分



刚才我们提出了个问题:如何获得每个显示器逻辑位置和尺寸为了解答这个问题需要再介绍连个类:TScreen和TMonitor



TScreen描述和显示设备有关些信息我们主要关心和显示器逻辑位置和尺寸有关信息其他方面内容可以在Delphi文档中获知运行时候VCL自动创建个TScreen例子——全局变量所以通常情况下是不需要例子化TScreen



TScreen有组形如Desktop*属性这些属性描述了整个桌面尺寸和各顶点坐标还有对开发多显示器应用有重要意义连个属性:MonitorCount和Monitors通过这两个属性我们可以枚举出系统中所有显示器(TMonitor)例子每个例子都反映了相应显示器相对位置和分辨率等信息(后文会详细介绍说明)

在TScreen众多属性的中我们会找到Height和Width这两个属性要特别警惕它们不是指整个桌面尺寸而是指主显示器高度和宽度这非常容易让人产生错觉无以为是整个桌面尺寸和的类似还有形如WorkArea*组属性它们描述了主显示器工作区域尺寸和各顶点坐标是不是觉得少了什么?为什么没有获取主显示器相对位置属性?原因就像前面所说:Windows是以主显示器左上角为坐标系原点所以主显示器相对位置必然是(00)

除了这些属性的外还要介绍TScreen 3个成员:MonitorFromPoMonitorFromRect和MonitorFromWindow顾名思义他们分别是获取个坐标、某个区域和某个窗口所在显示器例子在实际开发中可能也会用到



最好再来看看TMonitor类它封装了物理显示器有关属性——这些属性都是只读下表简单介绍了这些属性含义它们对编写多显示器应用非常有用:

属性
介绍说明

Handle
获取该显示器Windows句柄

MonitorNum
获取显示器编号

Primary
获取该显示器是否是主显示器又且仅有个显示器Primary是True

Top
获取显示器上边界

Left
获取显示器左边界

Height
获取显示器高度

Width
获取显示器宽度

BoundsRect
获取显示器对应桌面区域它和上面 4个属性是等价

WorkareaRect
获取显示器工作区对应桌面区域


清楚地了解了TScreen和TMonitor的后前面问题也就自然解决了到这里本文已经介绍了开发多显示器应用所需全部知识相信你可以利用这些知识开发出非常实用软件Software产品



附:你可以下载个DEMO帮助理解本文

http://my.6to23.com/yukin2010/download/MultiMonitorDemo.rar
Tags:  delphi小程序 delphi程序设计 delphi程序开发 delphi开发与应用

延伸阅读

最新评论

发表评论