在Delphi中開發(fā)使用多顯示器的應(yīng)用程序
發(fā)表時間:2024-02-11 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]Windows可以將多個顯示器映射為虛擬桌面,使我們可以利用這一點設(shè)計出方便工作的應(yīng)用程序。例如PowerPoint就充分發(fā)揮了雙顯示器的優(yōu)勢(大多數(shù)的筆記本電腦都支持),它可以在一個顯示器上播放幻燈片,而在另一個顯示器上顯示備注,可以控制播放的進程,使使用者做商務(wù)演說的時候非常等心應(yīng)手。那么我們...
Windows可以將多個顯示器映射為虛擬桌面,使我們可以利用這一點設(shè)計出方便工作的應(yīng)用程序。例如PowerPoint就充分發(fā)揮了雙顯示器的優(yōu)勢(大多數(shù)的筆記本電腦都支持),它可以在一個顯示器上播放幻燈片,而在另一個顯示器上顯示備注,可以控制播放的進程,使使用者做商務(wù)演說的時候非常等心應(yīng)手。那么我們怎么開發(fā)這種應(yīng)用程序呢?這篇文章將向你展示如果用Delphi實現(xiàn)使用多顯示器的應(yīng)用程序。
Windows還支持克隆顯示方式,每個顯示器輸出同樣的內(nèi)容,這對某些應(yīng)用也是有意義的。還有些顯卡雖然也支持兩個顯示器,不過他們并不是真正意義上的多顯示器,而是虛擬高分辨率顯示模式(如2048×768或者1024×1536),通過顯卡將畫面分別顯示到兩個顯示器上。這兩種顯示模式都不是本文介紹的zhongdian,而且也非常簡單,所以我們也就不再贅述了。
Windows最多支持10個顯示器,Windows將所有顯示器映射為一個大的虛擬桌面。可以將顯示器理解為桌面某個局部的視圖。在顯示屬性中可以根據(jù)顯示器的物理位置任意排布這些顯示器。如果顯示器的排列不規(guī)則,虛擬桌面上的某些部分可能無法顯示在任何一個顯示器上。為了不使一個窗體顯示在兩個顯示器之間等原因的考慮,Windows將一個顯示器作為主顯示器。啟動計算機時,登錄對話框就顯示在主顯示器中。絕大多數(shù)程序啟動示,都會顯示在主監(jiān)視器中。
根據(jù)上述介紹,不難發(fā)現(xiàn)幾個重要的概念:桌面、顯示器、主顯示器等。首先必須先弄清楚這些概念以及他們之前的關(guān)系。這是掌握多顯示器應(yīng)用程序開發(fā)方法的重點。理解了這些概念,其他的部分就非常好理解了。
桌面實際上是指Windows可顯示的邏輯區(qū)域。實際上是可以將一個窗體顯示到桌面之外的。然而這并不是說桌面的所有部分都會顯示在某臺顯示器上(原因如前所述);但反過來說,任何一個顯示器顯示的內(nèi)容都必然是桌面的一部分。
桌面是一個矩形區(qū)域,可以通過頂點坐標(Top,Left)和寬高來描述桌面的尺寸。為什么還需要頂點坐標呢?因為頂點坐標不是想當然的(0,0)。那么(0,0)在哪里呢?說來話長,還是讓我們先來回顧一下剛才提到地一個概念——主顯示器吧。Windows希望一般的程序初始的時候顯示到主顯示器,因為人們習慣于關(guān)注一個離自己最近的顯示器。而Windows也不可能強制用戶把最左邊一個顯示器作為主顯示器,這樣一來應(yīng)用程序為了把自己顯示到主顯示器,就需要費腦筋的計算。然而,多數(shù)用戶都只有一個顯示器(兩個顯示器實在太占地方了),而一般的應(yīng)用程序也不希望大費周章的去計算主顯示器在哪里,自己應(yīng)該顯示在什么位置。所以Windows提出了一個合理的解決方案:以主顯示器的頂點坐標作為坐標系的原點。這樣一來,普通的程序之需要想在單顯示器環(huán)境中一樣考慮問題就可以了。
顯示器是桌面的局部視圖。就好像透過窗戶看窗外的風景,站在不同的窗前就可以看到不同的畫面。同樣的,顯示器也是一個矩形區(qū)域,同樣可以通過頂點坐標(Top,Left)和寬高來描述它的尺寸。頂點坐標是相對于桌面坐標系原點的,也就是相對于主顯示器的頂點。
工作區(qū)的概念比較簡單,它是指顯示器中除了任務(wù)條和其他?吭谧烂嫔系拇绑w之外的矩形區(qū)域。
Windows為多顯示器應(yīng)用程序的開發(fā)提供了一組API。VCL將這些API封裝起來,非常自然的融入整個Framework之中,使得開發(fā)多顯示器應(yīng)用程序變得非常簡單。下面就介紹與之相關(guān)的內(nèi)容。
在VCL之中大家最熟悉的恐怕非TCustomForm莫屬了,它是所有窗體的基類。TCustomForm的Position屬性用來設(shè)置窗體的現(xiàn)實位置,其可選值中有兩個是值得關(guān)心的:一個是poScreenCenter,當Position屬性被設(shè)置成poScreenCenter時,窗體會顯示到主顯示器的中央;另一個是poDesktopCenter,當Position屬性被設(shè)置成poDesktopCenter時,窗體顯示在整個桌面的中央。如果把這個屬性設(shè)成poDesktopCenter,程序又運行在一個有多臺顯示器的系統(tǒng)上,那么這個窗口就會顯示在兩個顯示器之間,會給用戶帶來不必要的麻煩。因此即使我們的程序不是針對多顯示器而設(shè)計的,也應(yīng)該細心處理這個值。另外一個屬性是DefaultMonitor,它的作用與Position有些類似,決定窗口最初顯示在哪個顯示器內(nèi)。它有四個備選值:dmDesktop,dmPrimary,dmMainForm和dmActiveForm。他們的含義如下:
Value
Meaning
dmDesktop
不特別處理
dmPrimary
將窗體顯示到第一個顯示器上。這又是一個陷阱,字面上理解是主顯示器,而事實上它是指Screen.Monitor[0]這個顯示器。
dmMainForm
將窗體顯示到主窗體所在的顯示器
dmActiveForm
將窗體顯示到桌面上活動窗體所在的顯示器
TCustomForm還有一個只讀的共有屬性(沒有Published)Monitor,它提供了訪問窗體所在顯示器實例的引用,這個值與DefaultMonitor是有緊密的關(guān)聯(lián)的。
那么怎么在使窗體在不同的顯示器之間移動呢?這并不困難,估計你也想到了。這里介紹兩種方法:
第一, 可以設(shè)置TCustomForm的Top和Left使窗體顯示在桌面的任意位置。正如前面所述,桌面是由所有顯示器組成的。它們有共同的坐標系,所以可以根據(jù)顯示器的邏輯位置決定窗體的位置,F(xiàn)在的問題是如何獲得每個顯示器的邏輯位置和尺寸,后面就會介紹。
第二, 可以調(diào)用TCustomForm的MakeFullyVisible方法將窗體完全顯示到指定的顯示器之中?梢酝ㄟ^這個方法避免窗口在兩個顯示器上各顯示一部分。
剛才我們提出了一個問題:如何獲得每個顯示器的邏輯位置和尺寸。為了解答這個問題,需要再介紹連個類:TScreen和TMonitor。
TScreen描述與顯示設(shè)備有關(guān)的一些信息,我們主要關(guān)心與顯示器邏輯位置和尺寸有關(guān)的信息。其他方面的內(nèi)容可以在Delphi的文檔中獲知。在程序運行的時候VCL自動創(chuàng)建一個TScreen的實例——全局變量,所以通常情況下程序是不需要實例化TScreen的。
TScreen有一組形如Desktop*的屬性,這些屬性描述了整個桌面的尺寸和各頂點坐標。還有對開發(fā)多顯示器應(yīng)用程序有重要意義的連個屬性:MonitorCount和Monitors。通過這兩個屬性我們可以枚舉出系統(tǒng)中所有的顯示器(TMonitor)的實例,每個實例都反映了相應(yīng)顯示器的相對位置和分辨率等信息(后文會詳細說明)。
在TScreen的眾多屬性之中,我們會找到Height和Width這兩個屬性。要特別警惕它們不是指整個桌面的尺寸,而是指主顯示器的高度和寬度。這非常容易讓人產(chǎn)生錯覺,無以為是整個桌面的尺寸。與之類似的還有形如WorkArea*的一組屬性,它們描述了主顯示器的工作區(qū)域的尺寸和各頂點坐標。是不是覺得少了什么?為什么沒有獲取主顯示器相對位置的屬性?原因就像前面所說的:Windows是以主顯示器的左上角為坐標系原點的,所以主顯示器的相對位置必然是(0,0)。
除了這些屬性之外,還要介紹TScreen的三個成員函數(shù):MonitorFromPoint,MonitorFromRect和MonitorFromWindow。顧名思義,他們分別是獲取個坐標、某個區(qū)域和某個窗口所在的顯示器的實例。在實際的開發(fā)中可能也會用到。
最好,再來看看TMonitor類。它封裝了物理顯示器的有關(guān)屬性——這些屬性都是只讀的。下表簡單介紹了這些屬性的含義,它們對編寫多顯示器應(yīng)用程序非常有用:
屬性
說明
Handle
獲取該顯示器的Windows句柄
MonitorNum
獲取顯示器的編號
Primary
獲取該顯示器是否是主顯示器。又且僅有一個顯示器的Primary是True。
Top
獲取顯示器的上邊界
Left
獲取顯示器的左邊界
Height
獲取顯示器的高度
Width
獲取顯示器的寬度
BoundsRect
獲取顯示器的對應(yīng)桌面的區(qū)域,它與上面四個屬性是等價的
WorkareaRect
獲取顯示器的工作區(qū)對應(yīng)桌面的區(qū)域。
清楚地了解了TScreen和TMonitor之后,前面的問題也就自然解決了。到這里,本文已經(jīng)介紹了開發(fā)多顯示器應(yīng)用程序所需的全部知識。相信你可以利用這些知識開發(fā)出非常實用的軟件產(chǎn)品。
附:你可以下載一個DEMO,幫助理解本文。
http://my.6to23.com/yukin2010/download/MultiMonitorDemo.rar