?? multimon.htm
字號:
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">* }</font><font FACE="宋體" SIZE="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">*/</font><font FACE="宋體" SIZE="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">}</font><font FACE="宋體" SIZE="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">// 最后,必須調用FreeLibrary函數釋放動態連接庫。</font><font
FACE="宋體" SIZE="3"></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">FreeLibrary(h);</font><font FACE="Arial" size="5"></p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">上面的例程代碼可以在運行期或裝載期為連接到</font><font
FACE="Arial" SIZE="3">Ddraw.dll</font><font FACE="宋體" SIZE="3">的應用程序所用。</p>
<p ALIGN="JUSTIFY">應該注意的是,你必須獲得</font><font FACE="Arial" SIZE="3">DirectDrawEnumerateEx
</font><font FACE="宋體" SIZE="3">函數的</font><font FACE="Arial" SIZE="3">ANSI</font><font
FACE="宋體" SIZE="3">或</font><font FACE="Arial" SIZE="3">Unicode</font><font
FACE="宋體" SIZE="3">版本中的哪一個,依賴于你的應用程序的字符串類型。當聲明相應的回調函數時,為字符串參數使用</font><font
FACE="Arial" SIZE="3">LPTSTR</font><font FACE="宋體" SIZE="3">數據類型。如果你聲明了</font><font
FACE="Arial" SIZE="3">_UNICODE</font><font FACE="宋體" SIZE="3">符號,</font><font
FACE="Arial" SIZE="3">LPTSTR</font><font FACE="宋體" SIZE="3">數據類型在編譯時使用</font><font
FACE="Arial" SIZE="3">Unicode</font><font FACE="宋體" SIZE="3">字符串,否則使用</font><font
FACE="Arial" SIZE="3">ANSI</font><font FACE="宋體" SIZE="3">字符串。通過使用</font><font
FACE="Arial" SIZE="3">LPTSTR</font><font FACE="宋體" SIZE="3">數據類型,該函數能夠正常工作,而不論你的應用程序使用的是什么樣的字符串。</p>
</font><hr>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><b><p><a name="焦點窗口與設備窗口">焦點窗口與設備窗口</a></p>
</b></font><font SIZE="3"><p align="right"><a href="#目錄"><font face="宋體">返回目錄</font></a></p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">在單獨顯示器系統中,當你為一個應用程序設置了全屏獨占的控制級時(通過調用<font
FACE="Arial" SIZE="3">IDirectDraw2::SetCooperativeLevel</font>函數),你必須指定你的應用程序窗口句柄。<font
FACE="Arial" SIZE="3">DirectDraw</font>使用應用程序的窗口句柄來勾住系統的消息,用來獲得應用程序的狀態信息、傳遞鍵盤輸入的消息、和調整窗口大小的消息等。<font
FACE="Arial" SIZE="3">DirectDraw</font>不需要為普通控制級(窗口模式)的應用程序設置一個窗口句柄。</p>
<p ALIGN="JUSTIFY">因為多顯示器系統必不可少的會用到至少一個顯示設備,因此,要用<font
FACE="Arial" SIZE="3">DirectDraw</font>訪問到每一個設備,<font SIZE="3"> </font>你必須為每一個顯示設備創建一個<font
FACE="Arial" SIZE="3">DirectDraw</font>對象。然而,你所創建的每一個<font
FACE="Arial" SIZE="3">DirectDraw</font>對象需要知道哪一個應用程序的窗口是它可以控制的,以及哪一個是可以接收到擊鍵消息的。換句話說,應用程序需要有一個方法來告訴<font
FACE="Arial" SIZE="3">DirectDraw</font>哪一個窗口將被用于哪些操作。這個特性是通過焦點窗口(<font
FACE="Arial" SIZE="3">Focus window</font>)和設備窗口(<font FACE="Arial" SIZE="3">Device
window</font>)的概念提供的。<font FACE="Arial" SIZE="3">IDirectDraw2::SetCooperativeLevel</font>函數支持三個標志符使這個特性連接到一個<font
FACE="Arial" SIZE="3">DirectDraw</font>對象:<font FACE="Arial" SIZE="3">DDSCL_SETFOCUSWINDOW</font>、<font
FACE="Arial" SIZE="3">DDSCL_SETDEVICEWINDOW</font>、和<font FACE="Arial" SIZE="3">DDSCL_CREATEDEVICEWINDOW</font>。</p>
<p ALIGN="JUSTIFY">一個“設備窗口”只是一個簡單的可見窗口,<font
FACE="Arial" SIZE="3">DirectDraw</font>可以調整其大小以占據顯示器的整個顯示區域。你可以手工創建與安裝與顯示設備一樣多的設備窗口,或者你可以讓<font
FACE="Arial" SIZE="3">DirectDraw</font>來為你處理這些細節(當你讓<font
FACE="Arial" SIZE="3">DirectDraw</font>來管理這些設備窗口的創建時,會存在一些協定,這些協定將在“缺省設備窗口”一節中討論)。</p>
<p ALIGN="JUSTIFY">一個焦點窗口指的是<font FACE="Arial" SIZE="3">DirectDraw</font>對象可以對其發送擊鍵消息的窗口。一個<font
FACE="Arial" SIZE="3">DirectDraw</font>應用程序只能擁有一個焦點窗口。</p>
<p ALIGN="JUSTIFY">要得到更多的資料,請參閱“設置焦點和設備窗口”和“缺省設備窗口”。</p>
</font><hr>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><b><p><a name="設置焦點窗口和設備窗口">設置焦點窗口和設備窗口</a></p>
</b></font><font SIZE="3"><p align="right"><a href="#目錄"><font face="宋體">返回目錄</font></a></p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">調用<font FACE="Arial" SIZE="3">IDirectDraw2::SetCooperativeLevel</font>函數,并且指定<font
FACE="Arial" SIZE="3">DDSCL_SETDEVICEWINDOW</font>或<font FACE="Arial" SIZE="3">DDSCL_SETFOCUSWINDOW</font>標志,你可以設置一個<font
FACE="Arial" SIZE="3">DirectDraw</font>對象的焦點窗口和設備窗口。(<font
FACE="Arial" SIZE="3">SetCooperativeLevel</font>函數同樣接受<font FACE="Arial"
SIZE="3">DDSCL_CREATEDEVICEWINDOW</font>標志,要得到更多的資料,請參閱“缺省設備窗口”。)</p>
<p ALIGN="JUSTIFY">注意:只有當你想要獲得對多顯示器的全屏獨占的訪問時,才能設置焦點和設備窗口。如果你只想對主顯示設備和顯示器獲得獨占訪問,你可以調用<font
FACE="Arial" SIZE="3">SetCooperativeLevel</font>函數,在<font FACE="Arial" SIZE="3">dwFlags</font>參數中僅僅指定<font
FACE="Arial" SIZE="3">DDSCL_FULLSCREEN</font>和<font FACE="Arial" SIZE="3">DDSCL_EXCLUSIVE</font>標志。</p>
<p ALIGN="JUSTIFY">設置焦點和設備窗口是一個兩步的過程:在為一個顯示設備創建了<font
FACE="Arial" SIZE="3">DirectDraw</font>對象之后,你必須首先為它設置焦點窗口。焦點窗口對你的應用程序中所有<font
FACE="Arial" SIZE="3">DirectDraw</font>對象來說都是同一個,并且通過調用<font
FACE="Arial" SIZE="3">SetCooperativeLevel</font>函數來設置。在調用中,第一個參數是獲取擊鍵消息的窗口的句柄,第二個參數是<font
FACE="Arial" SIZE="3">DDSCL_SETFOCUSWINDOW</font>標志。</p>
<p ALIGN="JUSTIFY">在設置了<font FACE="Arial" SIZE="3">DirectDraw</font>對象的焦點窗口后,你應該設置設備窗口和控制級(在這種情況下,為全屏獨占模式)。這一步是通過另一次調用<font
FACE="Arial" SIZE="3">SetCooperativeLevel</font>函數完成的。在這一次的調用中,第一個參數是<font
FACE="Arial" SIZE="3">DirectDraw</font>將調整其大小為全屏的窗口的句柄,第二個參數是<font
FACE="Arial" SIZE="3">DDSCL_SETDEVICEWINDOW</font>、<font FACE="Arial" SIZE="3">DDSCL_FULLSCREEN</font>、和<font
FACE="Arial" SIZE="3">DDSCL_EXCLUSIVE</font>標志的結合。</p>
<p ALIGN="JUSTIFY">盡管你必須指定一個焦點窗口,你仍然可以讓<font
FACE="Arial" SIZE="3">DirectDraw</font>來操縱你的設備窗口的創建和管理工作。要得到更多的資料,請參閱“缺省設備窗口”。</p>
</font><hr>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><b><p><a name="缺省設備窗口">缺省設備窗口</a></p>
</b></font><font SIZE="3"><p align="right"><a href="#目錄"><font face="宋體">返回目錄</font></a></p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">你可以選擇讓<font FACE="Arial"
SIZE="3">DirectDraw</font>來為你完成創建、管理、和銷毀設備窗口的工作。簡單的說,<font
FACE="Arial" SIZE="3">DirectDraw</font>管理的窗口被稱為是“缺省設備窗口”。盡管使用缺省設備窗口可以把你從創建、管理、銷毀設備窗口的繁重任務中解放出來,但是你的應用程序將不能夠獲得操作系統發送到那些缺省設備窗口的鼠標消息。因此,只有在你的應用程序不需要從那些設備窗口接收鼠標消息的情況下,你才應該選擇使用缺省設備窗口。</p>
<p ALIGN="JUSTIFY">啟用缺省設備窗口的過程是很簡單的。在首先調用<font
FACE="Arial" SIZE="3">IDirectDraw2::SetCooperativeLevel</font>函數設置了一個<font
FACE="Arial" SIZE="3">DirectDraw</font>對象的焦點窗口之后,再次調用該函數,將<font
FACE="Arial" SIZE="3">dwFlags</font>參數指定為<font FACE="Arial" SIZE="3">DDSCL_CREATEDEVICEWINDOW</font>、<font
FACE="Arial" SIZE="3">DDSCL_FULLSCREEN</font>和<font FACE="Arial" SIZE="3">DDSCL_EXCLUSIVE</font>標志符的結合。</p>
<p ALIGN="JUSTIFY">注意:在一個單步調用<font FACE="Arial" SIZE="3">SetCooperativeLevel</font>函數的過程中,設置一個<font
FACE="Arial" SIZE="3">DirectDraw</font>對象的焦點窗口、告訴<font FACE="Arial"
SIZE="3">DirectDraw</font>創建一個缺省設備窗口、并且設置<font FACE="Arial"
SIZE="3">DirectDraw</font>的控制級也是可能的。下面的例程演示了這是怎樣完成的:</p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><font FACE="宋體" SIZE="1"><p
style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"></font><font
FACE="宋體" color="#FFFFFF" size="3">/*</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" color="#FFFFFF" size="3">*
該代碼片段只在使用缺省設備窗口時才可用.</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" color="#FFFFFF" size="3">*/</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" color="#FFFFFF" size="3">HRESULT hr;</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" color="#FFFFFF" size="3">hr = g_lpDD->SetCooperativeLevel(</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" color="#FFFFFF" size="3">// 該窗口句柄僅僅是焦點窗口的</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" color="#FFFFFF" size="3">hwndFocus,</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" color="#FFFFFF" size="3">DDSCL_SETFOCUSWINDOW | DDSCL_FULLSCREEN |</font></p>
<p style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2"><font
FACE="宋體" color="#FFFFFF" size="3">DDSCL_EXCLUSIVE | DDSCL_CREATEDEVICEWINDOW);</font></p>
</font>
</blockquote>
<hr>
<blockquote>
<p><a name="多顯示器系統中的顯示設備與加速特性"><font face="宋體"><b>多顯示器系統中的顯示設備與加速特性</b></font></a></p>
<font SIZE="3"><p align="right"><a href="#目錄"><font face="宋體">返回目錄</font></a></p>
</font>
</blockquote>
<blockquote>
<font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">一個</font><font FACE="Arial" SIZE="3">DirectDraw</font><font
FACE="宋體" SIZE="3">應用程序應該列舉出所有顯示設備,并且從中選擇一個顯示設備(或讓用戶來選擇),然后通過使用它的硬件全局唯一標志符(</font><font
FACE="Arial" SIZE="3">GUID</font><font FACE="宋體" SIZE="3">)為該顯示設備創建一個</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">對象。這種技術可以使無論是在多顯示器系統還是單顯示器系統中,以及在任何一種控制級上都能獲得最好的顯示效果。</p>
<p ALIGN="JUSTIFY">當前所激活的顯示設備也被稱為“缺省設備(</font><font
FACE="Arial" SIZE="3">Default device</font><font FACE="宋體" SIZE="3">)”,或“空設備(</font><font
FACE="Arial" SIZE="3">Null device</font><font FACE="宋體" SIZE="3">)。后一個名稱的得來是因為當前所激活的顯示設備是將</font><font
FACE="Arial" SIZE="3">NULL</font><font FACE="宋體" SIZE="3">作為它的</font><font
FACE="Arial" SIZE="3">GUID</font><font FACE="宋體" SIZE="3">而列舉出來的。許多現有的應用程序為缺省設備創建一個</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">對象,并且假定該設備是硬件加速的。然而,在多顯示器系統上,缺省設備并不一定是硬件加速的,這取決于當時對</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">所設置的控制級。</p>
<p ALIGN="JUSTIFY">在全屏獨占模式中,缺省設備是硬件加速的,但是已安裝的其它顯示設備則不是。這意味著,具有全屏獨占模式的應用程序在多顯示器系統中可以和任何其它系統一樣運行得非常快速,但是不能利用系統內置的跨顯示器的圖形操作。需要使用到多顯示設備(顯示器)的全屏獨占模式的應用程序,可以為每一個他想要使用的顯示設備(顯示器)創建一個</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">對象。應注意的是:為一個特定的設備創建一個</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">對象,你必須提供該設備的</font><font
FACE="Arial" SIZE="3">GUID</font><font FACE="宋體" SIZE="3">(在調用</font><font
FACE="Arial" SIZE="3">DirectDrawEnumerate</font><font FACE="宋體" SIZE="3">函數時可以被列舉出來)。</p>
<p ALIGN="JUSTIFY">當你把控制級設置為普通(窗口模式)時,缺省設備則不具有硬件加速性;此時的缺省設備成為了一個有效的、將兩個物理顯示設備的資源聯合起來的邏輯仿真顯示設備,因此,當設置了控制級為普通時,缺省設備是根本沒有被硬件加速的。從另一個方面來說,當設置了控制級為普通時,缺省設備自動具有了跨越各顯示器(顯示設備)的圖形操作的能力。典型的實例是,當第二顯示器的邏輯地址位于主顯示器的左邊時,對主顯示器進行帶負坐標的</font><font
FACE="Arial" SIZE="3">Blit</font><font FACE="宋體" SIZE="3">操作是有效的。</p>
<p ALIGN="JUSTIFY">如果了你給應用程序設置控制級為普通模式,卻仍需要利用硬件的加速特性,你必須只創建一個單獨的</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">對象,使用一個特定顯示設備的</font><font
FACE="Arial" SIZE="3">GUID</font><font FACE="宋體" SIZE="3">。應注意的是:如果你不使用缺省設備,你不會獲得自動跨越設備的能力。這就是說,對主頁面的</font><font
FACE="Arial" SIZE="3">Blit</font><font FACE="宋體" SIZE="3">操作超出了顯示器邊界的部分將會被裁減掉(如果你使用了裁減器),或操作失敗,返回</font><font
FACE="Arial" SIZE="3">DDERR_INVALIDRECT</font><font FACE="宋體" SIZE="3">的錯誤。</p>
<p ALIGN="JUSTIFY">作為所有系統上的慣例,在創建了</font><font FACE="Arial"
SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">對象后,獲得其能力或查詢其它接口之前,你應該立即設置其控制級。除此之外,還應該避免在多顯示器系統中多次設置控制級。如果你的應用程序需要從全屏模式切換到窗口模式運行,最好的做法是新建一個</font><font
FACE="Arial" SIZE="3">DirectDraw</font><font FACE="宋體" SIZE="3">對象。</p>
</font>
</blockquote>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -