創建directdraw設備失敗怎麼辦

創建directdraw設備失敗怎麼辦

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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信