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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1123
Recompressed軽量版font命令9解決


Recompressed

リンク

2013/11/23(Sat) 14:18:40|NO.58394

font命令の軽量版(Bmscr構造体に直接値を突っ込む)を作ろうと思っているのですが、Bmscr構造体がよく分からずに困っています。

http://dream.freespace.jp/puma/iroiro/struct/bmscr3.htm
フォントハンドルならBmscr構造体の38番、というのは分かっているのですが、サイズ(32番?)と効果がどこなのかが分かりません。
あと、過去の投稿に「0にしたり消したりしないといけない」という書き込みがあったのですが、
どこをどうすればいいかさっぱりです_(:3 」∠)_
http://hsp.tv/play/pforum.php?mode=all&num=58349

fontlight "フォントハンドル",大きさ,効果
のようにしたいと思っています。どうぞよろしくお願いします。



この記事に返信する


くぇrty

リンク

2013/11/23(Sat) 15:50:01|NO.58395

> フォントハンドルならBmscr構造体の38番、というのは分かっているのですが、
> サイズ(32番?)と効果がどこなのかが分かりません。
CreateFontの引数で指定するのでは?
http://msdn.microsoft.com/en-us/library/windows/desktop/dd183499(v=vs.85).aspx

> あと、過去の投稿に「0にしたり消したりしないといけない」という書き込みがあったのですが、
> どこをどうすればいいかさっぱりです_(:3 」∠)_
Bmscr構造体をいじる前にWin32APIを勉強しましょう。



掘木

リンク

2013/11/23(Sat) 17:58:11|NO.58396

>>Recompressedさん
質問文を見る限りいまいちfont-handleがどういうものかよく分かっていないように思えます。
フォントハンドル≠フォント名 ですよ。
くぇrtyさんの返答通りWin32APIに関して情報を集めてみてはどうでしょうか。

ついでに、実際bmscr.38の数値を弄るテストをしてみた(やったことなかったので)。

#uselib "gdi32.dll" #cfunc CreateFont "CreateFontA" int,int,int,int,int,int,int,int,int,int,int,int,int,str #func DeleteObject "DeleteObject" int mref bmscr,67 mes strf("初期:%08X",bmscr(38)) hf = CreateFont(24,12,0,0,300,0,0,0,0,0,0,0,0,"MS 明朝")//フォント生成 mes strf("生成:%08X",hf) p1 = bmscr(38) bmscr(38) = hf mes strf("書換:%08X",bmscr(38)) bmscr(38) = p1 //よくわからないけど一応bmscrの中身を戻しておく。 DeleteObject hf//生成したフォントの抹消
実行してみると分かりますが、bmscr.38を書き換えるだけではフォントは切り替わらない模様。
bmscrを書き換えたあと反映する必要があるようです。いつ反映されるんだろう?
SelectObjectでフォントを切り替えるとbmscr.38は変わりませんがフォントは切り替わります。

なんとなくですが、
Recompressedさんがやりたいことを実現するだけならbmscr.38を参照する必要はないような気がします。



Recompressed

リンク

2013/11/24(Sun) 01:40:23|NO.58414

ご丁寧な回答ありがとうございます。WIN32APIについて調べてみることにします。



暇人

リンク

2013/11/24(Sun) 01:52:09|NO.58415

ちょっと間違いがあったから修正して再掲載

>fontlight "フォントハンドル",大きさ,効果
> のようにしたいと思っています。どうぞよろしくお願いします。
一度使ったフォント名、サイズ、スタイルで再度同じ指定をするのに
再利用する事を言ってるんで、ハンドルだけ取っといて大きさやスタイルを変更する事は出来ない

フォント設定と同時に登録するようにして
再度同じ指定されたら再利用するようにしたモジュール
使い方は標準命令のfontと変らない

#module "mod_font2" #uselib "gdi32.dll" #func DeleteObject "DeleteObject" int #func SelectObject "SelectObject" int,int //font2 fname, siz, sty //使い方は標準命令のfontと同じ //statが0の時は新しく登録された1の時は既に登録されてるフォントが設定された #define global font2(%1="",%2=12,%3=0) _font2 %1,abs(%2),(%3)&31 #deffunc _font2 str fname, int siz,int sty mref bmscr,67 if vartype(fname_list)=4 { dim fhdel_list,32 //削除用にフォントハンドル保存 sdim fname_list,5 //フォント名保存用 sdim font_list,64,32,5 //フォント名とスタイル、サイズ毎にフォントハンドル保存用 } fname_index=-1 repeat fname_max if fname_list(cnt)=fname {fname_index=cnt} loop if fname_index<0 { fname_index=fname_max fname_list(fname_index)=fname fname_max++ } memexpand font_list(sty,fname_index),siz*4+4 dupptr fh,varptr(font_list(sty,fname_index))+siz*4,4,4 if fh=0 { font fname,siz,sty fh=bmscr(38) fhdel_list(font_max)=fh font_max++ bmscr(38)=0 return 0 }else{ SelectObject hdc,fh } return 1 //font2_Delete //登録したフォントを全て削除してHSP標準システムフォントを設定 #define global font2_Delete font2_Exit 1 //font2_Exit //終了時に呼び出される(登録したフォントを全て削除) #deffunc font2_Exit int df,onexit repeat font_max DeleteObject fhdel_list(cnt) loop font_max=0 font_list=0 fname_max=0 fname_list=0 if df=1 {sysfont 0} return #global sysfont 0 mes "font2 \"MS 明朝\",16,17" font2 "MS 明朝",16,17 mes "stat="+stat mes "MS 明朝,16,17のフォントで描画\n" sysfont 0 mes "font2 \"MS ゴシック\",16,17" font2 "MS ゴシック",16,17 mes "stat="+stat mes "MS ゴシック,16,17のフォントで描画\n" sysfont 0 mes "font2 \"MS 明朝\",16,17" font2 "MS 明朝",16,17 mes "stat="+stat mes "MS 明朝,16,17のフォントで描画\n" sysfont 0 mes "font2 \"MS 明朝\",32,2" font2 "MS 明朝",32,2 mes "stat="+stat mes "MS 明朝,32,2のフォントで描画\n"
同じフォント名サイズでスタイルだけ変えた場合
fontよりfont2の方が3倍ぐらい速かった
サイズが40とか超える大きさでサイズ変更する場合10倍ぐらい速かったりする
まぁ、fontが遅いと言ってもフォントファイルはキャッシュされてるだろうから
そんなに気にしなくて良い気はするが・・・



Recompressed

リンク

2013/11/24(Sun) 08:59:10|NO.58419

暇人さん、モジュールありがとうございます。
なるほど...必要なところだけ変更して処理を軽くしているということですね...(間違っていたらごめんなさい)
WIN32APIについていろいろ調べていますが、結構奥深くて理解するのに時間がかかりそうです。

それと、暇人さんのモジュールでフォントサイズやスタイルの値を変更しても反映されなかったりするのですが、
使い方が間違ってるんでしょうか...?



暇人

リンク

2013/11/24(Sun) 09:41:40|NO.58420

NO.58415のをコピペしてそのまま実行したのはちゃんと設定通り表示される?



Recompressed

リンク

2013/11/24(Sun) 10:33:19|NO.58421

表示されます。
でも少しでも弄ると設定が反映されません。
フォント名は反映されたりされなかったりですが、フォントサイズやスタイルを変更すると、
どんな値を指定してもfontを指定しなかった場合のデフォルトの表示になります。



暇人

リンク

2013/11/24(Sun) 12:33:41|NO.58424

#一つ分しかクリアしてなかったので修正して再掲載

memexpandを使った再確保はメモリクリアされて無くてゴミが残ってたのが原因だった・・・

必要サイズがない時だけmemexpandして拡張部分を0クリアするようにした
 
#module "mod_font2" #uselib "gdi32.dll" #func DeleteObject "DeleteObject" int #func SelectObject "SelectObject" int,int //font2 fname, siz, sty //使い方は標準命令のfontと同じ //statが0の時は新しく登録された1の時は既に登録されてるフォントが設定された #define global font2(%1="",%2=12,%3=0) _font2 %1,abs(%2),(%3)&31 #deffunc _font2 str fname, int siz,int sty mref bmscr,67 if vartype(fname_list)=4 { dim fhdel_list,32 //削除用にフォントハンドル保存 sdim fname_list,5 //フォント名保存用 sdim font_list,64,32,5 //フォント名とスタイル、サイズ毎にフォントハンドル保存用 } fname_index=-1 repeat fname_max if fname_list(cnt)=fname {fname_index=cnt} loop if fname_index<0 { fname_index=fname_max fname_list(fname_index)=fname fname_max++ } dupptr dup_font_list_size,varptr(font_list(sty,fname_index))-16,4,4 if dup_font_list_size<(siz*4+4) { bufsize=dup_font_list_size memexpand font_list(sty,fname_index),siz*4+4 memset font_list(sty,fname_index),0,(siz*4+4)-bufsize,bufsize } dupptr dup_fh,varptr(font_list(sty,fname_index))+siz*4,4,4 if dup_fh=0 { font fname,siz,sty dup_fh=bmscr(38) fhdel_list(font_max)=dup_fh font_max++ bmscr(38)=0 return 0 }else{ SelectObject hdc,dup_fh } return 1 //font2_Delete //登録したフォントを全て削除してHSP標準システムフォントを設定 #define global font2_Delete font2_Exit 1 //font2_Exit //終了時に呼び出される(登録したフォントを全て削除) #deffunc font2_Exit int df,onexit repeat font_max DeleteObject fhdel_list(cnt) loop font_max=0 font_list=0 fname_max=0 fname_list=0 if df=1 {sysfont 0} return #global screen 0,800,600 randomize 1234 repeat 20 font2 "MS 明朝",rnd(32)+12,rnd(32) mes "MS 明朝 stat="+stat loop randomize 1234 pos 400,0 repeat 20 font2 "MS 明朝",rnd(32)+12,rnd(32) mes "MS 明朝 stat="+stat loop screen 1,800,600,0,ginfo_wx2,ginfo_wy1 randomize 1234 repeat 20 font2 "MS ゴシック",rnd(32)+6,rnd(32) mes "MS ゴシック stat="+stat loop randomize 1234 pos 400,0 repeat 20 font2 "MS ゴシック",rnd(32)+6,rnd(32) mes "MS ゴシック stat="+stat loop



Recompressed

リンク

2013/11/24(Sun) 15:54:56|NO.58434

たまにしかフォントが乱れなくなりました。
やはりメモリ関係になるとこういうバグも増えたりするものなのでしょうか...
自分もNO.58415を弄っていていろいろ分かったところもあるので、細かい修正は頑張って自分でしてみることにします。
おかしな質問にお付き合い頂きありがとうございました。
一応解決済みにしますが、何かご報告等あれば書き込んでいただければ幸いです。



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