• DirectX 文本绘制


    在Direct中进行文本绘制,可以通过Win32程序框架实现,也可以通过DXUT进行绘制。

    基于第一篇的Win32框架入门实现非常简单,只需要添加数行代码即可。主要说需要修改的地方。

    #pragma  comment(lib,"dxerr.lib")
    #pragma  comment(lib,"dxguid.lib")
    #pragma  comment(lib,"d3dx9d.lib")
    #pragma  comment(lib,"d3d9.lib")
    #pragma  comment(lib,"winmm.lib")
    //#pragma  comment(lib,"comct132.lib")
    #include <Windows.h>
    #include <d3d9.h>
    #include <d3dx9core.h>

    //////////////////////////////////////////////////////////////////////////
    //D3D基础对象;
    LPDIRECT3D9 g_pD3D = NULL;
    //D3D设备对象;
    LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
    //字体对象;
    LPD3DXFONT g_pD3dFont=0;
    WCHAR* strText = L"DirectX9 字体显示";
    //绘制区域对象;
    RECT clientRect;


    //----------------------------//
    //初始d3d对象;
    //----------------------------//
    HRESULT InitializeD3D(HWND hwndTemp){
        if (NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
        {
            return false;
        }
        //设置d3dpreame参数 用来创建d3d设备对象;
        D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory(&d3dpp,sizeof(d3dpp));
        d3dpp.Windowed = true;//窗口模式;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

        if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwndTemp,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice)))
        {
            return false;
        }
        //创建字体对象;
        if (FAILED(D3DXCreateFont(g_pd3dDevice,0,0,0,0,0,0,0,0,0,L"楷体",&g_pD3dFont)))
        {
            return false;
        }
        GetClientRect(hwndTemp,&clientRect);
        return true;
    }


    ///渲染图象///////////////////////////////////////////////////////////////////////
    VOID Render(){
        g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(45,50,170),1.0f,0);
        if (SUCCEEDED(g_pd3dDevice->BeginScene()))
        {    //绘画文字;
            g_pD3dFont->DrawText(NULL,strText,-1,&clientRect,DT_SINGLELINE|DT_NOCLIP|DT_CENTER|DT_VCENTER,0xffffffff);

            g_pd3dDevice->EndScene();
        }
        g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
    }

    ///结束释放资源///////////////////////////////////////////////////////////////////////
    VOID CleanUp(){
      //释放字体对象;
        if(!g_pD3dFont){
            g_pD3dFont->Release();
        }
        if(!g_pd3dDevice){
            g_pd3dDevice->Release();
        }
        if(!g_pD3D){
            g_pD3D->Release();
        }
    }


    ///处理消息循环///////////////////////////////////////////////////////////////////////
    LRESULT WINAPI MsgProc(HWND hwnd,UINT msgid, WPARAM wParam, LPARAM LParam){
        switch(msgid){
            case WM_DESTROY:
                CleanUp();
                PostQuitMessage(0);
                return 0;

            case WM_KEYUP:

        //新添加的按键响应;
                if (wParam==VK_ESCAPE)
                {    //esc键退出;
                    CleanUp();
                    PostQuitMessage(0);
                }
                if (wParam==VK_SPACE)
                {    //esc键退出;
                    strText =L"敲击回车键了";
                    Render();
                    ValidateRect(hwnd,NULL);
                }
                break;

            case WM_PAINT:
                //渲染场景;
                Render();
                ValidateRect(hwnd,NULL);
                return 0;

        }
        return DefWindowProc(hwnd,msgid,wParam,LParam);
    }


    ///创建windows窗口///////////////////////////////////////////////////////////////////////
    INT WINAPI WinMain(HINSTANCE hint,HINSTANCE,LPSTR,INT){
        WNDCLASSEX wc={sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,GetModuleHandle(NULL),NULL,NULL,NULL,NULL,L"ClassName",NULL};
        RegisterClassEx(&wc);
        HWND hwnd = CreateWindow(L"ClassName",L"D3D游戏编程",WS_OVERLAPPEDWINDOW    ,200,100,600,500,NULL,NULL,wc.hInstance  ,NULL);

        if (SUCCEEDED(InitializeD3D(hwnd)))
        {
            ShowWindow(hwnd,SW_SHOWDEFAULT);
            UpdateWindow(hwnd);
        
            MSG msg;
            ZeroMemory(&msg,sizeof(msg));
            while(msg.message!=WM_QUIT){
                if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
                {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
                else
                {
                    Render();
                }
            }
        }
        UnregisterClass(L"ClassName",wc.hInstance);
        return 0;
    }

    //////////////////////////////////////////////////////////

    通过上面的代码和第一篇的DirectX3D入门来比较,只是添加了数行代码而已。实现起来并不复杂;

    在DirectX中绘制字体有2个函数【D3DXCreateFontIndirect & D3DXCreateFont】前者利用也有的字体库进行创建,后者根据指定参数进行绘制。

    我们用到了D3DXCreateFont,他的函数原型如下:

        D3DXCreateFont(
            LPDIRECT3DDEVICE9       pDevice,  //指向IDirect3DDevice9的指针 他将与创建的字体对象进行关联;
            INT                     Height,    //字体的逻辑高度,我们传入的0表示默认值;
            UINT                    Width,    //字体的逻辑宽度,0同样表示字体的默认值;
            UINT                    Weight,    //字体的权重,一般设为0;
            UINT                    MipLevels,  //MipMap的级别,字体一般设0;
            BOOL                    Italic,    //是否斜体,1是0否;
            DWORD                   CharSet,  //字体所属的字符集,0自动匹配;
            DWORD                   OutputPrecision,  //字体的输出精度;
            DWORD                   Quality,    //字体的输出质量;
            DWORD                   PitchAndFamily,  //字符的索引号;
            LPCWSTR                 pFaceName,    //表示字体名称的字符串;
            LPD3DXFONT*             ppFont);  //指向ID3DXFont对象的实例指针;

    在上面的InitializeD3D方法中我们完成了设置,并通过GetClientRect获得当前渲染区域讯息。然后接下来就在Render方法中进行了绘制。

    在MsgProc方法中,我们新添加了2个按键响应。一个esc退出,一个空格键改变字体内容的。

  • 相关阅读:
    Java入门:基础算法之从字符串中找到重复的字符
    Java入门:基础算法之产生随机数
    Java入门:基础算法之线性搜索
    Java入门:基础算法之检查奇偶性
    安装hadoop1.2.1集群环境
    Linux上安装JDK
    改变HTML中超链接的显示样式
    【Nutch2.2.1源代码分析之5】索引的基本流程
    【Nutch2.2.1源代码分析之4】Nutch加载配置文件的方法
    java生成UUID通用唯一识别码 (Universally Unique Identifier)
  • 原文地址:https://www.cnblogs.com/2Yous/p/4136211.html
Copyright © 2020-2023  润新知