前言 一般情況下,計算機用戶都是使用單一的顯示屏來觀察顯示的信息,目前比較流行的是17英寸的顯示器,可以滿足一般用戶的需求。但是在一些特殊的場合下,例如需要對現(xiàn)場進行大范圍的監(jiān)控、CAD繪圖、或應(yīng)用電子地圖技術(shù)等的情況下,需要全景顯示時,用戶就不得不要求計算機有足夠大的顯示桌面,以便對場景的細(xì)節(jié)看的更清楚、操作起來更方便。針對上述情況,即使是二十九寸的顯示器其有效的顯示尺寸也是十分有限的,這時候解決桌面大小問題就不得不采用多屏顯示技術(shù),Windows
操作系統(tǒng)支持這種技術(shù),這里的多屏顯示并不是指采用多屏分配器
驅(qū)動多個顯示器,從而使多個屏幕顯示相同的畫面,就如同VC界面編程中的動態(tài)拆分效果,而是指在一臺計算機上安裝多個顯卡帶多臺顯示器,實現(xiàn)成倍的擴展計算機桌面尺寸的目的。例如臺灣Dream公司推出的ViewPacket
軟件,可以一邊顯示視頻流,一邊編輯Word文檔,一邊上網(wǎng)瀏覽
網(wǎng)絡(luò)上的信息,極大的方便了用戶的使用。
一、多屏顯示的系統(tǒng)配置方法
為了安裝多顯示器,首先檢查機器硬件,當(dāng)前Windows操作系統(tǒng)只支持PCI適配器來實現(xiàn)多顯示器桌面,它要求顯卡必須使用以下芯片組中的一種:ATI Mach64、S3 764和764+、Cirrushgic5436、5446和7458、Imagine 128 Series1和2、S3 Virge或ET6000、M9711等。一般情況下,一個顯卡驅(qū)動一個顯示器,一臺機器最多可以驅(qū)動7臺顯示器,其中一臺為主顯示器,其余為副顯示器。主顯示器也是Windows啟動畫面出現(xiàn)的那個顯示器。
進入"控制面板"-"顯示",雙擊"顯示",彈出"顯示屬性"對話框,選中"設(shè)置",如果安裝了多個監(jiān)視器,這時候?qū)υ捒虻纳习氩糠诛@示系統(tǒng)中目前顯示器的數(shù)量??捎益I單擊一個監(jiān)視器圖標(biāo),再單擊"標(biāo)識"查看對應(yīng)于單擊其圖標(biāo)的監(jiān)視器的顯示編號。請將它們拖動到代表在監(jiān)視器間移動項目方式的位置。例如,如果您正使用兩個監(jiān)視器,并希望通過左右拖動來將項目從一個監(jiān)視器中移到另一個中,請將圖標(biāo)并排排列。要通過上下拖動來在監(jiān)視器間移動項目,請將圖標(biāo)上下排列。圖標(biāo)的位置并不一定與監(jiān)視器的物理位置相對應(yīng)。您可以將圖標(biāo)上下放置,即使監(jiān)視器是并排放置的。
二、多屏顯示的軟件實現(xiàn)
通過上面的設(shè)置,雖然使Windows支持多顯示器擴展桌面的功能,但也僅僅是實現(xiàn)了設(shè)備的連接與管理,一般Windows應(yīng)用程序的窗口不能自動運行到副顯示器上,用戶只能通過鼠標(biāo)拖動來將程序的窗口擴展到副顯示器上,如果需要將程序窗口自動擴展到不同的顯示器顯示,必須采用相應(yīng)的多屏顯示編程技術(shù)。在這種技術(shù)中,可以使用Windows的User32.DLL動態(tài)連接庫提供的API函數(shù)SetWindowPos()(如果采用VC這個開發(fā)平臺,CWnd類提供了一個同樣的成員函數(shù)),它的功能是更改窗口的大小、位置及窗口的順序,因此可以用來在多顯示器桌面上實現(xiàn)應(yīng)用程序窗體的定位顯示。下面對這個函數(shù)進行詳細(xì)的解釋:
BOOL SetWindowPos( HWND hWnd, // 窗口的句柄; HWND hWndInsertAfter, // 窗口次序句柄, int X, // 窗口左上角的水平位置; int Y, // 窗口左上角的垂直位置; int cx, // 窗口的寬度; int cy, // 窗口的高度; UINT uFlags file://標(biāo)志位; ); |
這里需要解釋的有hWndInsertAfter、uFlags兩個參數(shù)
hWndInsertAfter
在窗口的"Z"序中排在需要的設(shè)置的窗口之前的窗口句柄;這個參數(shù)取以下值:
Value |
Meaning |
HWND_BOTTOM |
將要操作的窗口放置在所有窗口之下; |
HWND_NOTOPMOST |
將要操作的窗口放置在"non-topmost"窗口之下; |
HWND_TOP |
將操作的窗口放置在所有的窗口之上; |
HWND_TOPMOST |
將要操作的窗口放置在"non-topmost"窗口之上; |
uFlags
規(guī)定窗口的尺寸和位置的標(biāo)志,這個參數(shù)通常取以下值:
Value |
Meaning |
SWP_DRAWFRAME |
窗口重畫時,繪制出窗口類中所描述的窗口的框架 |
SWP_HIDEWINDOW |
隱藏窗口; |
SWP_NOACTIVATE |
窗口無任何動作; |
SWP_NOMOVE |
保持窗口的當(dāng)前位置; |
SWP_NOREDRAW |
在新位置并不重畫窗口; |
SWP_NOSIZE |
改變窗口的位置,并不改變窗口的大小,既忽略cx,cy兩個參數(shù)的值; |
SWP_NOZORDER |
窗口重畫時,保留當(dāng)前的順序,既忽略hWndInsertAfter參數(shù)的值 |
SWP_SHOWWINDOW |
Displays the window. |
另,該參數(shù)還可以取其它的值,具體含義讀者可以參考MSDN。
為了說明問題,下面的VB代碼僅僅實現(xiàn)了在兩個顯示器分別顯示不同的窗口,用戶點擊按鈕后,主顯示器顯示窗口Form1,副顯示器顯示窗口Form2,感興趣的讀者可以稍加修改,就可以應(yīng)用到實際項目開發(fā)中去。
首先在VB全局模塊中聲明:
Public Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long |
其次在需要定位的兩個窗口模塊中調(diào)用該函數(shù)。具體的VB代碼是:
Private Sub Form1_Load( ) Const HWND_TOPMOST=-1 Const SWP_NOACTIVATE=&H10 SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, ScreenWidht/2, ScreenHeight, SWP_NOACTIVATE '在主顯示器的顯示區(qū)域上顯示窗口1;
End Sub Private Sub Form2_Load( ) Const HWND_TOPMOST=-1 Const SWP_NOACTIVATE=&H10 SetWindowPos Me.hWnd, HWND_TOPMOST, ScreenWidht/2, 0, ScreenWidht/2, ScreenHeight, SWP_NOACTIVATE '在副顯示器的顯示區(qū)域上顯示窗口2; End Sub
|
為了正確的顯示,需要將窗體的ScaleMode屬性設(shè)置為twips,這樣才可以與Windows系統(tǒng)中ScreenWidth和ScreenHeight的計量單位twips保持一致。