質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

1019閲覧

C言語 DX11 テキストの表示について

hal335

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2021/09/19 12:24

DX11で任意のフォントを使った文字列を表示したいです。

https://www.angelcode.com/products/bmfont/
こちらのツールを使って各文字を並べたテクスチャ(ビットマップテクスチャ?)と表示座標などの情報が載ったテキストファイルを用意しました。

・font.txt(一部抜粋)

char id=32 x=1581 y=1395 width=3 height=1 xoffset=-1 yoffset=31 xadvance=7 page=0 chnl=15 char id=33 x=1923 y=1364 width=4 height=16 xoffset=2 yoffset=7 xadvance=8 page=0 chnl=15 char id=34 x=1106 y=1397 width=7 height=6 xoffset=1 yoffset=6 xadvance=10 page=0 chnl=15 char id=12354 x=1080 y=1293 width=19 height=18 xoffset=1 yoffset=6 xadvance=21 page=0 chnl=15 char id=12355 x=1634 y=1382 width=15 height=12 xoffset=3 yoffset=11 xadvance=21 page=0 chnl=15 char id=12356 x=21 y=1386 width=19 height=15 xoffset=1 yoffset=8 xadvance=21 page=0 chnl=15 char id=12357 x=983 y=1382 width=14 height=14 xoffset=3 yoffset=10 xadvance=21 page=0 chnl=15

そして、表示したい文字列の表示座標などの情報を1文字ずつ読み込んで構造体配列にしまっておき、描画時はそれをもとに描画することで半角文字は表示させることができました。

C

1 2// 表示したい文字列 3static char *g_Str[TEXT_MAX] = 4{ 5 "GameStart", 6 "Credit", 7} 8 9// フォント構造体 10struct FONT 11{ 12 BOOL inUse; // 使用中フラグ 13 int id, x, y, w, h, xOffset, yOffset, xAdvance; // ID, 幅と高さ, 表示オフセット, カーソル移動量 14}; 15 16static FONT g_Font[TEXT_MAX][FONT_MAX]; 17 18//-------------------------フォントデータの読み込み------------------------- 19void Init(void) 20{ 21 for (int i = 0; i < TEXT_MAX; i++) 22 { 23 for (int j = 0; *(g_Str[i] + j) != '\0'; j++) 24 { 25 // 文字コードを取得 26 int id = *(g_Str[i] + j); 27 28 char buf[256]; 29 30 FILE *fp; 31 fp = fopen("data/FONT/font.txt", "r"); 32 if (fp == NULL) { 33 exit(-1); 34 } 35 36 // 文字コードを使ってファイルから表示座標などのデータを取得 37 while (fgets(buf, sizeof(buf), fp) != NULL) 38 { 39 sscanf(buf, "%d %d %d %d %d %d %d %d", 40 &g_Font[i][j].id, &g_Font[i][j].x, &g_Font[i][j].y, &g_Font[i][j].w, &g_Font[i][j].h, 41 &g_Font[i][j].xOffset, &g_Font[i][j].yOffset, &g_Font[i][j].xAdvance); 42 43 if (id == g_Font[i][j].id) 44 { 45 g_Font[i][j].inUse = TRUE; 46 break; 47 } 48 } 49 50 fclose(fp); 51 } 52}

ただ、全角文字の文字コードを取得する方法とそれをテキストファイルのID(UTF-16?)に変換させる方法が分からず全角文字が表示できません。
全角文字を表示できるようにするにはどのようなプログラムにすればよいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

全角文字を表示できるようにするにはどのようなプログラムにすればよいでしょうか?

・文字型をUNICODE用の型に変える(char → wchar_t 等)
・プロジェクトの設定の「文字セット」を「Unicode 文字セットを使用する」に変更する
・ANSI版ではなくUNICODE版のAPIを使用する

が必要かと思います。

<参考情報>
■ charとUnicodeとワイド文字をごっちゃにしないために
http://marupeke296.com/CPP_charUnicodeWideChar.html
■ VC++プロジェクトでユニコードビルドと非ユニコードビルドを切り替える
https://www.usefullcode.net/2006/11/vc.html
■ DirectX11 | 17. 文字列の描画
https://pgming-ctrl.com/directx11/string/

投稿2021/09/19 18:41

cx20

総合スコア4648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問