• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi 位操作及多显示器窗口显示

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

今天做定制时遇到Delphi位操作及多显示器扩展显示问题,故总结一下。

AND、OR、NOT。AND、OR、NOT可不仅仅只对逻辑表达式有作用,它们还可以操作数;

  AND:按位与,如:1 AND 2其结果为0

  OR:按位或,如:1 OR 2其结果为3

  Not:按位取反:如Not 1其结果对于有符号数是-2,对于无符号数是65534

  另外,还有按位异或XOR:如:1 XOR 2结果为3

   移位操作:Delphi提供了SHL和SHR进行移位左移和右移:例如:2 SHR1表示2按位右移一位结果为1。

   Delphi中的数:既然有位的操作就一定涉及到数的类型:是有符号数(头一位用0和1表示正负)还是无符号数。Delphi中:Shortint(8位)、Smallint(16位)、Longint(32位)、Integer(32位)、Int64(64位)是有符号数;而Byte(8位)、Word(16位)、Longword(32位)是无符号数。它们之间可以像C一样强制转换。例如:Smallint类型的-1转换成Word类型就是65535。转换方法是Word(-1)。

delphi多显示器操作

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

几个重要的概念:桌面、显示器、主显示器。桌面实际上是指Windows可显示的逻辑区域。实际上是可以将一个窗体显示到桌面之外的。然而这并不是说桌面的所有部分都会显示在某台显示器上(原因如前所述);但反过来说,任何一个显示器显示的内容都必然是桌面的一部分。桌面是一个矩形区域,可以通过顶点坐标(Top,Left)和宽高来描述桌面的尺寸。Windows以主显示器的顶点坐标作为坐标系的原点。

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

Windows为多显示器应用程序的开发提供了一组API。VCL将这些API封装起来,非常自然的融入整个Framework之中,使得开发多显示器应用程序变得非常简单。一般Delphi开发多显示器程序只需用到两个类:TScreen和TMonitor。

TScreen描述与显示设备有关的一些信息,我们主要关心与显示器逻辑位置和尺寸有关的信息。其他方面的内容可以在Delphi的文档中获知。在程序运行的时候VCL自动创建一个TScreen的实例——全局变量,所以通常情况下程序是不需要实例化TScreen的。TScreen有一组形如Desktop*的属性,这些属性描述了整个桌面的尺寸和各顶点坐标。还有对开发多显示器应用程序有重要意义的连个属性:MonitorCount和Monitors。通过这两个属性我们可以枚举出系统中所有的显示器(TMonitor)的实例,每个实例都反映了相应显示器的相对位置和分辨率等信息(后文会详细说明)。

在TScreen的众多属性之中,我们会找到Height和Width这两个属性。要特别警惕它们不是指整个桌面的尺寸,而是指主显示器的高度和宽度。这非常容易让人产生错觉,无以为是整个桌面的尺寸。与之类似的还有形如WorkArea*的一组属性,它们描述了主显示器的工作区域的尺寸和各顶点坐标。是不是觉得少了什么?为什么没有获取主显示器相对位置的属性?原因就像前面所说的:Windows是以主显示器的左上角为坐标系原点的,所以主显示器的相对位置必然是(0,0)。除了这些属性之外,还要介绍TScreen的三个成员函数:MonitorFromPoint,MonitorFromRect和MonitorFromWindow。顾名思义,他们分别是获取个坐标、某个区域和某个窗口所在的显示器的实例。在实际的开发中可能也会用到。

TMonitor类封装了物理显示器的有关属性——这些属性都是只读的。一些常用属性如下:

Handle:获取该显示器的Windows句柄

MonitorNum:获取显示器的编号

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

Top:获取显示器的上边界

Left:获取显示器的左边界

Height:获取显示器的高度

Width:获取显示器的宽度

BoundsRect:获取显示器的对应桌面的区域,它与上面四个属性是等价的

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi操作剪贴板发布时间:2022-07-18
下一篇:
delphi异步选择模型编程TCP发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap