首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Win32:如何确定是否启用了DirectDraw?

Win32:如何确定是否启用了DirectDraw?
EN

Stack Overflow用户
提问于 2010-05-28 17:00:27
回答 3查看 3.5K关注 0票数 5

GDIPlus中使用GDIPlus时,如果Windows视频“硬件加速”降低得太低,就会出现图形损坏--比如禁用DirectDraw

硬件加速有六个层次:

  • 禁用所有加速
  • 禁用除基本加速以外的所有其他加速。(默认情况下为服务器计算机)
  • 禁用所有DirectDraw和Direct3D加速,以及所有游标和高级加速
  • 禁用所有游标和高级绘图加速
  • 禁用光标和位图加速
  • 启用所有加速(在桌面机器上默认)

如果禁用DirectDraw,那么在GDI+中使用DrawCachedBitmap将导致图形损坏。如果没有启用DrawImage(),我可以很容易地使用较慢的DirectDraw API --但我必须能够检测到是否禁用了DirectDraw。

如何以编程方式检查是否启用了DirectDraw

问题是: dxdiag是如何做到这一点的:

另请参阅

KB191660 - DirectDraw或Direct3D选项不可用 (https://archive.fo/wuHKI)

EN

回答 3

Stack Overflow用户

发布于 2010-11-15 03:51:48

如果您下载最新的DirectX SDK (我肯定旧的sdk有类似的示例),就有一个查询DXDIAG信息的例子。

该示例位于(SDK )\Samples\C++\Misc\DxDiagReport

在dxdiaginfo.cpp中注意的方法

代码语言:javascript
复制
CDxDiagInfo::CDxDiagInfo
CDxDiagInfo::Init
CDxDiagInfo::QueryDxDiagViaDll    
CDxDiagInfo::GetDisplayInfo

如果您运行该程序,它将产生一个巨大的值列表。我认为你感兴趣的价值是pDisplayInfo->m_szDDStatusEnglish

票数 4
EN

Stack Overflow用户

发布于 2010-11-13 02:24:30

您可以检查注册表中的加速滑块值。

代码语言:javascript
复制
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{'some hex string'}\0000\Acceleration.Level

您可能需要遍历Video中的所有文件夹,因为通常有多个条目。

Acceleration.Level值

  • 5禁用所有加速
  • 4禁用除基本加速之外的所有加速。(服务器机器上默认)
  • 3禁用所有DirectDraw和Direct3D加速,以及所有光标和高级加速。
  • 2禁用所有游标和高级绘图加速
  • 1禁用游标和位图加速
  • 启用所有加速(在桌面计算机上默认)

更新:

下面是一个关于以编程方式更改/检查加速级别的旧线程。http://www.autoitscript.com/forum/topic/61185-hardware-acceleration/

票数 0
EN

Stack Overflow用户

发布于 2010-11-15 09:10:30

您可以查询一个IDirectDraw接口并查看它的功能。如果关闭硬件加速,我假设它会失败,但是您可能需要测试GetCaps()或TestCooperativeLevel()。

代码语言:javascript
复制
LPDIRECTDRAW lpdd7 = NULL; // DirectDraw 7.0

// first initialize COM, this will load the COM libraries
// if they aren't already loaded
if (FAILED(CoInitialize(NULL)))
   {
   // error
   } // end if

// Create the DirectDraw object by using the
// CoCreateInstance() function
if (FAILED(CoCreateInstance(&CLSID_DirectDraw,
                         NULL, CLSCTX_ALL,
                         &IID_IDirectDraw7,
                         &lpdd7)))
   {
   // error
   }


// now before using the DirectDraw object, it must
// be initialized using the initialize method

if (FAILED(IDirectDraw7_Initialize(lpdd7, NULL)))
{
    // error
}

lpdd7->Release();
lpdd7 = NULL; // set to NULL for safety

// now that we're done with COM, uninitialize it
CoUninitialize();

不幸的是,DirectDraw文档不再包含在SDK中。您可能需要一个较早的版本来获取示例和头文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2930974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档