zoukankan      html  css  js  c++  java
  • 初学Direct X(9) ——文字的显示

    初学Direct X(9)

    ——文字的显示

    本次学习如何使用ID3DXFont创建字体,使得我们可以在任何安装了Windows系统中TrueType字体来打印文字,不过最好使用标准字体,这样文字在每一台PC上的显示才会和计划中的一样。

    1. 显示前的准备

    就像创建LPDIRECT3DDEVICE9一样,我们需要先声明一个接口:

    LPD3DXFONT font = NULL;
    

    接着设置创建字体所需要的参数:

    typedef struct _D3DXFONT_DESCA
    {
        INT Height;
        UINT Width;
        UINT Weight;
        UINT MipLevels;
        BOOL Italic;
        BYTE CharSet;
        BYTE OutputPrecision;
        BYTE Quality;
        BYTE PitchAndFamily;
        CHAR FaceName[LF_FACESIZE];
    
    } D3DXFONT_DESCA, *LPD3DXFONT_DESCA;
    

    不用害怕,这里面的大多数参数都是可以设置为默认值的,但是也有几个是我们真正需要的,诸如HeightFaceName,它们分别控制着字体的大小和类型。以下是一个创建示例:

    D3DXFONT_DESC desc = {
    	24,	// Height
    	0,
    	0,
    	0,
    	false,
    	DEFAULT_CHARSET,
    	OUT_TT_PRECIS,
    	CLIP_DEFAULT_PRECIS,
    	DEFAULT_PITCH,
    	"Arial" // FaceName
    };
    

    有了创建所需要的参数,下面就是开始创建字体对象了,可以发现它需要三个参数:

    1)Direct3D设备:以便将设备与字体关联起来
    2)D3DXFONT_DESC
    3)LPD3DXFONT

    HRESULT D3DXCreateFontIndirectA( 
            LPDIRECT3DDEVICE9       pDevice, 
            CONST D3DXFONT_DESCA*   pDesc, 
            LPD3DXFONT*             ppFont);
    

    以下是一个调用示例:

    D3DXCreateFontIndirect(d3ddev,&desc,&font);
    

    到这就完成了显示字体钱所需要的一切了。

    2. 显示文字

    使用ID3DXFont::DrawText可以打印文字到屏幕上:

    INT DrawText(
      [in] LPD3DXSPRITE pSprite,
      [in] LPCTSTR      pString,
      [in] INT          Count,  
      [in] LPRECT       pRect, 
      [in] DWORD        Format,  
      [in] D3DCOLOR     Color
    );
    

    pSprite:可以为NULL,不过为了提高程序运行效率最好事先声明
    Count:文本的长度
    pRect:显示区域
    Format:文本的格式化,比如DT_RIGHT,它可以使得文本右对齐显示,详细的可以参照文档

    在MSDN的文档中可以看到ID3DXFont::DrawText是支持ANSI以及Unicode的字符串的,即支持中文。

    在设置相关参数之后,让我们看看调用的示例:

    RECT rect;
    rect = { 0, 0, 100, 100 };
    color = D3DCOLOR_XRGB(255, 255, 255);
    string text = "我皮一下挺开心";
    
    // ... 
    
    font->DrawTextA(spriteobj,text.c_str(),text.length(),&rect,DT_CENTER,color);
    
    

    显示效果如图1所示:

    图1
    图1

    3. 文字折行显示

    如果我要输出的文字足够多,多到大于pRectwidth,那么会出现什么情况呢?由于文字一行太长,于是就显示不出来了,就想图2这样:
    图2
    图2

    解决方法有如下两种:

    1)手动折行
    2)动态折行

    3.1 手动折行

    将要输出文字中需要折行位置添加' ':

    string text = "我皮一下挺开心1,
    我皮一下挺开心2,
    我皮一下挺开心3,
    我皮一下挺开心4,
    我皮一下挺开心5,
    我皮一下挺开心6,
    我皮一下挺开心7。";
    

    其他不需要改动,效果如图3所示,由于受制于pRectheight的影响,没有全部显示:

    图3
    图3

    3.2 动态折行

    这只需要在DrawTextAFormat传为DT_WORDBREAK,即

    font->DrawTextA(spriteobj, text.c_str(), text.length(), &rect, DT_WORDBREAK, color);
    

    显示效果如图4所示:

    图4
    图4

  • 相关阅读:
    Hadoop
    Mapreduce
    ssh原理
    HDFS
    Centos
    创建jira插件
    新型的领导者是一名推动者,而不是一名发号施令者
    上善若水,虚怀若谷
    GoAhead 嵌入式web
    Eclipse基金会
  • 原文地址:https://www.cnblogs.com/leihui/p/8953385.html
Copyright © 2011-2022 走看看