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

來源:互聯網
上載者:User

在Delphi中開發使用多顯示器的應用程式 收藏
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
 擷取顯示器的工作區對應案頭的地區。
 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/siow/archive/2006/02/22/606419.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.