• DirectX9:基础篇 第七章 字体


    一.简介

    在Direct3D中,有三种输出文字的方法:

    • (1) ID3DXFont 接口渲染文字
    • (2) CD3DFont 类渲染文字
    • (3) D3DXCreateText() 函数渲染文字

     

    二.ID3DXFont

    1.创建 ID3DXFont 接口

    HRESULT D3DXCreateFontIndirect(

      LPDIRECT3DDEVICE9 pDevice,

      CONST LOGFONT* pLogFont,

      LPD3DXFONT* ppFont

    );

    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");
    ID3DXFont* font = 0;
    D3DXCreateFontIndirect(Device, &lf, &font);
    

    2.绘制文本

    INT ID3DXFont::DrawText(

      LPCSTR pString,    // 要绘制的文字

      INT Count,       // 字符数量

      LPRECT pRect,      // 文本绘制范围

      DWORD Format,    // 文字格式化

      D3DCOLOR Color     // 文字颜色

    );

    Font->DrawText(
        "Hello World",
        -1,
        &rect,
        DT_TOP | DT_LEFT,
        0xff000000
    );
    

    3.计算每秒的渲染帧数

    DWORD FrameCnt;
    float TimeElapsed;
    float FPS;
    
    void CalcFPS(float timeDelta)
    {
        FrameCnt++;
        TimeElapsed += timeDelta;
        if (TimeElapsed >= 1.0f)
        {
            FPS = (float)FrameCnt / TimeElapsed;
            TimeElapsed = 0.0f;
            FrameCnt = 0;
        }
    }
    

    三.CD3DFont

    1.创建 CD3DFont 类

    CD3DFont(

         const TCHAR* strFontName,  // 以null结束的字符串,

          DWORD dwHeight,      // 字体的高度

          DWORD dwFlags = 0L     // 可选参数: D3DFONT_BOLD, D3DFONT_ITALIC, D3DFONT_ZENABLE

    );

    Font  = new CD3DFont("Times New Roman", 16, 0);
    Font->InitDeviceObjects(Device);
    Font->RestoreDeviceObjects();
    

    2.绘制文本

    HRESULT CD3DFont::DrawText(FLOAT x, FLOAT y, DWORD dwColor, const TCHAR* strText, DWORD dwFlags = 0L);

    • x

        文字在屏幕上开始绘制的 x 坐标

    • y

        文字在屏幕上开始绘制的 y 坐标

    • dwColor

        文字的颜色

    • strText

        要绘制的文字

    • dwFlags

        可选参数:

        0

        D3DFONT_CENTERED,

        D3DFONT_TWOSIDED,

        D3DFONT_FILTERED

    Font->DrawText(20, 20, 0xff000000, "Hello World");
    

    3.清除文本

    Font->InvalidateDeviceObjects();
    Font->DeleteDeviceObjects();
    delete Font;
    

    四.D3DXCreateText()

    HRESULT D3DXCreateText(

      LPDIRECT3DDEVICE9 pDevice,

      HDC hDC,

      LPCTSTR pText,

      FLOAT Deviation,

      FLOAT Extrusion,

      LPD3DXMESH* ppMesh,

      LPD3DXBUFFER* ppAdjacency,

      LPGLYPHMETRICSFLOAT pGlyphMetrics

    );

    • pDevice

        设备

    • hDC

        设备环境句柄

    • pText

        指向以 null 结束的字符串指针

    • Deviation

        字形轮廓,值越接近0越光滑

    • Extrusion

        文字在 z 轴方向的深度

    • ppMesh

        

    • ppAdjacency

        

    • pGlyphMetrics

        一个指向 LPGLYPHMETRICSFLOAT 结构数组的指针

    HDC hdc = CreateCompatibleDC(0);
    
    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;
    
    // font style strcpy(lf.lfFaceName, "Times New Roman");
    // Create a font and select that HFONT hFont; HFONT hFontOld; hFont = CreateFontIndirect(&lf); hFontOld = (HFONT)SelectObject(hdc, hFont);

    // Create the 3D mesh of text
    ID3DXMesh* Text = 0;
    D3DXCreateText(_device, hdc, "Direct3D", 0.001f, 0.4f, &Text, 0, 0);

    // Reselect the old font, and free resources
    SelectObject(hdc, hFontOld);
    DeleteObject(hFont);
    DeleteDC(hdc);

    Text->DrawSubset(0);
  • 相关阅读:
    textarea组件
    switch组件
    slider组件
    radio组件
    picker-view组件
    picker组件 label组件讲解
    weui 框架
    微信小程序 input 组件
    在php中获取 数据库的内容,返回到页面
    微信小程序 form 组件
  • 原文地址:https://www.cnblogs.com/k5bg/p/11150866.html
Copyright © 2020-2023  润新知