それは仕様のようなので仕方がありません。
inoviaさんのスクリプトをスタティックテキストに反映させGENKIさんのマクロを元に大改造してみました。
*特徴
・文字クリックでもチェックができる
・文字色を変更できる
・背景色を変更できる
・フォントを変更できる
・自動で文字の大きさなどから表示位置の微調整が行われる
恐らく掲示板がかなり横に伸びます。すみません。
マクロですがモジュールのように使えます。
chkbox2.as
#uselib "gdi32"
#cfunc GetStockObjectChk2 "GetStockObject" int
#func GetObjectAChk2 "GetObjectA" int,int,var
#cfunc CreateFontIndirectAChk2 "CreateFontIndirectA" var
#cfunc CreateSolidBrushChk2 "CreateSolidBrush" int
#func SetBkColorChk2 "SetBkColor" int,int
#func SetTextColorChk2 "SetTextColor" int, int
#define chkbox2(%1,%2) mref bmscr_CHK2,67:GetObjectAChk2 bmscr_CHK2.38,60,LF_CHK2:cxCHK2.CHK2cnt=ginfo(22):cyCHK2.CHK2cnt=ginfo(23):oxCHK2.CHK2cnt=bmscr_CHK2.29:oyCHK2.CHK2cnt=bmscr_CHK2.30:winobj "STATIC","",,0x50000000:hStatic_CHK2.CHK2cnt=objinfo(stat,2):pos cxCHK2.CHK2cnt+17,cyCHK2.CHK2cnt+(oyCHK2.CHK2cnt+abs(LF_CHK2.0))/2-abs(LF_CHK2.0):winobj "STATIC",%1,,0x50000000,oxCHK2.CHK2cnt-17,abs(LF_CHK2.0):sstat=stat:hStatic2_CHK2.CHK2cnt=objinfo(stat,2):pos cxCHK2.CHK2cnt,cyCHK2.CHK2cnt+(bmscr_CHK2.30+13)/2-13:objsize 13,13:chkbox "",%2:cstat=stat:hChk_CHK2.CHK2cnt=objinfo(stat,2):objsize oxCHK2.CHK2cnt,oyCHK2.CHK2cnt:sendmsg hStatic2_CHK2.CHK2cnt,0x30,CreateFontIndirectAChk2(LF_CHK2):CHK2cnt++:pos cxCHK2,cyCHK2+oyCHK2+5
#define ctype RGB_CHK2(%1,%2,%3) (%1|%2<<8|%3<<16)
#define color2(%1,%2,%3) mod_col2_r=%1:mod_col2_g=%2:mod_col2_b=%3
oncmd gosub *WM_CTLCOLORSTATIC,0x138
oncmd gosub *WM_LBUTTONDOWN,0x201
oncmd gosub *WM_LBUTTONUP,0x202
oncmd gosub *WM_MOUSEMOVE,0x200
goto *JUMP_CHK2
*WM_CTLCOLORSTATIC
/*WM_CTLCOLORSTATICメッセージを他にも使う場合はここに処理を追加してください (もし使うならこれをメインソースに含んだ方が早いかも)*/
repeat CHK2cnt
if lparam=hStatic_CHK2.cnt{
;SetBkColorChk2 wparam,0x01// ↓これを消してコメントアウトを二箇所外せば文字以外が透過される
return CreateSolidBrushChk2(RGB_CHK2(mod_col2_r,mod_col2_g,mod_col2_b))
;return GetStockObjectChk2(5);
}
if lparam=hStatic2_CHK2.cnt{
SetBkColorChk2 wparam,RGB_CHK2(mod_col2_r,mod_col2_g,mod_col2_b)//こっちを透過しようとすると黒くなる(重ねてる為?)
SetTextColorChk2 wparam,RGB_CHK2(ginfo(16),ginfo(17),ginfo(18))
return GetStockObjectChk2(5)
}
loop
return
*WM_LBUTTONDOWN
/*WM_LBUTTONDOWNメッセージを他にも使う場合はここに処理を追加してください (これはよく使うと思われるので、もし使うならメインソースに(略) )*/
mxCHK2=lParam&0xFFFF
myCHK2=(lParam>>16)&0xFFFF
repeat CHK2cnt
coxCHK2=cxCHK2.cnt+oxCHK2.cnt
coyCHK2=cyCHK2.cnt+oyCHK2.cnt
if (mxCHK2>=cxCHK2.cnt)&&(mxCHK2<=coxCHK2)&&(myCHK2>=cyCHK2.cnt)&&(myCHK2<=coyCHK2){
sendmsg hChk_CHK2.cnt,0xF3,1,0
}
loop
return
*WM_LBUTTONUP
/*WM_LBUTTONUPメッセージを(以下同文)*/
mxCHK2=lParam&0xFFFF
myCHK2=(lParam>>16)&0xFFFF
repeat CHK2cnt
sendmsg hChk_CHK2.cnt,0xF3,0,0
coxCHK2=cxCHK2.cnt+oxCHK2.cnt
coyCHK2=cyCHK2.cnt+oyCHK2.cnt
if (mxCHK2>=cxCHK2.cnt)&&(mxCHK2<=coxCHK2)&&(myCHK2>=cyCHK2.cnt)&&(myCHK2<=coyCHK2){
sendmsg hChk_CHK2.cnt,0xF2,0,0
if stat&0x01{
sendmsg hChk_CHK2.cnt,0xF1,0x00,0
}else{
sendmsg hChk_CHK2.cnt,0xF1,0x01,0
}
}
loop
return
*WM_MOUSEMOVE
/*WM_MOUSEMOVE(以下同文)*/
mxCHK2=lParam&0xFFFF
myCHK2=(lParam>>16)&0xFFFF
repeat CHK2cnt
coxCHK2=cxCHK2.cnt+oxCHK2.cnt
coyCHK2=cyCHK2.cnt+oyCHK2.cnt
if (mxCHK2>=cxCHK2.cnt)&&(mxCHK2<=coxCHK2)&&(myCHK2>=cyCHK2.cnt)&&(myCHK2<=coyCHK2){
sendmsg hChk_CHK2.cnt,0xF3,1,0
}else{
sendmsg hChk_CHK2.cnt,0xF3,0,0
}
loop
return
*JUMP_CHK2
サンプル
#include "chkbox2.as"
pos 50,50
color 255,0,0//文字色
color2 0,0,255//背景色
font "",13//フォントも指定できる
objsize 100,15
chkbox2 "テスト",a
hChk=cstat//cstatにオブジェクトハンドル
hStatic=sstat//sstatにスタティックテキストのオブジェクトハンドル(文字部分)
button "enable",*e
stop
*e
objenable hChk,0
objenable hStatic,0
どう見てもオーナードローの方が早いです・・・。
あと、グレーアウトしてもチェックできてしまいます。
少し改変するだけで解決しますが、BM_GETCHECKで無効状態を取得できなかったのでこのままです。
モジュールにグローバル変数が使えれば一行マクロにする必要もないのですが・・。