目前我使用Direct2D渲染2D帧,但我意识到Windows XP(或DirectX< 10的任何地方)都不支持它,现在我正在寻找一个支持DirectX 9的方法。
我的场景不是一个简单的问题,并且为了切入追逐我的问题是我没有可用于初始化direct3d的HWND,但是我确实有一个HDC。 这就是我用direct2d做的事情:
ID2D1DCRenderTarget *renderTarget = NULL;
HRESULT hr = FACTORY->CreateDCRenderTarget(&RENDER_TARGET_PROPERTIES, &renderTarget);
renderTarget->BindDC(this->hdc, &this->viewport);
renderTarget->BeginDraw();
...
我正在寻找能与DirectX 9配合使用并且允许使用HDC而不是HWND的同等功能。
我已经搜索了很多,并发现了有关此问题的其他问题,但我找不到令人满意的解决方案,我唯一能找到的是屏幕外渲染,但我无法做到找到任何有关这方面的例子或解释的好消息来源,我找到的包括使用HWND来启动d3d9。
关于如何在XP上管理2D帧(透明度)的任何想法? 感谢。
WindowFromDC
为HDC返回null我通过它。
这是我的代码:
HWND hwnd = WindowFromDC(hdc);
LPDIRECT3D9 d3d = Direct3DCreate9(D3D_SDK_VERSION);
LPDIRECT3DDEVICE9 d3ddev;
D3DPRESENT_PARAMETERS d3dpp;
LPD3DXSPRITE sprite;
LPDIRECT3DTEXTURE9 texture;
D3DXVECTOR3 imagepos(0, 0, 0);
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = False;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
if (SUCCEEDED(d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev))) {
....
}
hwnd
为空,因此对d3d->CreateDevice
的调用失败(我认为原因如此)。
对于HDC
,它存在,当我将它与direct2d一起使用时,它可以正常工作。
任何想法如何绕过这个问题?
感谢@RogerRowland,我发现我得到的HDC是一个内存HDC(OBJ_MEMDC
)。
我猜它是浏览器/ firebreath给我的东西,但是当我将它与Direct2D一起使用时(比如我第一次发布的代码)以及我尝试常规Win32渲染({{1和所有)。
我似乎找不到使用Direct3D 9的方法只使用我得到的HDC,因此我正在制定一个解决方法,创建一个新的隐藏窗口,我将在其中做渲染,然后将结果复制到我有的HDC(可能是BitBlting) 即使这个解决方案有效,我仍然不喜欢它,所以如果有人有另一种处理这个问题的方法,我很乐意知道。