|
|
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を参照する必要はないような気がします。
|
|
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が遅いと言ってもフォントファイルはキャッシュされてるだろうから
そんなに気にしなくて良い気はするが・・・
| |
|
2013/11/24(Sun) 08:59:10|NO.58419
暇人さん、モジュールありがとうございます。
なるほど...必要なところだけ変更して処理を軽くしているということですね...(間違っていたらごめんなさい)
WIN32APIについていろいろ調べていますが、結構奥深くて理解するのに時間がかかりそうです。
それと、暇人さんのモジュールでフォントサイズやスタイルの値を変更しても反映されなかったりするのですが、
使い方が間違ってるんでしょうか...?
|
|
2013/11/24(Sun) 09:41:40|NO.58420
NO.58415のをコピペしてそのまま実行したのはちゃんと設定通り表示される?
|
|
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
| |
|
2013/11/24(Sun) 15:54:56|NO.58434
たまにしかフォントが乱れなくなりました。
やはりメモリ関係になるとこういうバグも増えたりするものなのでしょうか...
自分もNO.58415を弄っていていろいろ分かったところもあるので、細かい修正は頑張って自分でしてみることにします。
おかしな質問にお付き合い頂きありがとうございました。
一応解決済みにしますが、何かご報告等あれば書き込んでいただければ幸いです。
|
|