ダイアログボタンのテキスト情報を保持するには?

解決


いるか  2011-02-01 00:05:29  No: 72292  IP: [192.*.*.*]

はじめまして、いるかと申します。
以下の件、良い対応がわかるかたがおりましたらご教授お願いします。

【環境】
WindwsXPSP3、VC6++SP6、MFC(EXE)、ダイアログベース

【やりたいこと】
あるフラグがONの場合、ボタンコントロールのテキスト色を赤に
OFFの場合は、黒に変化させているプログラムがあります(初期値は黒色)。
通常のダイアログを描画させている時は、特に問題ないのですが、
ダイアログを適当なウィンドウに隠し、再表示させた場合にフラグがONの
場合でも、ボタンコントロールのテキスト色が赤ではなく、
初期値の黒が設定されてしまいます(テキスト内容も初期化されます)。
ダイアログを適当なウィンドウに隠し、再表示させた場合にフラグがONの
場合、ボタンコントロールのテキスト色に赤が設定されるように
したいと考えています(テキスト内容も残す)。
以下に現状のプログラムの簡単な流れと原因をします。
できれば、現状のプログラムから余り修正を加えずに実現できたら
よいと考えています。

【現状のプログラムの流れ】
①タイマー関数で処理②以降を実行
②CDCクラスでGetDialogで指定したボタンを参照
③参照したボタンに対してSetTextColorでテキスト色を設定
④TextOutでテキスト内容を設定
④CDCクラス解放

【原因】
・TextOut関数をOnPaint関数以外で実施している。
・TextOut関数で設定したテキスト内容は、描画更新時に残らない

【対策として考えたもの】
×SetWindowTextを使用する。
  (テキストの色が変えられない)
×TextOut関数をOnPaintに移動し、SetBkModeで背景を透過させる。
  (見た目上の変化なし)
△ボタンをオーナードローして、専用の処理を入れる。
  (実現できるかは調査中)

以上です。

編集 削除
仲澤@失業者  2011-02-01 12:01:21  No: 72293  IP: [192.*.*.*]

あるDLGのメンバーコントロールのテキスト色を変えたい場合は
当該のDLGがWM_CTLCOLOR〜系メッセージに応答する方法が一般的です。
本件の場合ボタンなのでWM_CTLCOLORBTN メッセージですね。

編集 削除
ryo  2011-02-01 18:50:58  No: 72294  IP: [192.*.*.*]

http://support.microsoft.com/kb/130952/eu-us
より
WM_CTLCOLORBTN
Sent By: command buttons (regular and default) 
Changes made during this message have no effect on command buttons. Command buttons always use system colors for drawing themselves. 

だそうです。

編集 削除
仲澤@失業者  2011-02-01 22:16:14  No: 72295  IP: [192.*.*.*]

おおっ、すみません、そうでしたね。
そうなると、オーナードロー(BS_OWNERDRAW)を
選択せざるを得ませんね。

編集 削除
ロマ  2011-02-01 22:57:32  No: 72296  IP: [192.*.*.*]

Themeを使用しているのなら
CUSTOMDRAWでもできそうです。

編集 削除
いるか  2011-02-02 00:31:23  No: 72297  IP: [192.*.*.*]

仲澤@失業者さん、ryoさん、ロマさん
ご教授ありがとうございます。
カスタムドロー、オーナードローの
両方向から実現させてみます。

編集 削除
いるか  2011-02-13 19:58:55  No: 72298  IP: [192.*.*.*]

遅くなりまして、すいません。
オーナードローで解決できました。
皆様ありがとうございました。

編集 削除