在Delphi中開發使用多顯示器的應用程式

2021-03-31 08:57:00 字數 4612 閱讀 5364

windows

可以將多個顯示器對映為虛擬桌面,使我們可以利用這一點設計出方便工作的應用程式。例如

powerpoint

delphi

實現使用多顯示器的應用程式。

windows

還支援轉殖顯示方式,每個顯示器輸出同樣的內容,這對某些應用也是有意義的。還有些顯示卡雖然也支援兩個顯示器,不過他們並不是真正意義上的多顯示器,而是虛擬高解析度顯示模式(如

2048

×768

或者1024

×1536

),通過顯示卡將畫面分別顯示到兩個顯示器上。這兩種顯示模式都不是本文介紹的

zhongdian

,而且也非常簡單,所以我們也就不再贅述了。

windows

最多支援

10個顯示器,

windows

將所有顯示器對映為乙個大的虛擬桌面。可以將顯示器理解為桌面某個區域性的檢視。在顯示屬性中可以根據顯示器的物理位置任意排布這些顯示器。如果顯示器的排列不規則,虛擬桌面上的某些部分可能無法顯示在任何乙個顯示器上。為了不使乙個窗體顯示在兩個顯示器之間等原因的考慮,

windows

將乙個顯示器作為主顯示器。啟動計算機時,登入對話方塊就顯示在主顯示器中。絕大多數程式啟動示,都會顯示在主監視器中。

根據上述介紹,不難發現幾個重要的概念:桌面、顯示器、主顯示器等。首先必須先弄清楚這些概念以及他們之前的關係。這是掌握多顯示器應用程式開發方法的重點。理解了這些概念,其他的部分就非常好理解了。

桌面實際上是指

windows

可顯示的邏輯區域。實際上是可以將乙個窗體顯示到桌面之外的。然而這並不是說桌面的所有部分都會顯示在某台顯示器上(原因如前所述);但反過來說,任何乙個顯示器顯示的內容都必然是桌面的一部分。

桌面是乙個矩形區域,可以通過頂點座標(

top,

left

)和寬高來描述桌面的尺寸。為什麼還需要頂點座標呢?因為頂點座標不是想當然的(

0,0)。那麼(

0,0)在**呢?說來話長,還是讓我們先來回顧一下剛才提到地乙個概念——主顯示器吧。

windows

希望一般的程式初始的時候顯示到主顯示器,因為人們習慣於關注乙個離自己最近的顯示器。而

windows

也不可能強制使用者把最左邊乙個顯示器作為主顯示器,這樣一來應用程式為了把自己顯示到主顯示器,就需要費腦筋的計算。然而,多數使用者都只有乙個顯示器(兩個顯示器實在太佔地方了),而一般的應用程式也不希望大費周章的去計算主顯示器在**,自己應該顯示在什麼位置。所以

windows

提出了乙個合理的解決方案:以主顯示器的頂點座標作為座標系的原點。這樣一來,普通的程式之需要想在單顯示器環境中一樣考慮問題就可以了。

顯示器是桌面的區域性檢視。就好像透過窗戶看窗外的風景,站在不同的窗前就可以看到不同的畫面。同樣的,顯示器也是乙個矩形區域,同樣可以通過頂點座標(

top,

left

)和寬高來描述它的尺寸。頂點座標是相對於桌面座標系原點的,也就是相對於主顯示器的頂點。

工作區的概念比較簡單,它是指顯示器中除了任務條和其他停靠在桌面上的窗體之外的矩形區域。

windows

為多顯示器應用程式的開發提供了一組

api。

vcl將這些

api封裝起來,非常自然的融入整個

framework

之中,使得開發多顯示器應用程式變得非常簡單。下面就介紹與之相關的內容。

在vcl

之中大家最熟悉的恐怕非

tcustomform

莫屬了,它是所有窗體的基類。

tcustomform

的position

屬性用來設定窗體的現實位置,其可選值中有兩個是值得關心的:乙個是

poscreencenter

,當position

屬性被設定成

poscreencenter

時,窗體會顯示到主顯示器的**;另乙個是

podesktopcenter

,當position

屬性被設定成

podesktopcenter

時,窗體顯示在整個桌面的**。如果把這個屬性設成

podesktopcenter

,程式又執行在乙個有多台顯示器的系統上,那麼這個視窗就會顯示在兩個顯示器之間,會給使用者帶來不必要的麻煩。因此即使我們的程式不是針對多顯示器而設計的,也應該細心處理這個值。另外乙個屬性是

defaultmonitor

,它的作用與

position

有些類似,決定視窗最初顯示在哪個顯示器內。它有四個備選值:

dmdesktop

,dmprimary

,dmmainform

和dmactiveform

。他們的含義如下:

value

meaning

dmdesktop

不特別處理

dmprimary

將窗體顯示到第乙個顯示器上。這又是乙個陷阱,字面上理解是主顯示器,而事實上它是指

screen.monitor[0]

這個顯示器。

dmmainform

將窗體顯示到主窗體所在的顯示器

dmactiveform

將窗體顯示到桌面上活動窗體所在的顯示器

tcustomform

還有乙個唯讀的共有屬性(沒有

published

)monitor

,它提供了訪問窗體所在顯示器例項的引用,這個值與

defaultmonitor

是有緊密的關聯的。

那麼怎麼在使窗體在不同的顯示器之間移動呢?這並不困難,估計你也想到了。這裡介紹兩種方法:

第一,

可以設定

tcustomform

的top

和left

使窗體顯示在桌面的任意位置。正如前面所述,桌面是由所有顯示器組成的。它們有共同的座標系,所以可以根據顯示器的邏輯位置決定窗體的位置。現在的問題是如何獲得每個顯示器的邏輯位置和尺寸,後面就會介紹。

第二,

可以呼叫

tcustomform

的makefullyvisible

方法將窗體完全顯示到指定的顯示器之中。可以通過這個方法避免視窗在兩個顯示器上各顯示一部分。

剛才我們提出了乙個問題:如何獲得每個顯示器的邏輯位置和尺寸。為了解答這個問題,需要再介紹連個類:

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

獲取顯示器的工作區對應桌面的區域。

在Delphi中操作Mysql

以前在vc中使用過mysql,當時是找的乙個現成的c mysql類。最近在delphi中又需要操作mysql,最初找了個封閉過的類,但已經是七八年以前的程式了,我機器上裝的是mysql5.1,使用了5.1中的libmysql.dll 2.25mb 連線正常 查詢乙個字段正常,但查詢兩個欄位就只能獲取...

關於 delphi中with在Python中的討論

下面這段是我昨天在python乙個討論群裡對delphi中with在python中的討論,希望能對大家有所啟發,同時我也將這個討論記錄下來,有時間多體會體會。不要小看這段,最後 seewind 說的話很經典。江南 23 46 27 其實 我覺得是想找 python中類似 delphi 的 with ...

DELPHI開發和使用REDIS

delphi開發和使用redis redis server是獨立的存在,支援windows,linux redis pub sub 用於聊天 只是其中的一種用法 任何訊息或其他型別資料 都可以 必須安裝 redis server 可同時訂閱多個發布的頻道 也可以用於 中介軟體集群之間 非同步訊息佇列...