我用ID3DXFont.DrawText方法绘制文字,没有什么问题,但是如果把绘制窗口最小化后
再正常显示,程序就死了。这是为什么啊,怎么解决?很急啊

解决方案 »

  1.   

    在窗体最小化以后,D3D会丢失设备,需要进行重置。重置的时候需要释放所有非Managered的资源,然后调用device的Reset方法。
    详细的可以上网搜索一下“D3D 设备重置”。
      

  2.   

    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;
    }您帮我看看啊,我不知道怎么搞
      

  3.   

    你就不能再hook下Reset啊,然后把你的资源reset
      

  4.   

    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;
    }
      

  5.   

    我晕啊,你难道在每次reset的时候创建一次?
    最先hook的应该是 IDirect3D8 的 CreateDevice 方法,在创建好设备后,就创建你的 ID3DXFont然后hook Present
    进行如下操作
    IDirect3DDevice8::BeginScene
    ID3DXFont::DrawText
    IDirect3DDevice8::EndScene
    IDirect3DDevice8::Present
    此外hook Reset
    进行如下操作ID3DXFont::OnLostDevice
    IDirect3DDevice8::Reset
    ID3DXFont::OnResetDevice
      

  6.   

    DarknessTM大侠, 我用的是D3D8啊,ID3DXFont接口没有OnLostDevice 和OnResetDevice方法
      

  7.   

    那D3D8的 ID3DXFont 是如何恢复设备的?