HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1121
mesyo英字のみフォントを変更3未解決


mesyo

リンク

2013/11/21(Thu) 21:59:53|NO.58349


font "Arial",16 mes "test" mes "テスト"

上記のコードを実行すると、Arialフォントは日本語文字を含んでいないため文字化けが発生します。
そこで英字のみArial、その他の文字は標準フォント(MSゴシック)にしたいのですが、どのようにすれば良いのでしょうか?
英字と日本語を判別、フォントを変えて別々に描画も試してみましたが、ズレてしまって駄目でした。



この記事に返信する


さか

リンク

2013/11/21(Thu) 22:42:03|NO.58351

メッセージの出力Xサイズを取得してカレントポジションを指定すればどうですか。
font "Arial",16
mes "test"
font "MSゴシック",16
pos ginfo_mesx,0: mes "テスト"

しかしなぜそこまでして日本語のない「Arial」フォントを使用したいのでしょうか。笑
「メイリオ」とか「tahoma」とか見やすいと思いますが。



FunnyMaker

リンク

2013/11/22(Fri) 17:49:09|NO.58374

英数字と日本文字とでフォントを切り替えて描画するモジュールを作ってみましたが、どうでしょうか? サンプルも付けています。
根本原理は上で さか さんが示しているのと同じで、英数字と日本文字を文字コードで判別し、フォントを切り替えています。
故に通常の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 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



(’’

リンク

2013/11/22(Fri) 19:18:37|NO.58375

直接的には関係ありませんが、font命令は重いのでフォントを作ったらBMSCR.38のhfontをとっておくと軽いです

font命令を実行するとBMSCR.38のフォントハンドルが消えるので実行する前にBMSCR.38を0にしておきます。
使う時はBMSCR.38に代入してmes、消す時はuser32.dllのDelteObjectで消せます

http://dream.freespace.jp/puma/iroiro/struct/bmscr3.htm



ONION software Copyright 1997-2023(c) All rights reserved.