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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0305
名無しチェックボックスの文字色の変更5未解決


名無し

リンク

2010/3/5(Fri) 22:59:49|NO.31031

チェックボックスの描画に関する質問なのですが、チェックボックスの描画文字色を変更するにはどうすれば良いでしょうか?
色々調べてみたのですが背景色の変更に関する情報ばかりで、文字色を変更するというものが見つかりませんでした。
チェックボックスだけ出して隣にスタティックテキストを置くという手もありますが、何だかスマートじゃないなと。
どなたかご存じでしたらご教授願います。



この記事に返信する


inovia

リンク

2010/3/6(Sat) 10:31:07|NO.31042

こんな感じでよいと思います。


#uselib "user32.dll" #cfunc GetSysColorBrush "GetSysColorBrush" int #uselib "gdi32.dll" #cfunc CreateSolidBrush "CreateSolidBrush" int #func SetBkColor "SetBkColor" int, int #func SetTextColor "SetTextColor" int, int #cfunc GetStockObject "GetStockObject" int #func DeleteObject "DeleteObject" int #define ctype RGB(%1,%2,%3) (%1 | %2 << 8 | %3 << 16) #define WM_CTLCOLORSTATIC 0x138 hBrush = CreateSolidBrush (RGB(0,0,0)) ;背景用 oncmd gosub *checkbox, WM_CTLCOLORSTATIC onexit *exit ;終了時にブラシを削除するため color 0,0,0 boxf chkbox "check", a stop *checkbox SetBkColor wparam,RGB(0,0,0) ;文字背景色 SetTextColor wparam,RGB(255,0,0) ;テキスト色 return hBrush *exit DeleteObject hBrush ;背景ブラシ削除 end



u

リンク

2010/3/6(Sat) 12:31:27|NO.31048

inoviaさんのスクリプトは私の環境(Vista)では真っ黒に表示されます。
以前チェックボックス関連でどこかで似たような事例をいくつか聞いたことがありますね。

他の方法はオーナードローくらいしか思い浮かびませんが、自前でスタティックテキストなりを使った方が無難だと思います。



GENKI

リンク

2010/3/6(Sat) 13:16:16|NO.31050

mesで代用してみた。
chkbox命令とは違って、文字をクリックしてもチェックボックスのon/offはできません。

#define chkbox2(%1="", %2) x = ginfo_cx : y = ginfo_cy : objsize 24 : chkbox "", %2 : yy = ginfo_cy : pos x+24, y : mes %1 : objsize : pos x, yy ;背景塗りつぶし syscolor 15 : boxf : color 255 pos 100, 100 x = ginfo_cx : y = ginfo_cy objsize 24 ;チェックボックスの大きさを最小に設定。 chkbox "", a yy = ginfo_cy pos x+24, y mes "チェックボックス" objsize ;オブジェクトサイズをデフォルトに戻す。 pos x, yy ;マクロ化 pos 150,150 : chkbox2 "チェックボックス2", b button "aaa", *t ;ボタン配置テスト *t



名無し

リンク

2010/3/6(Sat) 16:30:14|NO.31064

皆さん返信ありがとうございます。
inoviaさんの投稿と同じ仕組みと思われるものは私も見つけたのですが、uさんと同じくチェックボックスの文字色に関しては変更できませんでした。
参考までにURLを。
http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200507/05070009.txt

これで文字色さえ変えられれば、ほぼ理想通りなんですが・・・



u

リンク

2010/3/7(Sun) 11:05:12|NO.31086

それは仕様のようなので仕方がありません。

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で無効状態を取得できなかったのでこのままです。

モジュールにグローバル変数が使えれば一行マクロにする必要もないのですが・・。



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