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

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

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

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

大家帮帮忙吧
...全文
1832 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)
打开链接下载源码: https://pan.quark.cn/s/589796089f72 C++课程设计任务列表,涵盖以下内容:1、识别并显示10至99范围内,各位数乘积超过各位数和的数值,例如数字12不满足条件,因为1乘以2小于1加2,故不输出;而数字27满足条件,因为2乘以7大于2加7,因此需要输出该数。2、开发一个功能,用于从用户输入的任意数量实数找出最大值与最小值:首先要求用户输入一个正整数n,代表数值的个数,随后用户可输入任意n个实数,程序需找出这n个数的最大值和最小值并将它们展示出来。3、实现两个已排序数组的合并操作:设有数组A和B,且假设这两个数组的元素均已按照降序排列。编写程序将A和B合并成一个新的数组C,并确保C的元素同样保持降序排列。int A[10]={123, 86,80, 49,33,15,7,0,-1,-3};int B[10]={100,64,51,50,27,19,15,12,5,2};4、设计一个函数,用于计算特定分数序列前n项的总和,该序列为1/2,1/3,1/4,1/5,1/6,1/7,...。要求在主程序提示用户输入一个整数n,并验证输入的合法性(n需大于1方为有效),若输入合法,则调用求和函数并显示计算结果。5、编写一个程序,计算两个用户输入日期之间的天数差:用户需以year1,month1,day1和year2,month2,day2的格式输入两个日期,程序随后计算这两个日期之间的天数间隔,并将结果输出到屏幕上。要求编制具有如下原型的函数difs2Date:long GetDayDifference(int y1,int m1,int d1,int y2,int m2,int d2);并在主函数调用此函数,将计...
代码下载地址: https://pan.quark.cn/s/ee8627e4e6d7 ABAP调试器是一种功能强大的工具,可用于在执行期间对ABAP代码进行检验。除了常规的核心功能(例如逐行运行代码以及检验变量、字段符号和引用的值)之外,它还提供了一些辅助性的特性,能够简化并压缩调试会话的时长。并非所有使用者都熟悉这些辅助特性。SAP ABAP调试器是处理和优化ABAP代码开发与维护工作的核心资源,它配备了多样的功能来协助开发人员在运行状态下进行检验和排除故障。此资源着重阐述了ABAP调试器的一些高级特性,涵盖了深入分析调用堆栈、系统级调试、更新会话调试以及提升调试效率的方法。 1. **深入分析调用堆栈**:除了常规的应用程序调试,开发人员有时需要对调用堆栈的内部层级进行深入调试,特别是在错误出现在异步执行的更新处理或系统级程序时。通过启用**系统级调试**,可以访问通常不公开的系统代码,但这也会导致调用堆栈的显著增加,因此需要审慎操作。 2. **系统级调试**:对于不含业务逻辑的系统级程序,开发人员通常无需进行调试。然而,在特定情形下,例如进行错误追踪时,可能需要进入系统代码。借助调试器的“系统调试启用/禁用”选项,可以赋予对系统程序的调试权限。 3. **更新会话调试**:在处理异步更新任务,例如持久化业务数据时,错误可能发生在更新任务内部。激活**更新会话调试**,在更新任务完成后,调试器将自动启动,展示执行路径。比如,在变更成本心后,通过输入调试指令 "/h" 启动调试,保存后能够看到更新过程的错误。 4. **分析调用堆栈**:在进行深入调试时,调用堆栈是至关重要的。通过分析调用堆栈,能够定位到引发问题的具体位置,如在VB_V2_NORMAL...
源码链接: https://pan.quark.cn/s/a4b39357ea24 小程序雷达 AI 驱动的小程序生态选型与风险评估工具,把微信小程序开发资源转化为可筛选、可评估、可对比的技术雷达。 线上地址 主站: Vercel: 适合谁 正在做微信小程序技术选型的产品、研发和架构团队。 需要判断 Taro、uni-app、原生小程序、组件库、云开发和 SDK 风险的团队。 需要把历史 awesome 列表转成可筛选、可对比、可验证技术雷达的维护者。 可以做什么 Radar:按推荐状态、风险等级、资源类型、分类和适用场景浏览小程序生态资源。 Quick Search:快速搜索资源并跳转常用页面。 Compare:对比 Taro、uni-app、原生小程序等核心方案。 Advisor:输入选型问题,获得推荐结论、适用/不适用条件、迁移成本、下一步和证据来源。 Doctor:粘贴小程序项目配置,识别框架依赖、过时方案和迁移风险。 Weekly:查看小程序生态周报和近期风险信号。 数据概览 当前数据集包含 236 个小程序生态资源。 完整资源可在 Radar 页面和导出能力查看。 核心样例 Taro ★30.6k+ - 使用 React 的方式开发小程序的框架,同时支持生成多端应用 uni-app ★36.1k+ - 使用 Vue 语法开发小程序、H5、App的统一框架 MPX ★2.1k+ - 增强型小程序框架,深度性能优化,支持跨小程序平台开发,完全兼容原生小程序组件 WePY ★21.7k+ - 支持组件化的小程序开发框架 vant-weapp ★12.3k+ - 高颜值、好用、易扩展的微信小程序 UI 库 tdesign-miniprogram ★1.3...

19,464

社区成员

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

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