2023年7月29日发(作者:)
創建directdraw設備失敗怎麼辦
協作層(Cooperative Levels)
關於協作層
協作層描述了 DirectDraw 如何與顯示相互作用及一些影響顯示的因素. 使用IDirectDraw4::SetCooperativeLevel宏來設置DirectDraw的協作層. 在多數情況下, 你使用
DirectDraw 協作層來決定你的程式運行於專有排它的全屏模式或運行於視窗. 不管怎樣,
DirectDraw協作層還有以下功能:
允許DirectDraw 使用 Mode X 解析度. 詳見 Mode X 及 Mode 13 顯示模式. 進行排它性顯示及防止使用者用CTRL+ALT+DEL重新啟動(僅在排它模式) 允許DirectDraw回應最大及最小化事件.
普通協作層指出你的程式將運行於視窗模式. 在這種協作層你無法改變主平面調色板或進行頁交換. 因為程式可以使用多視窗, IDirectDraw4::SetCooperativeLevel無須指定視窗控制碼如果程式使用DDSCL_NORMAL模式. 通過傳遞一個NULL視窗控制碼, 所有的視窗都可被設置為普通視窗模式.
在全屏排它協作層, 你可以完全使用硬體的一切. 在這個模式, 你可以設置使用定義及動態調色板, 改變顯示解析度及進行頁交換. 在排它模式(全屏模式)並不保護其他已分配的平面,
也不會阻止其他程式使用DirectDraw及GDI. 不管如何, 它可以保護不使其他運行程式訪問及改變調色板及解析度. DirectDraw會控制全屏下的視窗事件, 排它模式程式, 發送
WM_ACTIVATEAPP 消息到通過SetCooperativeLevel註冊的視窗控制碼. DirectDraw 僅僅發送消息到頂層視窗. 如果你的程式創建的子視窗也需要接受事件資訊, 你就需要進行相對的設置.
SetCooperativeLevel保持一個進程與一個視窗控制碼之間的聯繫. 如果一個進程調用SetCooperativeLevel, 就會在視窗與進程之間建立聯繫. 如果同一進程再次使用一個非
NULL的視窗控制碼調用SetCooperativeLevel, 就會返回一個DDERR_HWNDALREADYSET的錯誤值. 有時程式會在使用DirectSound指定一個不一樣的控制碼而 DirectDraw 同時也指定同一個頂層視窗控制碼時收到這個錯誤值.
注意:
使用Microsoft Foundation Classes(MFC) 的開發者應注意傳遞給SetCooperativeLevel的視窗控制碼應與頂層窗口一致, 並非派生的子窗口. 獲得MFC程式的頂層視窗控制碼, 你要使用以下代碼:
HWND hwndTop = AfxGetMainWnd()->GetSafeHwnd();
參考多顯示器系統
測詴協作層
開發者通常使用 WM_ACTIVATEAPP 和 WM_DISPLAYCHANGE 來通知程式來恢復或重新創建一個已使用的平面. 有時, 程式會收到一些不需要的消息, 或需要時無法獲取消息.
IDirectDraw4::TestCooperativeLevel巨集能使你的程式收到更多的 DirectDraw物件或適當越過一些錯誤.
TestCooperativeLevel巨集調用成功後, 如果你的程式能夠恢復這個平面 (如果它還未完成)及繼續執行, 返回DD_OK. 在另一方面, 錯誤碼, 隨不同的協作層而不同:
全屏程式:
程式會收到 DDERR_NOEXCLUSIVEMODE 返回值如果它們失去專有設備訪問 (也可稱之為焦點) 例如: 使用者按ALT+TAB切換離開當前程式. 這樣的話, 程式可以在迴圈中調用TestCooperativeLevel, 僅在收到DD_OK後退出迴圈(意味著專有模式恢復了). 在迴圈中,
程式可以放棄對 CPU的控制來釋放無用的執行週期. 可以使用 Windows 支援的函數如WaitMessage或Sleep的WIN32函數來完成該功能.
任何已創建的平面可以用 IDirectDrawSurface4::Restore 或 IDirectDraw4::RestoreAllSurface巨集來恢復, 或在顯示前再裝入內容.
視窗程式:
視窗程式(就是使用普通協作層)會受到 DDERR_EXCLUSIVEMODEALREADYSET 錯誤返回值如果另一個程式獲得專有設備訪問權. 這樣的話, 程式不會收到任何消息直到獲得專有設備訪問權的程式失去它. 這種情形和全屏程式相似: 一個視窗程式可以迴圈直到TestCooperativeLevel在恢復平面或再裝入內容之前返回DD_OK. 就象前面一樣, 程式可以在迴圈中放棄對CPU的控制來減少不必要的CPU執行週期. TestCooperativeLevel巨集會在改變顯示模式後在視窗程式中返回DDERR_WRONGMODE值. 這樣的話, 程式應該在繼續運行前銷毀並重新創建平面.
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690642008a383999.html
评论列表(0条)