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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0817
とあるプログラマエディットボックスの背景/文字色の動的変更2解決


とあるプログラマ

リンク

2019/8/17(Sat) 19:23:14|NO.88098

エディットボックス(input命令)での入力内容に応じて文字色と背景色を変更したいです。(例:内容が答えと間違っていたら背景赤 文字白にする)

単純に色を変えるならoncmd等でWM_CTLCOLOREDIT捕まえてSetBkColorとSetTextColorして背景ブラシを返せばいいんですが、動的に変えると一つ問題が。
WM_KEYDOWN捕まえてWM_GETTEXTで内容取得、内容を確認して色を変えるかのフラグをセット。 まではいいんですが色が変わってくれない…

具体的にはカーソルがエディットボックス内に入るか外に出るまで変更が適用されないのです。もしかしたら色を動的に変更することは想定外で対応していないのでしょうか。



この記事に返信する


MIZUSHIKI

リンク

2019/8/18(Sun) 15:16:39|NO.88122

WM_CTLCOLOREDITが飛んできたときにSetBkColorとSetTextColorを使って色の変更をしていますよね。

ただ、
>色を変えるかのフラグをセット
しただけでは"エディットボックスを再描画しなさい"ってメッセージが飛んで来ません。
(WM_CTLCOLOREDIT が発生しません。)

そこで、ウィンドウ(エディットボックス)を再描画させる必要があります。
ウィンドウの再描画はいくつか方法があった気がしますが、win32apiの「InvalidateRect」を使うと良いと思います。

【参考】領域の消去と有効化
 http://wisdom.sakura.ne.jp/system/winapi/win32/win35.html


// エディトコントロール内文字色&背景色変更サンプル (by Kpan) #include "user32.as" #include "gdi32.as" #define ctype RGB(%1,%2,%3) (%1 | %2 << 8 | %3 << 16) dim hInput, 2 a = "文字色&背景色を変えてみる1" input a, 200 hInput.0 = objinfo(stat, 2) b = "文字色&背景色を変えてみる2" input b, 200 hInput.1 = objinfo(stat, 2) wait 200 mes "set" InvalidateRect hInput.0, 0, 1 ; ← ウィンドウの再描画 ; エディットコントロールが描画されるときに送られてくる ; ウィンドウメッセージ (WM_CTLCOLOREDIT) oncmd gosub *ctlcoloredit, $133 ; 生成したカラーデータを破棄するための処理に必要 onexit *exit ; 背景カラー用のブラシを生成しハンドルを取得。 CreateSolidBrush RGB($FF, $00, $00) hBrush.0 = stat CreateSolidBrush RGB($FF, $00, $FF) hBrush.1 = stat stop *ctlcoloredit ; lparamにオブジェクトのウィンドウハンドルが返る if hInput.0 = lparam { SetTextColor wparam, RGB($FF, $FF, $00) ; テキスト背景色 (hBrush.0と同色を指定) SetBkColor wparam, RGB($FF, $00, $00) ; ボックス背景色 return hBrush.0 } if hInput.1 = lparam { SetTextColor wparam, RGB($00, $FF, $00) ; テキスト背景色 (hBrush.1と同色を指定) SetBkColor wparam, RGB($FF, $00, $FF) return hBrush.1 } return *exit ; 作成した背景カラー用のブラシを破棄 DeleteObject hBrush.1 DeleteObject hBrush.0 end ;Kpanさんの「入力ボックス/メッセージボックの表示色変更」をほぼそのまま流用させてもらいました。 ;http://lhsp.s206.xrea.com/hsp_object2.html



とあるプログラマ

リンク

2019/8/18(Sun) 19:33:15|NO.88124

>>MIZUSHIKIさん
これはいい関数を教わりました…
UpdateWindow関数で再描画リクエストしてたんですけど、文字を含まない範囲のクライアント領域の再描画が行われ無かったのでsendmsgでWM_MOUSEMOVEとWM_MOUSELEAVEを送り付けるという荒業で対応してました…w
どうやらエディットコントロールはカーソルが出入りするまではクライアント領域全体の更新は通知されず、UpdateWindowは更新リクエストきてない部分は無視されるようですね。

ありがとうございます。



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