19,468
社区成员
发帖
与我相关
我的任务
分享
//函数前面的GET_IMAGE_DirectX::一定要写,否则会有编译错误
HRESULT GET_IMAGE_DirectX::Get_Image_DirectX_InitD3D(HWND hwnd)
{
/****************** 进行DirectX初始化定义 ****************************/
//定义函数参数
HWND hWnd = hwnd;
//定义
D3DDISPLAYMODE ddm;
D3DPRESENT_PARAMETERS d3dpp;
//定义 这三个变量之前在.h文件中定义的时候下面总是说未定义标识符。。。
//是为什么呢???????????????
CRect gScreenRect;
gScreenRect = CRect(0, 0, 0, 0);
int nDisplayWidth = 0;
int nDisplayHeight = 0;
//声明 灵活的运用声明使程序看起来更有条理
extern IDirect3D9* g_pD3D;
extern IDirect3DDevice9* g_pd3dDevice;
extern IDirect3DSurface9* g_pSurface;
if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
{
MessageBox(NULL, "Unable to Create Direct3D ", "提示", MB_OK);
return E_FAIL;
}
if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &ddm)))
{
MessageBox(NULL, "Unable to Get Adapter Display Mode", "提示", MB_OK);
return E_FAIL;
}
SecureZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));
d3dpp.Windowed =TRUE;// WINDOW_MODE之前用的。。卡死了 全屏模式对应FALSE,试了几次FALSE,是将hWnd对应的窗口全屏化,但是如果游戏本身已经全屏化了那就卡死了。。不知道为什么
d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; //
d3dpp.BackBufferFormat = ddm.Format;//换成D3DFMT_UNKNOWN 后还是一样。。。
//....无论我设置ddm.Height是多少都没用。。。为什么呢????
d3dpp.BackBufferHeight = nDisplayHeight = gScreenRect.bottom = ddm.Height;//
d3dpp.BackBufferWidth = nDisplayWidth = gScreenRect.right =ddm.Width;//
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;//
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//
d3dpp.hDeviceWindow = hWnd; //这个地方应该是对的
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;//D3DPRESENT_INTERVAL_IMMEDIATE D3DPRESENT_INTERVAL_DEFAULT
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;// D3DPRESENT_RATE_DEFAULT 试了下ddm.RefreshRate,不行说无法CreateDevice
if (FAILED(g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd, //hWnd 。NULL。原来是hWnd换成了NULL,还是可以得。。为什么呢???
D3DCREATE_SOFTWARE_VERTEXPROCESSING , //试过D3DCREATE_MIXED_VERTEXPROCESSING 。。。效果一样
&d3dpp,
&g_pd3dDevice)))
{
MessageBox(NULL, "Unable to Create Device ", "提示", MB_OK);
return E_FAIL;
}
//g_pd3dDevice->CreateImageSurface(ScreenWidth, ScreenHeight,D3DFMT_A8R8G8B8, &pSurface); //与下面的CreateOffscreenPlainSurface类似的
if (FAILED(g_pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &g_pSurface, NULL)))
{
MessageBox(NULL, "Unable to Create Surface", "提示", MB_OK);
return E_FAIL;
}
return S_OK;
}
//抓取游戏图片
void GET_IMAGE_DirectX::Get_Image_DirectX_Save(HWND hwnd,char FileName[512])
{
//判断InitD3D是否成功已经交给调用Get_Image_DirectX_InitD3D的地方来处理了,不在这
//定义函数参数
char szFileName[512] = {0};
strcpy_s(szFileName, FileName);
//声明 灵活的运用声明使程序看起来更有条理
extern IDirect3D9* g_pD3D;
extern IDirect3DDevice9* g_pd3dDevice;
extern IDirect3DSurface9* g_pSurface;
//SetCursor(LoadCursor(NULL, IDC_WAIT)); //将鼠标设置为等待
g_pd3dDevice->GetFrontBufferData(0, g_pSurface);
//看来这个句柄是管用的。。。
HWND hWnd = hwnd;
RECT rtCapture;
::GetWindowRect(hWnd, &rtCapture);
D3DXSaveSurfaceToFile((LPCSTR)szFileName, D3DXIFF_BMP, g_pSurface, NULL, &rtCapture); //Save to File
//如果&rtCapture改为NULL就是全屏抓图,使用&rtCapture就限定了抓的窗口
//g_pSurface->Release(); //完成之后释放指针
g_pd3dDevice->Release();
g_pD3D->Release();
//此主要是释放Direct3D资源,因为不管Direct3D对象还是Direct3D设备对象都是COM对象,所以,在此必须调用Release方法,使COM对象的引用计数-1。并且,必须先释放Direct3D设备对象,再释放Direct3D对象(因为Direct3D设备对象是通过Direct3D对象创建的)。
}