zoukankan      html  css  js  c++  java
  • Delphi 位操作及多显示器窗口显示

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

    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:获取显示器的工作区对应桌面的区域。

  • 相关阅读:
    未能创建可接受的游标。
    怎样修改查看Oracle字符集
    2005年国内各大公司的薪酬一览 同学发给我的,留在这里刺激一下自己,不过他说到了中国工程物理研究院(四川绵阳) 对此不表同意,具体情况我可最清楚呀,哈哈
    破解低价笔记本惊人的秘密
    Struts 的安装、配置与运行zt
    有用的数据:30款市场主流车型真实油耗一览
    JDBC连接Oracle数据库常见问题及解决方法
    查锁的方法
    用Oracle闪回功能恢复偶然丢失的数据数据被误删除了,多亏了万能的oracle,....后怕
    powerdesigner中去掉生成sql中的引号
  • 原文地址:https://www.cnblogs.com/doit8791/p/2558297.html
Copyright © 2011-2022 走看看