问题描述
所以我想在另一个窗口上绘制一个叠加层,但是我没有得到真正的运行时错误,Visual Studio 调试工具告诉我
的结果HRESULT res = object->CreateDeviceEx(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWND,D3DCREATE_HARDWARE_VERTEXPROCESSING,¶ms,NULL,&device);
是 0x8876086c。所以这里是我的代码片段,它们很重要并且会导致这个错误(D3DERR_INVALIDCALL),这会导致设备成为空指针,这意味着我不能用它做任何事情。
我无法真正弄清楚是什么导致了这种情况,因为我几乎遵循了文档
int Paint::init(HWND hWND) {
if (Failed(Direct3DCreate9Ex(D3D_SDK_VERSION,&object))) {
exit(1);
}
ZeroMemory(¶ms,sizeof(params));
params.BackBufferWidth = width;
params.BackBufferHeight = height;
params.Windowed = true;
params.hDeviceWindow = hWND;
params.MultiSampleQuality = D3DMULTISAMPLE_NONE;
params.BackBufferFormat = D3DFMT_A8R8G8B8;
params.EnableAutoDepthStencil = TRUE;
params.AutoDepthStencilFormat = D3DFMT_D16;
HRESULT res = object->CreateDeviceEx(D3DADAPTER_DEFAULT,&device);
在头文件中:
class Paint {
private:
IDirect3D9Ex* object = NULL;
IDirect3DDevice9Ex* device = NULL;
DWORD behaviorFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;
D3DPRESENT_ParaMETERS params;
ID3DXFont* font = 0;
HWND TargetHWND;
int width,height;
int init(HWND(hWND));
}
解决方法
D3DPRESENT_PARAMETERS params = {};
// Use Win32 BOOL "TRUE" instead of C++ "true"
params.Windowed = TRUE;
params.hDeviceWindow = m_window;
// params.BackBufferWidth,BackBufferHeight are ignored for Windowed = TRUE
// For Windowed = TRUE,use params.BackBufferFormat = D3DFMT_UNKNOWN,which is zero.
// For params.BackBufferCount zero is assumed to be 1,but best practice
// would be to set it
params.BackBufferCount = 1;
// You used D3DMULTISAMPLE_NONE for the MultiSampleQuality instead of MultiSampleType.
// It's all zero anyhow.
params.EnableAutoDepthStencil = TRUE;
params.AutoDepthStencilFormat = D3DFMT_D16;
// --->>> This is the actual bug: there is no valid SwapEffect that has a value of zero <<<---
params.SwapEffect = D3DSWAPEFFECT_DISCARD;
您假设 Direct3D9 设备支持 D3DCREATE_HARDWARE_VERTEXPROCESSING
,但您尚未验证它实际上支持它。也就是说,D3DCREATE_SOFTWARE_VERTEXPROCESSING
在 Windows 10 上存在已知的性能问题,因此您无论如何应该只需要硬件。
您不应将旧版 Direct3D9 或 Direct3D9Ex 用于新项目。它主要在较新版本的 Windows 上进行模拟,具有许多奇怪的行为,并且此时已经有近 20 年的历史了。不支持 Windows 8.x 或 Windows 10 上的 Direct3D 9 调试设备。对于 DirectX 的新开发人员,您应该将 Direct3D 11 视为一个更好的起点。