FreeBASIC マニュアルのトップに戻る

FreeBASIC DrawString

目次→描画ライブラリ参考→2次元 描画関数DRAW STRING←オリジナル・サイト

DRAW STRING 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

文字を、画像や画面に描くための、描画命令文。


構文:
Draw String [buffer,] [STEP] (x, y), text [,color [, font [, method [, (alpha|blender) [, parameter] ] ] ] ]

用法:
Draw String [buffer,] [STEP] (x, y), text [, color]
Draw String [buffer,] [STEP] (x, y), text , , font [, method [, alpha ] ]
Draw String [buffer,] [STEP] (x, y), text , , font, CUSTOM, blender [, parameter]

パラメタ:
buffer
文字列を描くスプライト(sprite)
buffer を指定しないときは、文字列は、画面に描かれます。

 参考:スプライトでキャラクタを操作しよう
http://allabout.co.jp/gm/gc/80719/

STEP
相対座標を使います。
STEP が加えられると、xとy座標は、最後に描かれた点を基準に、平行移動します。

x, y
描くための、画面の左上の端から測った、水平/垂直の位置。( STEP を使わない場合)
文字列の左上の隅が、この位置に描かれます。

text
描画するテキストを含む、文字列

color
フォントを指定しない場合は、テキストの色を選ぶことができます。
省略すると、デフォルトの前景 Color が、使われます。
フォントを指定すると、color は、無視されます。そして、フォント自体が、各画素の色を指定します。

font
カスタム・フォントを含む、画像バッファ。
フォントを指定しないと、現在のテキスト解像度の標準フォントが使われます。そして、以下のパラメタは無視されます。

method Custom
目標の表面の上に、フォント文字を描く方法を指定します。
Put 命令文で見つかったものと同じ方法が、許容されています。唯一の違いは、この関数は、Trans が、デフォルトの方法になっていることです。
このパラメタは、カスタム・フォントだけに適用されます。

alpha
アルファの値。0〜255の範囲。
このパラメタは、 ADDALPHA 方法にだけ、適用されます。

blender
CUSTOM 描画法のための、カスタム混合関数。
詳細は、Put (描画) 命令文の記述を見てください。
このパラメタは CUSTOM 方法だけに適用されます。

parameter
カスタム混合関数に渡される、任意の POINTER;
省略時の、デフォルト値は、ゼロ (0) です。

説明:
 この描画キーワードは、文字列を、画素位置決めして、透明な背景を使って、画面に描きます。 ユーザ指定のフォントを使えます。
 Draw String は、文字列や、描画カーソルを、更新しません。
 また、行末で ワードラップ しません。(注:ワードラップは、行の桁数を超える単語を次の行に送ること。)
 Draw String では、タブ、改行、その他の特殊文字は、特別な振舞いをしません。普通の文字として扱われます。

 この関数は、描画モードで Print に対応する、柔軟な代替手段を提供します。
 これは、いくつかの重要な利点があります:

- Draw String は、画面の上のどんな座標にもテキストを表示できます。
 ( Print は、Locate によってアクセスしやすいように、文字格子の位置に制限されます。)
- Print は、テキストの後ろの背景を、現在の背景色で上書きします。
 Draw String は、これをしません:  背景の画素は、そのままの状態です。
- Put と同様に、Draw String には、 ALPHACUSTOM など、テキスト表示のための、さまざまな方法があります。
- Draw String は、単一の文字セットに制限されません:
 代わりに使うカスタム・フォントを指定することができます。

注意:
 カスタム・フォントを指定しないと、Draw String は、Print で使われる標準の字体がデフォルトで設定されます。そして、文字サイズは、Width で指定します。
 method を渡しても無視されます。テキストは、透明な背景で、供給された色を使って描画されます。

Draw String 座標は、Window および View (Graphics) 命令文で設定されたカスタム座標系の影響を受けます。
描画されたテキストは、View (Graphics) で設定された、切り取り四角形を尊重します。

カスタム・フォント形式:
 フォントは、標準の Get (描画)/Put バッファに格納されます。;
 フォントは、現在の色の濃さと同じ濃さを使って、バッファに格納しなければなりません。さもないと、Draw String は、不法な関数呼び出しランタイム・エラーになります。

 フォント・バッファの画素の最初の行は、フォントのヘッダーをバイト単位(画素(pixel)単位ではない)で、持っています。
 一番最初のバイトは、フォント・ヘッダーのバージョンを特定します。
 現在、これは 0 になっています。
 2番目のバイトは、そのフォントで、最初の該当文字の ASCII コードを示します。
 3番目のバイトは、サポートされている最後の該当文字の ASCIIコードを示します。
 それで、フォントの範囲が最大限 0〜255 の場合は、0255 が、これらの2バイトの内容になります。

 次に、バイト単位で、該当文字列の各文字の幅がそれぞれ来ます。
 フォントが、32〜127 の範囲で 96の文字を保持している場合は、ヘッダーの最初の3バイトは、0, 32127 を保持して、その後、対応する文字の幅を与える 96バイトが続きます。

 フォントの高さは、バッファの高さから1を引いて取得します。つまり、最初のバッファ行のピクセルがフォント・ヘッダーとして機能し、残りの行はグリフ(象徴)のレイアウトを定義します。
 サポートされたすべての文字スプライトを、同じ行に次々と保持するために、バッファは必要なだけ広くしなければなりません。

例:
 ここでは、基本的な Draw String の使用例を、示します:
 画面の中央に "Hello world" を表示します。:

イメージ 注:FreeBASIC 1.08〜 で、SetEnviron を追加しなくても、日本語環境で描画画面が表示されるように改善されました。
' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron("fbgfx=GDI")


Const w = 320, h = 200 '' screen dimensions

Dim x As Integer, y As Integer, s As String

'' 描画ウィンドウを開けます
ScreenRes w, h


'' 画面の中央に文字列を描きます:

s = "Hello world"
x = (w - Len(s) * 8) \ 2
y = (h - 1 * 8) \ 2

Draw String (x, y), s

'' プログラムの終了前に、キー操作を待ちます
Sleep



描画画面に日本語を表示する

1.FBTrueType を使う(渡辺推奨)

2.X-Font を使う
X-Font を使って描画画面に日本語を表示する方法  この方法は、Solbianca さんのサイトで、教えていただきました。
http://syntaxerror445.blog21.fc2.com/blog-category-2.html

 描画画面に日本語を表示するには、X-Font を使います。
http://xaviorsoft.freebasic.net/fbproduct/
上のサイトで、XFont (Text Render Library) の、Library, Converter, Documentation をダウンロードします。

 参考:FreeBASIC フォーラム
https://www.freebasic.net/forum/viewtopic.php?f=8&t=12078
 [v12.0.0]
https://github.com/verybadidea/XFont-Lib

 下記に、Documentation の日本語版と、補足説明が有ります。
http://syntaxerror445.blog21.fc2.com/

まず、Converterを使って、日本語のフォント辞書を作ります。
コンバートを実行
 左の Selection について、Solbianca さんは、
一般的に英数字、全角英数字、日本語、全角記号を使用するのであれば、
Basic Latin
Latin-1 Supplement
Latin Extended-A
Latin Extended-B
CJK Symbols & Punct.
Hiragana
Katakana
CJK Unified Ideographs
CJK Compat. Ideographs
Half. & Fullwidth Forms
を選択するとよい。
と書いています。

 コンパイルするときに、ソース・コードのファイルと同じフォルダに、下記を合せて登録した上で、コンパイルします。(静的ライブラリを参照下さい。)
1.上のフォント辞書(私の場合は MsGothic.xf)
2.libxfont.a
3.xfont.bi

注意:XFont で日本語を扱う場合は、ソースを UNICODE(UTF-16LE) で保存してコンパイルする必要があります。
このため、エディタは「poseidonFB」を使うことを推奨します。
FbEdit の最終バージョンは、UNICODE(UTF-16LE) のファイルを保存すると、不要な文字が入るバグが有ります。
UNICODE保存できる旧バージョン「fbedit1.0.7.4.zip」を、下でダウンロードできるようにしました。

http://www.hi-ho.ne.jp/makoto_watanabe/FbEdit/fbedit1.0.7.4Unicode.zip

描画画面に日本語を表示した例
'注意: このソースは、ユニコードを扱うことができるエディタで、表示・編集して下さい。
'そうしないと、文字化けします。

' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron("fbgfx=GDI")

#Include Once "xfont.bi"

Dim Shared As xfont.interface font
font.loadfont("MsGothic.xf", 1) 'FontIndex 1 に、登録します
font.fontindex = 1 'フォントを使います

Const w = 640, h = 400 '' 画面の寸法

Dim x As Integer, y As Integer
Dim s As WString * 40

'' 描画ウィンドウを開けます
ScreenRes w, h, 32

'' 画面の中央に文字列を描きます:

s = "こんにちは世界! 渡辺真"
x = (w - Len(s) * 8) \ 2
y = (h - 1 * 8) \ 2

font.drawstring ( , s , x, y)
y=y+20
s = s & " 大きさ2倍"
font.drawstring ( , s , 20,  y,2,2)   '文字の大きさ 2倍 size ?何故か途中の文字が欠落します?
s = s & " 縦書き"
font.drawstring ( , s ,500,390,2,2,1) '縦書き

'' プログラムを終わらせる前に、キー操作を待ちます
Sleep

解説:描画モードで x、y に文字を表示します。
構文:
Drawstring [target], text, x, y, [scalex], [scaley], [direction]
パラメタ:
target
描画するバッファを指定します。 target は ImageCreate または Get (Graphics) で作成された画像です。
省略するか 0 を指定すると、target のデフォルトは画面の現在の作業ページになります。
x, y
ピクセルの座標です。
scalex, scaley
文字の拡大率です。
direction
テキストの向きです。 省略するか 0 にすると、文字列は左から右に向きます。
1の場合、文字列は下から上に向きます。

注:最大文字数は 32,767文字に制限されています。


example_unicode 右の画面は、XFont (Text Render Library) Version 11.9.13 の Windows Library xfont_win.zip に含まれるサンプル・プログラムの実行結果です。
 

カスタム字体を作成して、使う

 下の例は、カスタム字体を作成して、使う方法を示します。
 簡単のために、画像を作成するデフォルト字体として、 Draw String を使用します。

' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron("fbgfx=GDI")

'' 文字を表示する範囲を定義します
Const FIRSTCHAR = 32, LASTCHAR = 127

Const NUMCHARS = (LASTCHAR - FIRSTCHAR) + 1
Dim As UByte Ptr p, myFont
Dim As Integer i

'' 256色カラー描画画面を開けます。(320*200)
ScreenRes 320, 200, 8


'' PUTバッファに、カスタム字体を作成します

myFont = ImageCreate (NUMCHARS * 8, 9)

 '' ピクセル・データの始めに、字体ヘッダーを置きます

#ifndef ImageInfo '' FBの旧バージョンには、ImageInfoの機能が、ありません。
p = myFont + IIf (myFont[0] = 7, 32, 4)
#else
ImageInfo ( myFont, , , , , p )
#endif

p[0] = 0
p[1] = FIRSTCHAR
p[2] = LASTCHAR

 '' 字体とアップデート幅情報に、各文字を PUT します
For i = FIRSTCHAR To LASTCHAR

    '' ここで、各文字のためのカスタム幅を定義しますが、簡単のために
    '' デフォルト字体幅を再利用して、8の固定幅を使います。
    p[3 + i - FIRSTCHAR] = 8

    '' デフォルト字体を使用して、カスタム字体バッファに、文字を描画生成します
    Draw String myFont, ((i - FIRSTCHAR) * 8, 1), Chr(i), 32 + (i Mod 24) + 24

Next i


'' 字体バッファの準備ができています。
'' 後の使用のために、BSAVE を使って、それを保存することができます。

rem bsave "myfont.bmp", myFont

'' ここに、カスタム字体を使って、文字列を描きます
Draw String (10, 10), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", , myFont
Draw String (10, 26), "abcdefghijklmnopqrstuvwxyz", , myFont
Draw String (66, 58), "Hello world!", , myFont


'' 字体をメモリから解放します。ここで、それを実行します
ImageDestroy myFont

Sleep

イメージ
QBとの違い:
参照:
2次元描画関数に戻る

←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2019-07-04 00:15:09
日本語翻訳:WATANABE Makoto、原文著作者:AntoniGual

ホームページのトップに戻る

表示-非営利-継承