VB6プログラミング:DirectX2Dグラフィックス学習ログ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

1つ: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に解決されます。それ以外の場合、ANSI文字列が使用されているため、関数呼び出しはD3DXCreateFontAに解決されます。

[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

2.テキストを描画します。[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は独自のスプライトオブジェクトを使用して文字列をレンダリングします。効率を上げるために、DrawTextを連続して複数回呼び出す場合は、スプライトオブジェクトを指定する必要があります。
pString:描画される文字列へのポインタ。Countパラメーターが-1の場合、文字列はnull値で終了する必要があります。
INT:文字列の文字数を指定します。Countが-1の場合、pStringパラメーターはnullで終了する文字列へのポインターであると見なされ、DrawTextは自動的に文字数を計算します。
** pRect:**テキストを論理座標でフォーマットするための長方形を含むRECT構造へのポインター。長方形の右側の座標値は、長方形の左側の座標値よりも大きくなければなりません。同様に、下部の座標値は上部の座標値よりも大きくなければなりません。

**フォーマット:**テキストのフォーマット方法を指定します。次の値の任意の組み合わせにすることができます。

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 ))「ハローワールド」を書いた。

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

3: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として解析されます。
偏差:TrueTypeフォントアウトラインからの最大コード偏差。通常、0.001に設定され
ます。押し出し:負のz方向に沿って押し出されるテキストの量。
ppMesh:返されたメッシュへのポインター。
ppAdjacency:隣接情報を含むバッファーへのポインター。NULLにすることができます。
pGlyphMetrics:グリフインジケーターデータを含むGLYPHMETRICSFLOAT構造配列へのポインター。各要素には、文字列内の対応するグリフの位置と方向に関する情報が含まれています。配列内の要素の数は、文字列内の文字数と同じである必要があります。各構造の原点は文字列全体ではなく、文字セルに関連していることに注意してください。バウンディングボックス全体を計算するには、文字列をトラバースするときに各グリフに増分を追加します。フォントのサイズを気にしない場合は、このパラメーターをNULLに設定してください。

関数のパラメーターにhdcのオプションがあることがわかります。これは主に、デバイスコンテキストでHFONTを選択し、このフォントを使用して3Dテキストグリッドを描画するためのものです。、したがって、最初にフォントを作成してから、デバイスでフォントを選択する必要があります。
フォントの作成は、上記のCreateFontまたはCreateFontIndirect関数を使用することであることは間違いありません(デバイスおよびフォントのフォントオブジェクトを間接的に作成します)。

おすすめ

転載: blog.csdn.net/gosub60/article/details/111166275