如何从direct3d获取Dc?

时间:2014-07-01 13:47:13

标签: directx device-context

我需要从directx3d获取设备上下文(DC)。这里有一些代码抢购 1.CREATE DEVICE:

    int windowWidth = 640;
        int  windowHeight = 480;
        IDirect3D9* direct3D9 = Direct3DCreate9(D3D_SDK_VERSION);
    if(direct3D9 == NULL)
    {
        return FALSE;
    }
    D3DDISPLAYMODE *d3ddisplayMode =(D3DDISPLAYMODE *)calloc(1,sizeof(D3DDISPLAYMODE));
    hr = direct3D9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,d3ddisplayMode);
    if(hr != D3D_OK)
    {
                 free(d3ddisplayMode);
         direct3D9->Release();
         return FALSE;
    }
     D3DPRESENT_PARAMETERS *d3dpresentParam                                             =(D3DPRESENT_PARAMETERS*)calloc(1,sizeof(D3DPRESENT_PARAMETERS));
 d3dpresentParam->Windowed = TRUE;
 d3dpresentParam->hDeviceWindow = NULL;
 d3dpresentParam->SwapEffect = D3DSWAPEFFECT_DISCARD;
 d3dpresentParam->BackBufferFormat = d3ddisplayMode->Format;
 d3dpresentParam->BackBufferWidth = windowWidth;
 d3dpresentParam->BackBufferHeight = windowHeight;
 d3dpresentParam->BackBufferCount = 1;
 free(d3ddisplayMode);
 hr = direct3D9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,NULL,D3DCREATE_SOFTWARE_VERTEXPROCESSING,d3dpresentParam,&direct3D9Device);

2.CRETAE TEXTURE:

hr = D3DXCreateTexture(direct3D9Device,bmpWidth,bmpHeight,1,0,D3DFMT_X8R8G8B8,D3DPOOL_MANAGED,&pTexture);

3.DISPLAY IMAGE:

 float left = 0,top =0,width =640,height=480;
 direct3D9Device->BeginScene();
    D3DXMATRIX mat;
D3DXVECTOR3 pos;

pos.x = (bmpWidth * left) / width;
pos.y = (bmpHeight * top) / height;
pos.z = 0;
d3dxSprite->Begin(D3DXSPRITE_ALPHABLEND);
D3DXVECTOR2 scaling((width/bmpWidth),(height/bmpHeight));
if(pTexture == direct3DTextureRemote )
{
    D3DXVECTOR2 spriteCentre((width/2),(height/2));

    D3DXMatrixTransformation2D(&mat,NULL,0.0,&scaling,&spriteCentre,NULL,NULL);
}
else
{
    D3DXMatrixTransformation2D(&mat,NULL,0.0,&scaling,NULL,NULL,NULL);
}
d3dxSprite->SetTransform(&mat);
d3dxSprite->Draw(pTexture,NULL,NULL,&pos,0xFFFFFFFF);
d3dxSprite->End();
direct3D9Device->EndScene();
direct3D9Device->Present( NULL, NULL, NULL, NULL );

现在正在探索。我可以像HDC hdc = :: GetDC(hwnd)那样从窗口获得直流,但在我的情况下,如果没有窗口(即无窗口)那么我怎么能从directx获得DC。请从directx设备获取一些代码来获取DC。

1 个答案:

答案 0 :(得分:0)

null作为参数调用GetDC

HDC hdc = ::GetDC(0);

来自MSDN:

    Parameters

    hWnd [in]

    A handle to the window whose DC is to be retrieved. 
    If this value is NULL, GetDC retrieves the DC for the entire screen.

修改

我们现在知道您正在使用NPAPI,这是一个可能的解决方案:

使用NPNVnetscapeWindow参数调用NPAPI函数NPN_GetValue()。返回HWND是插件绘图表面的句柄。在创建DirectX设备时使用它并检索HDC

或者,您可以尝试通过IDirect3DDevice9::GetRenderTarget()方法检索后台缓冲区(IDirect3DSurface9),然后通过IDirect3DSurface9::GetDC()方法检索其HDC