初学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

3. 文字折行显示

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



图2

解决方法有如下两种:

1)手动折行

2)动态折行

3.1 手动折行

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

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

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



图3

3.2 动态折行

这只需要在DrawTextAFormat传为DT_WORDBREAK,即

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

显示效果如图4所示:



图4

初学Direct X(9) ——文字的显示的更多相关文章

  1. 初学Direct X(7) ——位图的旋转,缩放以及平移

    初学Direct X(7) --位图的旋转,缩放以及平移 本文旨在实现通过D3DXMatrixTransformation2D函数实现位图的旋转,缩放以及平移操作,但是具体的原理部分会在后面进一步的探 ...

  2. 初学Direct X(10)—— D3D基础预备知识

    初学Direct X(10) -- D3D基础预备知识 1. 像素格式 D3DFMT_X8R8G8B8(F) X:未加使用 8:8位用于显示 B:用于显示蓝色 F:浮点像素类型 以下三个较为常用,使用 ...

  3. 初学Direct X(8) ——碰撞检测

    初学Direct X(8) --碰撞检测 真正让一个游戏鹤立鸡群的是程序对碰撞的响应有多好,这里介绍两种检测的方法: 1) 基于边框的碰撞检测 2) 基于距离的碰撞检测 1. 基于边框的碰撞检测 1. ...

  4. 初学Direct X(5)

    初学Direct X(5) 前面学习了使用表面绘制屏幕,但这种方法与另一种比较起来,有着绘图速度颇慢以及缺乏对任何透明类型的支持,这就是前面的篮框以及炸弹会有黑色背景的原因,这种方法就是纹理.他可以绘 ...

  5. 初学Direct X(4)

    初学Direct X(4) 本文学着做出一个如下的小游戏 游戏方式是使用键盘控制红色的Bucket收集蓝色的炸弹 1.酝酿一下 现在我已经掌握: 将位图文件加载到内存 绘制位图到buckbuffer ...

  6. 初学Direct X (2)

    初学Direct X (2) 这一次要学习如何现实位图,尽管看过对双缓冲机制还有很多疑问,但是这并不阻碍我对他的入门了解 Direct3D提供了一个双重/后台缓冲区,在调用CreateDevice之时 ...

  7. jQuery hover事件鼠标滑过图片半透明标题文字滑动显示隐藏

    1.效果及功能说明 hover事件制作产品图片鼠标滑过图片半透明,标题文字从左到右滑动动画移动显示隐藏 2.实现原理 首先把效果都隐藏,然后定义一个伪类来触发所有的效果,接下来当触发伪类后会有一个遍历 ...

  8. js实现文字逐个显示

    先把代码摆上了吧: <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtm ...

  9. 文字超出DIV后,隐藏文字并显示...

    <html> <head> <style type="text/css"> #cs{width:100px;height:50px;line-h ...

随机推荐

  1. VS调试_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));崩溃原因及解决方法

    今天下午对面的老大调试遇到这个问题,大家一起讨论好久才解决这个问题 crt源代码都是可以看到的,为了了解清楚原因,十分有必要查看源码,源码一般在你的VS安装路径下VC\crt\src下. 点击重试,定 ...

  2. STS使用git下载项目代码

    在自己的eclipse 上安装git 插件,一般都自带了现在. 4.选择Clone URI 5.下一步输入刚才的复制的路劲,填写自己的github 账户名密码即可 6.选择要克隆的分支 7.设置本地g ...

  3. 十七、IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架

    我们已经将 IntelliJ IDEA 中的 Maven 项目的框架搭建完成.接着上文,在本文中,我们更近一步,利用 Tomcat 运行我们的 Web 项目. 如上图所示,我们进一步扩展了项目的结构, ...

  4. react系列(零)安装

    安装 在最初的阶段,可以使用在线编辑的网站来学习React基本的语法. 从 Hello World 开始,可以在Codepen,或者codesandbox上进行编写. 当然,也可以使用npm或者yar ...

  5. one or more listeners failed to start问题解决思路

    今日搭建一个web应用的时候总是遇到tomcat报错:one or more listeners failed to start. Full detail balabale....而且还没有其他提示, ...

  6. Spring 整合Mybatis dao原始方法

    先看一下项目图,基本就理解了整合的内容 这次主角不再是Mybats的配置文件SqlMapConfig.xml了,而是Spring的applicationContext.xml applicationC ...

  7. python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学

    首发于:python人工智能爬虫系列:怎么查看python版本_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=431 本文 ...

  8. 简单几行代码使用百度地图API接口分页获取信息

    首发于: 万能助手扩展开发:使用百度地图API接口分页获取信息_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=426 使用 ...

  9. 09.安装Collabora Online服务

    安装Collabora Online服务 参考博客:http://blog.sina.com.cn/s/blog_16b158be80102xp5u.html 一.安装docker服务 yum ins ...

  10. Windows远程常见问题

    1.window2003远程桌面“已达最大连接数”解决:1)mstsc /v:(此处为服务器IP) /console   任务管理器注销已断开用户 mstsc /v:192.168.4.3 /cons ...