如何从directx3d 中获取Dc?

Posted

技术标签:

【中文标题】如何从directx3d 中获取Dc?【英文标题】:how to get Dc from directx3d? 【发布时间】:2014-08-22 02:38:23 【问题描述】:

我需要从 directx3d 获取设备上下文 (DC)。这里有一些代码快照。 1.创建设备:

    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 纹理:

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

3.显示图像:

 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) 这样的窗口获取 dc,但在我的情况下,如果没有窗口(即无窗口),那么我如何从 directx 获取 DC。请给一些代码从directx设备获取DC。

【问题讨论】:

您向CreateDevice 提供了HWND,为什么不使用它? 在上面的示例中,我向 createDevice 提供了 hwnd。但现在我需要在无窗口部分中绘制图像。所以我只问如何从 directx 获取 Dc。 @user3336737 你认为如何“在无窗口部分绘制图像”?那是什么部分?你到底想达到什么目标? 提供NULL 作为Present() 的窗口句柄只是意味着它将使用来自D3DPRESENT_PARAMETERSHWND。您可能必须解释您要达到的目标。 嗨@Drop:我正在开发一个用于绘图的NPAPI无窗口插件。所以我不需要创建一个窗口。所以我在 createDevice 中提供了 NULL。我的问题是“我们可以从 directx 设备获取 Dc 吗?” .如果有可能获得 Dc,那么我将使用 DC 从 NPP_HandleEvent 中绘制图像。 【参考方案1】:

使用null 作为参数调用GetDC

HDC hdc = ::GetDC(0);

引用自 MSDN:

参数 hWnd [输入] 要检索其 DC 的窗口的句柄。 如果此值为 NULL,GetDC 将检索整个屏幕的 DC。

编辑:

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

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

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

【讨论】:

您好,感谢您的回复。在我的情况下,我不需要整个屏幕的直流电。如果您知道如何从 directx 获取直流电,请帮助我。 IDirect3DSurface9* 渲染目标; IDirect3DSurface9* sysmem_offscreen_surf; direct3D9Device->CreateRenderTarget(backDcWidth, backDcHeight, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, 0, TRUE, &render_target, NULL); direct3D9Device->CreateOffscreenPlainSurface(backDcWidth, backDcHeight, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &sysmem_offscreen_surf, NULL); //从视频内存复制数据到系统内存:direct3D9Device->GetRenderTargetData(render_target, sysmem_offscreen_surf); sysmem_offscreen_surf->GetDC(&hdc); 我只得到黑屏...我检查了 Dc 是否为 NULL...获取 Dc 不是 NULL...然后我如何只得到黑屏而不是图像

以上是关于如何从directx3d 中获取Dc?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Direct2D 从窗口中获取像素

如何从 Google Maps Directions Api 获取折线

如何从 VideoMediaFrame.Direct3DSurface 获取像素数据?

如何从打字稿中的数组中获取键[重复]

如何使用 jQuery 从 Google Directions api 获取 JSON?

如何从组的 LDAP 搜索中获取用户给定名称属性的列表?