博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

公告板

Posted on 2011-06-01 15:46  +石头+  阅读(2218)  评论(0)    收藏  举报

公告板类中主要有Create和Render函数。

Create中主要是得到纹理的变量mFace。普通的可由D3DXCreateTextureFromFile加载。但是有复杂的情况时,既有文字又有图片时,我们用类CRenderedTexture来完成加载mFace。

HRESULT CRenderedTexture::Create( LPDIRECT3DDEVICE9 DVC,int iW,int iH )

{

    

    if (!DVC)

    {

        return S_FALSE;

    }

    mDVC=DVC;

 

    mDVC->CreateTexture(iW,iH,1,

                    D3DUSAGE_RENDERTARGET,

                    D3DFMT_A8R8G8B8,

                    D3DPOOL_DEFAULT,&mFace,NULL);

    if (!mFace)

    {

        return S_FALSE;

    }

}

 

HRESULT CRenderedTexture::BeginRender()

{

    mDVC->GetRenderTarget(0,&mOldSurface);

    if (!mOldSurface)

    {

        return S_FALSE;

    }

    LPDIRECT3DSURFACE9 Surface;

    if (!mFace)

    {

        return S_FALSE;

    }

    mFace->GetSurfaceLevel(0,&Surface);

 

    mDVC->SetRenderTarget(0,Surface);

    Surface->Release();

 

    mDVC->GetTransform(D3DTS_WORLD,&mOldWorld);

    mDVC->GetTransform(D3DTS_VIEW,&mOldView);

    mDVC->GetTransform(D3DTS_PROJECTION,&mOldProj);

 

    mDVC->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0x0,1.0f,0.0f);

    mDVC->BeginScene();

    return S_OK;

}

 

HRESULT CRenderedTexture::EndRender()

{

    mDVC->EndScene();

    mDVC->SetRenderTarget(0,mOldSurface);

 

    mDVC->SetTransform(D3DTS_WORLD,&mOldWorld);

    mDVC->SetTransform(D3DTS_VIEW,&mOldView);

    mDVC->SetTransform(D3DTS_PROJECTION,&mOldProj);

 

 

    return S_OK;

}

 

void CRenderedTexture::Render( LPRENDERFUNC pRender,float fPass )

{

    if (pRender)

    {

        BeginRender();

        (*pRender)(fPass);

        EndRender();

    }

}

此类的工作原理是,首先记录原来的IDirect3DSurface9以及世界,视野,投影矩阵。用手动创建的Texture设置新的IDirect3DSurface9,在此新的上面渲染,完成后还原之前的渲染参数。由于Render中的渲染内容不能确定,所以用了函数指针,在调用时确定具体的渲染。

Render函数调用CXText的DrawPic函数绘制为公告板。CXText为公告板的重点,下篇文章再仔细说明。