初学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;
不用害怕,这里面的大多数参数都是可以设置为默认值的,但是也有几个是我们真正需要的,诸如Height和FaceName,它们分别控制着字体的大小和类型。以下是一个创建示例:
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. 文字折行显示
如果我要输出的文字足够多,多到大于pRect的width,那么会出现什么情况呢?由于文字一行太长,于是就显示不出来了,就想图2这样:
图2
解决方法有如下两种:
1)手动折行
2)动态折行
3.1 手动折行
将要输出文字中需要折行位置添加'\n':
string text = "我皮一下挺开心1,\n我皮一下挺开心2,\n我皮一下挺开心3,\n我皮一下挺开心4,\n我皮一下挺开心5,\n我皮一下挺开心6,\n我皮一下挺开心7。";
其他不需要改动,效果如图3所示,由于受制于pRect中height的影响,没有全部显示:
图3
3.2 动态折行
这只需要在DrawTextA的Format传为DT_WORDBREAK,即
font->DrawTextA(spriteobj, text.c_str(), text.length(), &rect, DT_WORDBREAK, color);
显示效果如图4所示:
图4
初学Direct X(9) ——文字的显示的更多相关文章
- 初学Direct X(7) ——位图的旋转,缩放以及平移
初学Direct X(7) --位图的旋转,缩放以及平移 本文旨在实现通过D3DXMatrixTransformation2D函数实现位图的旋转,缩放以及平移操作,但是具体的原理部分会在后面进一步的探 ...
- 初学Direct X(10)—— D3D基础预备知识
初学Direct X(10) -- D3D基础预备知识 1. 像素格式 D3DFMT_X8R8G8B8(F) X:未加使用 8:8位用于显示 B:用于显示蓝色 F:浮点像素类型 以下三个较为常用,使用 ...
- 初学Direct X(8) ——碰撞检测
初学Direct X(8) --碰撞检测 真正让一个游戏鹤立鸡群的是程序对碰撞的响应有多好,这里介绍两种检测的方法: 1) 基于边框的碰撞检测 2) 基于距离的碰撞检测 1. 基于边框的碰撞检测 1. ...
- 初学Direct X(5)
初学Direct X(5) 前面学习了使用表面绘制屏幕,但这种方法与另一种比较起来,有着绘图速度颇慢以及缺乏对任何透明类型的支持,这就是前面的篮框以及炸弹会有黑色背景的原因,这种方法就是纹理.他可以绘 ...
- 初学Direct X(4)
初学Direct X(4) 本文学着做出一个如下的小游戏 游戏方式是使用键盘控制红色的Bucket收集蓝色的炸弹 1.酝酿一下 现在我已经掌握: 将位图文件加载到内存 绘制位图到buckbuffer ...
- 初学Direct X (2)
初学Direct X (2) 这一次要学习如何现实位图,尽管看过对双缓冲机制还有很多疑问,但是这并不阻碍我对他的入门了解 Direct3D提供了一个双重/后台缓冲区,在调用CreateDevice之时 ...
- jQuery hover事件鼠标滑过图片半透明标题文字滑动显示隐藏
1.效果及功能说明 hover事件制作产品图片鼠标滑过图片半透明,标题文字从左到右滑动动画移动显示隐藏 2.实现原理 首先把效果都隐藏,然后定义一个伪类来触发所有的效果,接下来当触发伪类后会有一个遍历 ...
- js实现文字逐个显示
先把代码摆上了吧: <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtm ...
- 文字超出DIV后,隐藏文字并显示...
<html> <head> <style type="text/css"> #cs{width:100px;height:50px;line-h ...
随机推荐
- EasyUI使用之鼠标双击事件
easyui鼠标双击事件,使用 onDblClickRow(index, row) 事件,在用户双击一行的时候触发,参数包括: index:点击的行的索引值,该索引值从0开始. row:对应于点击行的 ...
- 调用save()方法,页面显示保存成功,但是数据库中没有值的原因
在DAO层调用save()方法,页面上显示成功,但是在数据库中查找时发现数据没有保存到数据库中的原因可能是: 1.Service层中是否在调用DAO层中的save()方法之前添加注解@Transact ...
- 给requests模块添加请求头列表和代理ip列表
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,符合了Python语言的思想,通俗的说去繁存 ...
- 启动tomcat的时候为啥你启动的是8,启动起来的确实其他的Tomcat
如果发现,是启动tomcat的时候为啥你启动的是8,启动起来的确实其他的Tomcat ,你可以去看看你的环境变量,是不是配了一个tomcat,
- 一点一点看JDK源码(三)java.util.ArrayList 前偏
一点一点看JDK源码(三)java.util.ArrayList liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 ArrayLi ...
- 我的前端工具集(七)div背景网格
我的前端工具集(七)div背景网格 liuyuhang原创,未经允许禁止转载 目录 我的前端工具集 有时候总觉得div颜色过于白,于是给了10%的灰 但是并不一定能解决问题,因为页面中会有不均衡的 ...
- .Net 上传文件到ftp服务器和下载文件
突然发现又很久没有写博客了,想起哎呦,还是写一篇博客记录一下吧,虽然自己还是那个渣渣猿. 最近在做上传文件的功能,上传到ftp文件服务器有利于管理上传文件. 前面的博客有写到layui如何上传文件,然 ...
- 4 二维数组中的查找 JavaScript
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- jq ajax 传递数组 后台php 接值处理
//jq数组 var arr = [1,2,3]; //把数组转换为json ajax 传递参数的时候不能直接传递数组 转换为json 可直接传递 var datas = JSON.stringify ...
- PHP Mysql字符集utf8mb4支持Emoji表情
项目开发中经常会遇到用户在评论或者发表文章的时候会打一些表情在里面,如果我们在开发中不去做一些处理的话,表情会出不来的,甚至是报错,下面简单介绍处理方式.原文地址:小时刻个人博客:http://sma ...