首先,一般情况...通过DLL加载的第三方库确实会呈现为HWND。这是简单的2D渲染,并不直接使用D3D的方式,我可以看到 - 在DLL上的依赖关系走动显示了很多D3DKMT函数,如D3DKMTCreateDevice
,但不是像IDirect3D9::CreateDevice
那样的常规D3D调用。 当我打电话给IDirect3D9::CreateDevice
时,第三方渲染变得棘手。它不会抱怨,只是将所有东西都渲染成黑色的矩形。我自己的渲染效果很好。初始化D3D9会导致第三方库停止工作
细节...第三方DLL是Mozilla XULRunner 1.9.x,它是wxWidgets wxWebConnect库中包装的FireFox的核心(不具有硬件加速功能的2.0)。 wxWC加载XUL DLL并提供一个Web浏览器GUI组件。
我使用WX & wxWebConnect这里工作程序,编译EXE和代码: http://www.kirix.com/forums/viewtopic.php?f=25&t=911#p2605
这里是我的现实生活中的代码,它稍微势必wxWidgets的,但还不足以使其难以阅读 - 我从一个随机的窗口得到HWND只是初始化D3D,但从来没有渲染它:
void MyFrame::OnD3DButton(wxCommandEvent &event)
{
static bool initialized = false;
static LPDIRECT3D9 mpD3D = NULL;
static LPDIRECT3DDEVICE9 mpD3DDevice=NULL;
if(!initialized)
{
wxButton *button=wxDynamicCast(event.GetEventObject(), wxButton);
HWND mHWnd = (HWND)button->GetHandle();
mpD3D = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS md3dpp;
ZeroMemory(&md3dpp, sizeof(D3DPRESENT_PARAMETERS));
md3dpp.Windowed = true;
md3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
// triple buffer if VSync is on
md3dpp.BackBufferCount = 1;
md3dpp.EnableAutoDepthStencil = 0;
md3dpp.hDeviceWindow = mHWnd;
md3dpp.BackBufferWidth = 0;
md3dpp.BackBufferHeight = 0;
md3dpp.FullScreen_RefreshRateInHz = 0;
md3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
md3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
md3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
md3dpp.MultiSampleQuality = 0;
HRESULT hr = mpD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,mHWnd,
D3DCREATE_MULTITHREADED|D3DCREATE_MIXED_VERTEXPROCESSING,&md3dpp,&mpD3DDevice);
if(FAILED(hr))
wxMessageBox(wxString("mpD3D->CreateDevice() FAILED"));
else
{
wxMessageBox(wxString("mpD3D->CreateDevice() SUCCEEDED"));
initialized = true;
}
}
}
不,一个单独的。另外,我没有做任何渲染。我所称的是“Direct3DCreate9”和“CreateDevice”,就是这样。 – 2011-02-14 11:52:15
你如何创建设备?你可以发布参数吗?你有调试吗?也许有什么在日志中,表明创建设备上的问题 – cppanda 2011-02-14 12:39:52