自己研究了半年了,如何在一个全屏的DirectX游戏窗口/界面中绘制一个图形或文字?

r_swordsman 2009-04-27 10:30:23
自己研究了半年了,如何在一个全屏的DirectX游戏窗口/界面中绘制一个图形或文字?

窗口模式的DirectX游戏窗口/界面,用GDI重复绘制就可以了.
问题是全屏模式的DirectX游戏窗口/界面下就不行。

有些绘制了,会闪烁。大部分游戏还是绘制不了。

大家帮帮忙吧
...全文
1834 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
andrewfungxx 2011-12-16
  • 打赏
  • 举报
回复
用Overlay可以实现。研究研究VMR9.
my100838420 2011-12-13
  • 打赏
  • 举报
回复
有没有VB 用的代码DLL
cdbanty 2009-05-13
  • 打赏
  • 举报
回复
看来游戏人才是很多的嘛
IONPhantom 2009-05-13
  • 打赏
  • 举报
回复
别老顶了好不,方法已经都告诉你了
r_swordsman 2009-05-13
  • 打赏
  • 举报
回复
dayong576 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 P_hantom 的回复:]
除非你去调试别人的程序,否则没有别的方法,问题可以转移到加密解密论坛去问问了
[/Quote]
.
r_swordsman 2009-05-12
  • 打赏
  • 举报
回复
r_swordsman 2009-05-12
  • 打赏
  • 举报
回复
r_swordsman 2009-05-11
  • 打赏
  • 举报
回复
r_swordsman 2009-05-09
  • 打赏
  • 举报
回复
r_swordsman 2009-05-08
  • 打赏
  • 举报
回复
r_swordsman 2009-05-08
  • 打赏
  • 举报
回复
leechrockgames 2009-05-07
  • 打赏
  • 举报
回复




HRESULT ENd3d::LHxxINIT_D3DCOM(LPDIRECT3DDEVICE9 &m_pd3dDevice,int D3DFMT,
CRITICAL_SECTION &cs,int w,int h,bool Fullscreen)
{
// Create the D3D object.
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
// Get the current desktop display mode, so we can set up a back
// buffer of the same format
D3DDISPLAYMODE d3ddm;
//得到计算机显示卡当前的显示模式信息;P16
if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
return E_FAIL;

//全屏模式的参数设置(后缓存的图形格式设置)(测试主显示设备)
bool m_bFullScreen=Fullscreen;
const D3DFORMAT fmtFullscreenArray[] =
{
D3DFMT_A8R8G8B8,
D3DFMT_X8R8G8B8,
D3DFMT_X1R5G5B5,
D3DFMT_A1R5G5B5,
D3DFMT_R5G6B5,
};
const INT numFullscreenFmts = sizeof(fmtFullscreenArray) / sizeof(fmtFullscreenArray[0]);
INT iFmt;

// Find a pixel format that will be good for fullscreen back buffers
for( iFmt = 0; iFmt < numFullscreenFmts; iFmt++ )
{
//这个方法可以快速的检测出device是否支持你将要使用的格式
if( SUCCEEDED( g_pD3D->CheckDeviceType( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
fmtFullscreenArray[iFmt], fmtFullscreenArray[iFmt], FALSE ) ) )
{
m_d3dfmtFullscreen = fmtFullscreenArray[iFmt];
break;
}
}

//创建纹理设置参数
const D3DFORMAT fmtTextureArray[] =
{
D3DFMT_A8R8G8B8,
D3DFMT_A4R4G4B4,
D3DFMT_A1R5G5B5,
};
const INT numTextureFmts = sizeof(fmtTextureArray) / sizeof(fmtTextureArray[0]);

// Find a format that is supported as a texture map for the current mode
for( iFmt = 0; iFmt < numTextureFmts; iFmt++ )
{
//查询当前设备是否支持DXT纹理压缩;P141
if( SUCCEEDED( g_pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
d3ddm.Format, 0, D3DRTYPE_TEXTURE, fmtTextureArray[iFmt] ) ) )
{
m_d3dfmtTexture = fmtTextureArray[iFmt];
break;
}
}


// Set up presentation parameters for the display
D3DPRESENT_PARAMETERS m_d3dpp; //创建显示设置对象
ZeroMemory( &m_d3dpp, sizeof(m_d3dpp) );
m_d3dpp.Windowed = !m_bFullScreen;//false=!0即为1(不是全屏);
m_d3dpp.BackBufferCount = 1;//后备缓冲的数量
//指定系统如何将后台缓冲区的内容COPY TO前台显示
m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_d3dpp.EnableAutoDepthStencil = TRUE;//创建深度缓冲区P157
if(D3DFMT==0){m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;}//深度缓冲区中的每一个像素为16位整数存放
else if(D3DFMT==1){m_d3dpp.AutoDepthStencilFormat = D3DFMT_D24X8;}//创建32位深度/模版缓冲 24位深度缓冲,其余8位什么都不干
else if(D3DFMT==2){m_d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;}//将深度缓冲区一部分作为模板缓冲区使用(default)

m_d3dpp.MultiSampleType=D3DMULTISAMPLE_NONE;//多重采样()8.6

//后台缓冲到前台缓冲区的交换频率
m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
if( Fullscreen )//全屏方式(当为0时不执行,负数和正数执行)
{
//获取显示器的像素
// m_d3dpp.BackBufferWidth =d3ddm.Width;// 0X400;
// m_d3dpp.BackBufferHeight =d3ddm.Height;// 0X300;
m_d3dpp.hDeviceWindow = hWnd;
m_d3dpp.BackBufferWidth = w;//屏幕大小
m_d3dpp.BackBufferHeight = h;
//使后缓存的图形格式设置
m_d3dpp.BackBufferFormat = m_d3dfmtFullscreen;
//图形在全屏时的刷新率
m_d3dpp.FullScreen_RefreshRateInHz=d3ddm.RefreshRate;
//D3DFMT_D32 D3DFMT_D15S1 D3DFMT_D24S8 D3DFMT_D24X8 D3DFMT_D24X4S4 D3DFMT_D24FS8
//D3DFMT_UNKNOWN D3DFMT_A8R8G8B8 X8R8G8B8 R5G6B5 A1R5G5B5 X1R5G5B5 A4R4G4B4 d3ddm.Format
//D3DCREATE_HARDWARE_VERTEXPROCESSING
}
else//窗口方式
{
m_d3dpp.hDeviceWindow = hWnd;
m_d3dpp.BackBufferWidth = w;
m_d3dpp.BackBufferHeight = h;
//使后缓存的图形格式与前图形显示卡的显示像素格式相等
m_d3dpp.BackBufferFormat = d3ddm.Format;
}

// Create the device
g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &m_d3dpp, &m_pd3dDevice );

//存放渲染目标缓冲区(后缓冲区)
// Store render target surface desc
LPDIRECT3DSURFACE9 pBackBuffer = NULL;
m_pd3dDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
pBackBuffer->GetDesc( &m_d3dsdBackBuffer );
pBackBuffer->Release();


return S_OK;
}








void ENd3d::LHxxCREATE_FONT(LPD3DXFONT &m_pFont_china,int fsize,char *name)
{
HDC hDC = GetDC( NULL );
ReleaseDC( NULL, hDC );
D3DXCreateFont( m_pd3dDevice, // D3D device
fsize, // Height
0, // Width
0, // Weight 0 FW_BOLD
0, // MipLevels, 0 = autogen mipmaps
FALSE, // Italic
DEFAULT_CHARSET, // CharSet
OUT_DEFAULT_PRECIS, // OutputPrecision
DEFAULT_QUALITY, // Quality
DEFAULT_PITCH | FF_SWISS, // PitchAndFamily FF_SWISS FF_DONTCARE
TEXT(name), // pFaceName TEXT("Arial")黑体
&m_pFont_china); // ppFont
// Restore the fonts
m_pFont_china->OnResetDevice();
}


void ENd3d::LHxxFREE_FONT(LPD3DXFONT &m_pFont_china)
{
if(m_pFont_china)
{SAFE_DELETE( m_pFont_china );}
}



//GDI
void ENd3d::LHxxSHOW_GDITEXT(char *text,int x,int y,COLORREF color,HFONT &font)
{
//isalnum(window_char_message);
HDC hdc;
// get the dc
hdc = GetDC(hWnd);
// set the color
SetBkMode(hdc,OPAQUE);
SelectObject( hdc, font );//选择字体

SetTextColor(hdc,color);
SetBkColor(hdc,RGB(0,0,0));
// print the message
TextOut(hdc,x,y,text,strlen(text));
// release the dc
ReleaseDC(hWnd,hdc);

}



void ENd3d::LHxxSHOW_CHINATEXT(char *buf,int x,int y,LPD3DXFONT &m_pFont_china,float r,float g,float b)
{
RECT rc;SetRect( &rc, x, y, 0, 0 );
m_pFont_china->DrawText( NULL,buf, -1, &rc, DT_NOCLIP, D3DXCOLOR( r, g, b, 1.0f ));
}




全屏有固定格式,GDI显示字体,还行,不过一般少用.

csbinchina 2009-05-07
  • 打赏
  • 举报
回复
mark
r_swordsman 2009-05-07
  • 打赏
  • 举报
回复
g_pHookApiManage->AddHookApi((FARPROC)dwHookAddr,(FARPROC)MyPresent);
这个是什么用的?自己实现的?
r_swordsman 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 amei2000go 的回复:]
我要 HOOK 的函数是:Present
得到 Present 的地址:
DWORD dwHookAddr=*(DWORD*)(*(DWORD*)g_pd3dDevice+0x3c);
开始挂钩:
g_pHookApiManage->AddHookApi((FARPROC)dwHookAddr,(FARPROC)MyPresent);

注意:上面的前提是你必须注入到游戏进程中,否则就没用了
[/Quote]

DWORD dwHookAddr=*(DWORD*)(*(DWORD*)g_pd3dDevice+0x3c);
这个是得到你自己创建的g_pd3dDevice的Present吧?HOOK自己的Present有什么用?
怎么HOOK别人的,问题是怎么得到别人的d3dDevice?
superdiablo 2009-05-07
  • 打赏
  • 举报
回复
看来很多人研究这个啊
r_swordsman 2009-05-07
  • 打赏
  • 举报
回复
IONPhantom 2009-05-07
  • 打赏
  • 举报
回复
除非你去调试别人的程序,否则没有别的方法,问题可以转移到加密解密论坛去问问了
r_swordsman 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 leechrockgames 的回复:]
C/C++ code



HRESULT ENd3d::LHxxINIT_D3DCOM(LPDIRECT3DDEVICE9 &m_pd3dDevice,int D3DFMT,
CRITICAL_SECTION &cs,int w,int h,bool Fullscreen)
{
// Create the D3D object.
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
// Get the current desktop display mode, so we can set up a back
// buffer of the same format

[/Quote]

看明白了我的题目吗?我是要在别人的游戏中显示,
现在的问题是,怎么获取别人创建的那个D3D设备 DIRECT3DDEVICE9?
加载更多回复(21)

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧