英数字と日本文字とでフォントを切り替えて描画するモジュールを作ってみましたが、どうでしょうか? サンプルも付けています。
根本原理は上で さか さんが示しているのと同じで、英数字と日本文字を文字コードで判別し、フォントを切り替えています。
故に通常のmesより処理に時間が掛かりますが、高速な描画が必要にならない限り、問題ないレベルだと思います。
#module DFMes1
;「2フォントメッセージ描画モジュール」
;[書式]
;
; DoubleFontMes 文字列1,文字列2,文字列3 ,数値1,数値2
;
; 文字列1 : メッセージ。(※変数名で指定も可)
; 文字列2 : 英数字用フォントの名(※〃)
; 文字列2 : 日本文字用フォントの名(※〃)
; 数値1 : font命令でのフォントサイズ(論理フォントサイズ)。
; 数値2 : font命令で使う第2パラメータ。(※font命令の時と同じ要領で指定)
;[注意]
;
; このモジュールが再描画のON/OFFには手を出さないので、ユーザー側で適宜設定してください。
; また、命令実行後にはfontの設定が弄られていることに留意してください。
#deffunc DoubleFontMes str message_prm ,str FontName_Alphanumeric ,str FontName_Japanese ,int FontSize ,int SecondPrm_font
message = message_prm
posx_org = ginfo_cx : posy_org = ginfo_cy ;カレントポジションを記録
;< 各フォントでのyサイズを調べておく(∵幸運なことに、yサイズは文字によらず一定らしい) >
font FontName_Alphanumeric,FontSize,SecondPrm_font : pos ginfo_sx,ginfo_sy : mes "A"
ysize_Char_AlphanumericFont = ginfo_mesy
font FontName_Japanese,FontSize,SecondPrm_font : pos ginfo_sx,ginfo_sy : mes "あ"
ysize_Char_JapaneseFont = ginfo_mesy
font FontName_Alphanumeric,FontSize,SecondPrm_font : stat_font = 0 ;現在指定されているフォントの種類 (0,1)=(英数字用,日本語用)
posx = posx_org : posy = posy_org ;描画位置レジスタ
byte_AlreadyRead = 0 ;既読バイト数カウンタ
sdim Code_Head_Char,1 : sdim Code_Tail_Char,1 : sdim Code_Char_Jpn,2 ;コードの保存用変数を文字列型で初期化 ("文字列型"←mesで描くためにはこれが結構大事!)
repeat strlen(message) ;(※最大でも文字列のバイト数〔回〕でループは止まる)
poke Code_Head_Char,0,peek(message,byte_AlreadyRead) : byte_AlreadyRead ++ ;ある文字の1バイト目を読む
k1 = peek(Code_Head_Char,0)
if k1 = 0 : break ;それが終了コードならここで終了
if (k1 <= 128)|((160 <= k1)&(k1 <= 223))|(253 <= k1) {;それが 32〜128 ,160〜223 ,253〜255 の範囲に在れば、それは半角文字。但し、ここでは0以上も読み取る。(∵改行コードも拾いたい)
if peek(Code_Head_Char,0) = 13 {;改行コードの上位1バイトと一致した場合(※改行コードの可能性が高い)
poke Code_Tail_Char,0,peek(message,byte_AlreadyRead) : byte_AlreadyRead ++ ;さらに2バイト目を読み込む
if peek(Code_Tail_Char,0) = 10 {;やはり改行コードだった場合
posx = posx_org : posy + ysize_Char_AlphanumericFont ;カレントポジション更新
} else {;なんと、改行コードではなかった場合
break ;ここで終了(∵お先真っ暗)
}
} else {;半角文字だと分かった場合
if stat_font ! 0 : font FontName_Alphanumeric,FontSize,SecondPrm_font : stat_font = 0 ;必要に応じてフォントを設定
pos posx,posy : mes Code_Head_Char
posx + ginfo_mesx
}
} else {;全角文字の場合
Code_Tail_Char = peek(message,byte_AlreadyRead) : byte_AlreadyRead ++ ;さらに2バイト目を読む
poke Code_Char_Jpn,0,Code_Head_Char : poke Code_Char_Jpn,1,Code_Tail_Char ;日本語文字コードを一時変数に書き込む
if stat_font ! 1 : font FontName_Japanese,FontSize,SecondPrm_font : stat_font = 1 ;必要に応じてフォントを設定
pos posx,posy : mes Code_Char_Jpn
posx + ginfo_mesx
}
loop
return
#global
;++++++++++++++++++++++++ サンプル ++++++++++++++++++++++++
redraw 0
color 0,0,0 : boxf
color 0,200,128
pos 100,100
DoubleFontMes "Hello! こんにちは。\nArialとMS ゴシックを混ぜて描画しています。\n改行もO\nKです。","Arial","MS ゴシック",20,16
pos 100,250
color 128,255,0
DoubleFontMes "Italic・Boldの設定もこの通り!","Arial","MS ゴシック",20,1+2+16
redraw 1
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++