在没有HWND的情况下初始化Direct3D

时间:2013-12-30 13:51:12

标签: winapi direct3d firebreath hwnd hdc

目前我使用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) 即使这个解决方案有效,我仍然不喜欢它,所以如果有人有另一种处理这个问题的方法,我很乐意知道。

0 个答案:

没有答案