今天做定制時遇到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:獲取顯示器的工作區對應桌面的區域。