当前位置:编程学习 > VB >>

关于vb的d3d截图


/*先运行InitDX(),之后直接调用GetBmpFromRectDX(RECT)函数截取相应的区域即可*/

//注意:
//相对比较费时间的函数是mv_pd3dDevice->GetFrontBufferData(0, mv_pSu易做图ce);
//大概用掉50ms左右,所以不要每次截获屏幕都运行一次

////////DX
BOOL CBmpManager::InitDX()
{
    ///初始化变量
    mv_pD3D=NULL;
    mv_pd3dDevice=NULL;
    mv_pSu易做图ce=NULL;
    mv_screenRect.left=0;
    mv_screenRect.right=0;
    mv_screenRect.top=0;
    mv_screenRect.bottom=0;
    mv_bCapturing=false;
    mv_pBits=NULL;
    mv_hBackDC=NULL;
    mv_hBackBitmap=NULL;
    mv_hOldBitmap=NULL;

    if(FAILED(InitD3D(NULL))){
        AfxMessageBox(_T("Failed to InitD3D!"));
        return FALSE;
    }
    return TRUE;
}

HRESULT CBmpManager::InitD3D(HWND hWnd)
{
    D3DDISPLAYMODE    ddm;
    D3DPRESENT_PARAMETERS    d3易做图;

    if((mv_pD3D=Direct3DCreate9(D3D_SDK_VERSION))==NULL)
    {
        AfxMessageBox(_T("Unable to Create Direct3D "));
        return E_FAIL;
    }

    if(FAILED(mv_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&ddm)))
    {
        AfxMessageBox(_T("Unable to Get Adapter Display Mode"));
        return E_FAIL;
    }
    ZeroMemory(&d3易做图,sizeof(D3DPRESENT_PARAMETERS));

    d3易做图.Windowed=WINDOW_MODE;
    d3易做图.Flags=D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
    d3易做图.BackBufferFormat=ddm.Format;
    d3易做图.BackBufferHeight=mv_nDisplayHeight=mv_screenRect.bottom =ddm.Height;
    d3易做图.BackBufferWidth=mv_nDisplayWidth=mv_screenRect.right =ddm.Width;
    d3易做图.MultiSampleType=D3DMULTISAMPLE_NONE;
    d3易做图.SwapEffect=D3DSWAPEFFECT_DISCARD;
    d3易做图.hDeviceWindow=hWnd;
    d3易做图.PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
    d3易做图.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;

    if(FAILED(mv_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING ,&d3易做图,&mv_pd3dDevice)))
    {
        AfxMessageBox(_T("Unable to Create Device"));
        return E_FAIL;
    }

    if(FAILED(mv_pd3dDevice->CreateOffscreenPlainSu易做图ce(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &mv_pSu易做图ce, NULL)))
    {
        AfxMessageBox(_T("Unable to Create Su易做图ce"));
        return E_FAIL;
    }


    mv_pd3dDevice->GetFrontBufferData(0, mv_pSu易做图ce);

    return S_OK;
}


LPD3DXBUFFER CBmpManager::GetBmpFromRectDX(CRect cRect)
{
    LPD3DXBUFFER lpD3DBuf;

    RECT rect;
    rect.left=cRect.left;
    rect.top=cRect.top;
    rect.bottom=cRect.bottom;
    rect.right=cRect.right;

    CString szFileName;
        static int i=0;
    szFileName.Format(_T("hooksBmp/ScreenShot%d.jpg"),i++);
    D3DXSaveSu易做图ceToFile(szFileName,D3DXIFF_JPG,mv_pSu易做图ce,NULL,&rect);
    //Save to File


    return lpD3DBuf;
}

这里是一个vc的d3d截图代码,我大概也能翻译成vb,但是。。。。请问比如那些关键的函数比如D3DXSaveSu易做图ceToFile这些貌似vb里并不是自带的,肯定要调用其他库,我查找到好像是调用D3dx9.lib
但是在我的印象中vb好像只能调用dll,怎么才能调用d3dx9.lib,而且这个文件到底在神马地方?我想请教一下,谢谢 --------------------编程问答-------------------- 也就是说D3DXSaveSu易做图ceToFile这个函数我想再vb里使用该怎么办
--------------------编程问答-------------------- 你这个是不归路啊孩子。用vb搞dx后回头的人飘过...

我来说一下吧。vb6对dx的支持,官方是支持到dx8.网友有封装出lib库的,有dx9的,但bug貌似不少。

以dx8来说,你去下载dx8sdk安装后就直接可以用vb6开发了。并且带很多vb6的例子,学习起来挺方便的。

你的问题,在vb和dx8 中是

Sub SaveSu易做图ceToFile(DestFile As String, DestFormat As CONST_D3DXIMAGE_FILEFORMAT, SrcSu易做图ce As Direct3DSu易做图ce8, SrcPalette As PALETTEENTRY, SrcRect As RECT)
    DxVBLibA.D3DX8 的成员

你上边的代码我看了,用dx8完成是没有问题的。用vb6开发dx9及之后的版本,因为没有官方的支持,难度是很大的。 --------------------编程问答-------------------- vb果然是后妈生的啊
补充:VB ,  API
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,