初学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. JedisConnectionException: Failed connecting to host localhost:6379

    报错原因:没有启动服务,打开服务即可 redis.clients.jedis.exceptions.JedisConnectionException: Exception at redis.clien ...

  2. 【题解】洛谷P2296 [NOIP2014TG] 寻找道路(SPFA+DFS)

    题目来源:洛谷P2296 思路 一开始看还以为是一道水题 虽然本来就挺水的 本道题的难点在于如何判断是否路径上的点都会直接或者间接连着终点 我们需要在一开始多建一个反向图 然后从终点DFS回去 把路径 ...

  3. Java基础随笔3

    一. 键盘录入数据概述 我们目前在写程序的时候,数据值都是固定的,但是实际开发中,数据值肯定是变化的,所以,把数据改进为键盘录入,提高程序的灵活性. 键盘录入数据的步骤: A:导包(位置放到class ...

  4. 一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历

    一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看J ...

  5. oracle cascade用法

    原文地址:https://www.cnblogs.com/moyijian/p/9940323.html#4111551 级联删除,比如你删除某个表的时候后面加这个关键字,会在删除这个表的同时删除和该 ...

  6. 逍遥云天 微信小程序开发之获取用户手机号码——使用简单php接口demo进行加密数据解密

    后边要做一个微信小程序,并要能获取用户微信绑定的手机号码.而小程序开发文档上边提供的获取手机号码的接口(getPhoneNumber())返回的是密文,需要服务器端进行解密,但是官方提供的开发文档一如 ...

  7. iOS 自定义任意形状加载进度条(水波纹进度条)

    1. 项目中要做类似下面的加载动画: 先给出安卓的实现方式 2.iOS的实现方式参考了下面两位的,感谢. 以任意底部图片为背景的加载动画 和 水波纹动画 最后附上自己的demo

  8. Ubuntu 16.04LTS 更新清华源

    1 备份原来的更新源 cp /etc/apt/sources.list /etc/apt/sources.list.backup 如果提示权限不够就输入下面两行,先进入到超级用户,再备份 sudo - ...

  9. Redis,传统数据库,HBase,Hive区别联系

    首先介绍各个数据库: Redis: 传统数据库: HBase: Hive:

  10. django_ORM学生管理系统

    一.新建django项目准备工作 CMD新建项目命令:django-admin startproject [项目名称] pycharm的project目录里新建app命令:python manage. ...