关于ID3DXFont.DrawText和窗口最小化的问题

fangkmjo 2008-11-03 04:44:01
我用ID3DXFont.DrawText方法绘制文字,没有什么问题,但是如果把绘制窗口最小化后
再正常显示,程序就死了。这是为什么啊,怎么解决?很急啊
...全文
313 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wanglei5695312 2010-04-20
顶了,学习中
回复
DarknessTM 2008-11-04
那D3D8的 ID3DXFont 是如何恢复设备的?
回复
fangkmjo 2008-11-04
DarknessTM大侠, 我用的是D3D8啊,ID3DXFont接口没有OnLostDevice 和OnResetDevice方法
回复
DarknessTM 2008-11-04
我晕啊,你难道在每次reset的时候创建一次?
最先hook的应该是 IDirect3D8 的 CreateDevice 方法,在创建好设备后,就创建你的 ID3DXFont

然后hook Present
进行如下操作
IDirect3DDevice8::BeginScene
ID3DXFont::DrawText
IDirect3DDevice8::EndScene
IDirect3DDevice8::Present


此外hook Reset
进行如下操作

ID3DXFont::OnLostDevice
IDirect3DDevice8::Reset
ID3DXFont::OnResetDevice
回复
fangkmjo 2008-11-04
DarknessTM大侠,
我照你的方法还是不行啊,我HOOK Reset的代码如下:
STDMETHOD(Reset)(THIS_ D3DPRESENT_PARAMETERS* pPresentationParameters)
{
HRESULT hr = m_pDevice->Reset(pPresentationParameters);

LOGFONT lf;
ZeroMemory(&lf, sizeof(LOGFONT));
lf.lfHeight = 25;
lf.lfWidth = 12;
lf.lfWeight = 500;
lf.lfItalic = false;
lf.lfUnderline = false;
lf.lfStrikeOut = false;
lf.lfCharSet = DEFAULT_CHARSET;
strcpy(lf.lfFaceName, "Times New Roman");

HFONT hFont;
hFont = CreateFont(12,0,0,0,0,0,0,0,0,0,0,0,0,"Arial");
D3DXCreateFontIndirect( m_pDevice,&lf,&m_lpDXFont);

return hr;
}
回复
DarknessTM 2008-11-04
你就不能再hook下Reset啊,然后把你的资源reset
回复
fangkmjo 2008-11-04
Silenker大哥,我是HOOK别的DirectX程序的Direct3DCreate8函数的,所有的调用都还是转发给DirectX API了
我只是在屏幕上显示文字,代码如下:
....
LOGFONT lf;
ZeroMemory(&lf, sizeof(LOGFONT));
lf.lfHeight = 25;
lf.lfWidth = 12;
lf.lfWeight = 500;
lf.lfItalic = false;
lf.lfUnderline = false;
lf.lfStrikeOut = false;
lf.lfCharSet = DEFAULT_CHARSET;
strcpy(lf.lfFaceName, "Times New Roman");

HFONT hFont;
hFont = CreateFont(12,0,0,0,0,0,0,0,0,0,0,0,0,"Arial");
D3DXCreateFontIndirect( m_pDevice,&lf,&m_lpDXFont);
...
STDMETHOD(EndScene)(THIS)
{
HRESULT hr = m_pDevice->EndScene();

RECT rect = {10,10,200,200};
char szText[MAX_PATH] = "掌门人科技";
if( m_pDevice->TestCooperativeLevel() == D3D_OK )
{
m_lpDXFont->DrawText( szText ,- 1,&rect,DT_CENTER,D3DCOLOR_XRG(255,0,255));
}

return hr;
}

您帮我看看啊,我不知道怎么搞
回复
在窗体最小化以后,D3D会丢失设备,需要进行重置。重置的时候需要释放所有非Managered的资源,然后调用device的Reset方法。
详细的可以上网搜索一下“D3D 设备重置”。
回复
发动态
发帖子
图形处理/算法
创建于2007-09-28

1.9w+

社区成员

VC/MFC 图形处理/算法
申请成为版主
社区公告
暂无公告