トップページ > 過去ログ > 記事閲覧
DrawStringの文字間隔について
名前:永零時見 日時: 2007/08/25 13:14

始めまして。少し前からDXライブラリを使っています。 質問は、題名の通りなんですが、DrawString関数を使った文字列表記の際、文字と文字との表示間隔を操作することは出来ないでしょうか? 作りたい関数は、文字列を特定の長さで均等に文字を表示させるというもので、 ABCという文字列で5文字という長さの場合 ABC  ↓ A B C となるような関数です。 地道にスペースを挟むくらいしか思いつきません。。(この方法だと、6文字などと指定されたときにおかしくなるので)

Page: 1 |

Re: DrawStringの文字間隔について ( No.1 )
名前:Prometheus 日時:2007/08/25 19:15

 文字の数分 DrawString()を使って、1文字ずつ表示してはどうでしょう。  これなら文字毎に位置を決められます。 @ サンプル #include "dxlib.h" #include <vector> #include <stdarg.h> #include <stdio.h> int DrawFormatStringToHandleWidth(int x, int y, int color, int width, int fontHandle, const char *format, ...) { // 文字数を数える if(!format) return 0; va_list params; va_start(params, format); int size = _vscprintf(format, params); if(size <= 0) return 0; try { std::vector<char> str(size+1, 0); vsprintf(&str.front(), format, params); int count_draw_chara = 0, lastWidth = 0; for(std::size_t n=0; n<str.size()-1; ++count_draw_chara) { int is_mb = MultiByteCharCheck(&str[n], DX_CHARSET_SHFTJIS); int width = GetDrawStringWidthToHandle(&str[n], is_mb? 2: 1, fontHandle); if(n == str.size() - 2 || (is_mb && n == str.size() - 3)) lastWidth = width; if(is_mb) n+=2; else n++; } float fx = (float)x, add = count_draw_chara < 2? 0: (float)(width - lastWidth) / (count_draw_chara - 1); for(std::size_t n=0, cs_index=0; n<str.size()-1; ++cs_index) { int is_mb = MultiByteCharCheck(&str[n], DX_CHARSET_SHFTJIS); if(is_mb) { DrawFormatString((int)fx, y, color, "%c%c", str[n], str[n+1]); n+=2; } else { DrawFormatString((int)fx, y, color, "%c", str[n]); n++; } fx += add; } } catch(const std::bad_alloc &) { size = -1; } va_end(params); return size; }  使うときはこんな感じで   DrawFormatStringToHandleWidth ( 50, 50, GetColor(255, 255, 255), 270, GetDefaultFontHandle(), "%s", "テスト文字 abc" );
Re: DrawStringの文字間隔について ( No.2 )
名前:憂煉 日時:2007/08/25 22:24

DXライブラリのヘッダに文字間の長さを変更する関数があった気がします。 プロメテウスさんの解答はプロポーショナルフォントに対応出来ない事、処理が重くなる事という欠点があるため、お勧めできません。 今ちょっと雛見沢村に居るので細かな解答はいたしかねます。
Re: DrawStringの文字間隔について ( No.3 )
名前:Prometheus 日時:2007/08/25 22:35

 あ、これですかね。  DrawObtainsString / DrawObtainsBox
Re: DrawStringの文字間隔について ( No.4 )
名前:永零時見 日時:2007/08/26 09:58

DrawObtainsStringを試してみましたが、3番目の引数のint addyがどういう効果があるのかが分かりませんでした。 また、そのあと、ヘッダを調べてみたら、SetFontSpaceという関数があり、これで上手く行きそうです。 憂煉のおっしゃる関数はこれのことだと思います。 お二人ともありがとうございました。

Page: 1 |