VB6编程:DirectX 2D图形学习日志11对第7课的总结

VB6编程:DirectX 2D图形学习日志11对第7课的总结如下:
教程下载地址:https://download.csdn.net/download/gosub60/13696651
绘制文本

首先定义一下引用的函数类型:

Private Main_Font As D3DXFont
Private Main_Font_Description As IFont 'IFont 是VB6内部自带的stdole.tlb的一个引用
Private Text_Rect As RECT

一:D3DXCreateFont :为设备和字体创建字体对象。教程示例中相关定义如下:

    Font.Name = "Arial"'(Font为VB6内部字体函数。)
    Font.Size = 14
    Set Main_Font_Description = Font
    Set Main_Font = Direct3DX.CreateFont(Direct3D_Device, Main_Font_Description.hFont)

其中:① [D3DXFONT_DESC结构:定义字体的属性。](https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dxfont-desc)C++源码结构如下:

typedef struct D3DXFONT_DESC {
         INT   Height;//Height, in logical units,指的是字体的高度,
         UINT  Width;//Width, in logical units 字体中字符的宽度,以逻辑单位表示。
         UINT  Weight;//字体的权重,范围从01000。
         UINT  MipLevels;//请求的Mip级别数。如果该值为零或D3DX_DEFAULT,则创建完整的mipmap链。如果值为1,则将纹理空间映射到屏幕空间。
         BOOL  Italic;//是否斜体,设置为TRUE表示斜体字体。
         BYTE  CharSet;//字符集
         BYTE  OutputPrecision;// 输出精度定义输出必须与请求的字体高度,宽度,字符方向,擒纵,间距和字体类型紧密匹配的程度。
         BYTE  Quality;//输出质量
         BYTE  PitchAndFamily;//斜度和family索引
         TCHAR FaceName;//字体类型名称,以空值结尾的字符串或字符,用于指定字体的字体名称。字符串的长度不能超过32个字符,包括终止的空字符。如果FaceName是一个空字符串,则将使用与其他指定属性匹配的第一个字体。如果编译器设置需要Unicode,则数据类型TCHAR解析为WCHAR;否则,默认格式为WCHAR。否则,数据类型解析为CHAR。
} D3DXFONT_DESC, *LPD3DXFONT_DESC;

需要注意的是:对象的创建要求设备支持32位颜色。如果定义了Unicode,则函数调用解析为D3DXCreateFontW。否则,该函数调用将解析为D3DXCreateFontA,因为正在使用ANSI字符串。

[D3DXFont]():ID3DXFont接口封装了在特定设备上呈现特定字体所需的纹理和资源。

Text_Rect是一个字体坐标,为RECT结构,通过其左上角和右下角的坐标定义一个矩形。C++源码如下:

typedef struct tagRECT {
  LONG left;指定矩形左上角的x坐标。
  LONG top;指定矩形左上角的y坐标。
  LONG right;指定矩形右下角的x坐标。
  LONG bottom;指定矩形右下角的y坐标。
} RECT, *PRECT, *NPRECT, *LPRECT;

在本例中直接使用:

    Text_Rect.Left = 30
    Text_Rect.Top = 30
    Text_Rect.Right = Text_Rect.Left + 100
    Text_Rect.bottom = Text_Rect.Top + 20

二、绘制文字。[ID3DXFont :: DrawText](https://docs.microsoft.com/en-us/windows/win32/direct3d9/id3dxfont–drawtext)方法绘制格式化的文本。此方法支持ANSI和Unicode字符串。此函数C++原型代码如下:

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

参数解释如下:
pSprite: 指向包含字符串的ID3DXSprite对象的指针。可以为NULL,在这种情况下,Direct3D将使用其自己的sprite对象渲染字符串。为了提高效率,如果要连续多次调用DrawText,则应指定一个sprite对象。
pString: 指向要绘制的字符串的指针。如果Count参数为-1,则字符串必须以空值结尾。
INT : 指定字符串中的字符数。如果Count为-1,则将pString参数假定为指向以null终止的字符串的指针,并且DrawText自动计算字符计数。
**pRect :**指向RECT结构的指针,该结构在逻辑坐标中包含要在其中格式化文本的矩形。矩形右侧的坐标值必须大于其左侧的坐标值。同样,底部的坐标值必须大于顶部的坐标值。

**Format :**指定格式化文本的方法。它可以是以下值的任意组合:

DT_BOTTOM
将文本对齐到矩形的底部。该值必须与DT_SINGLELINE结合使用。
DT_CALCRECT
确定矩形的宽度和高度。如果有多行文本,则DrawText使用pRect参数指向的矩形的宽度,并扩展矩形的底部以绑定文本的最后一行。如果只有一行文本,则DrawText会修改矩形的右侧,以使其限制该行中的最后一个字符。在任何一种情况下,DrawText返回格式化文本的高度,但不绘制文本。
DT_CENTER
在矩形中将文本水平居中。
DT_EXPANDTABS
扩展制表符。每个选项卡的默认字符数是8。
DT_LEFT
将文本向左对齐。
DT_NOCLIP
绘制时不剪裁。使用DT_NOCLIP时,DrawText的速度更快。
DT_RIGHT
将文本向右对齐。
DT_RTLREADING
选择希伯来语或阿拉伯字体时,以从右到左的阅读顺序显示双向文本。所有文本的默认阅读顺序是从左到右。
DT_SINGLELINE
仅在一行上显示文本。回车和换行不中断行。
DT_TOP
使文本最上对齐。
DT_VCENTER
垂直居中放置文本(仅单行)。
DT_WORDBREAK
断话。如果单词会超出pRect参数指定的矩形的边缘,则单词之间的线会自动断开。回车/换行的顺序也使行中断。

**D3DCOLOR:**颜色,前边讲过,不记得的可以去查前边的文章。
本例中使用DrawText(注意,上边的函数介绍为DX9的,DX8的顺序有点不同,参考DX8调用声明如下:Sub DrawText(d3dFont As D3DXFont, color As Long, TextString As String, RECT As RECT, Format As Long))写了一个"Hello World"。

Direct3DX.DrawText Main_Font, D3DColorRGBA(255, 255, 255, 255), "Hello World", Text_Rect, DT_TOP Or DT_LEFT

三:扩展绘制3D字体 (将在后边有教程介绍,这里只说明一下函数。)D3DXCreateText函数,创建一个网格,绘制文字的时候就是绘制对应的网格 。(DX8引用格式如下:Sub CreateText(D3DDevice As Direct3DDevice8, hDC As Long, Text As String, Deviation As Single, Extrusion As Single, retMesh As D3DXMesh, adjacencyOut As D3DXBuffer, GlyphMetrics As Any))
D3DXCreateText函数,原型C++代码如下:

HRESULT D3DXCreateText(
  _In_  LPDIRECT3DDEVICE9   pDevice,
  _In_  HDC                 hDC,
  _In_  LPCTSTR             pText,
  _In_  FLOAT               Deviation,偏差:
  _In_  FLOAT               Extrusion,挤出
  _Out_ LPD3DXMESH          *ppMesh,
  _Out_ LPD3DXBUFFER        *ppAdjacency,
  _Out_ LPGLYPHMETRICSFLOAT pGlyphMetrics
);

pDevice:指向创建网格的设备的指针。
hDC: 设备上下文,包含用于输出的字体。设备上下文选择的字体必须是TrueType字体。
pText:指向指定要生成的文本的字符串的指针。如果编译器设置需要Unicode,则数据类型LPCTSTR解析为LPCWSTR。否则,字符串数据类型解析为LPCSTR。
Deviation:与TrueType字体轮廓的最大弦偏差。一般设置为0.001
Extrusion: 沿负z方向挤出文本的量。
ppMesh: 指向返回的网格的指针。
ppAdjacency :指向包含邻接信息的缓冲区的指针。可以为NULL。
pGlyphMetrics : 指向包含字形指标数据的GLYPHMETRICSFLOAT结构数组的指针。每个元素都包含有关字符串中相应字形的位置和方向的信息。数组中的元素数应等于字符串中的字符数。请注意,每个结构中的起源都不是相对于整个字符串,而是相对于该字符单元格。要计算整个边界框,请在遍历字符串时为每个字形添加增量。如果您不关心字形的大小,请将此参数设置为NULL。

可以看到函数的参数中有hdc这一选项,这个主要是为了将HFONT选入设备上下文,然后利用该字体去绘制3D文字网格。,因此我们需要先创建字体,然后将字体选入设备中。
创建字体毫无疑问就是利用上面说的CreateFont或者CreateFontIndirect函数(间接为设备和字体创建字体对象。)。

猜你喜欢

转载自blog.csdn.net/gosub60/article/details/111166275