初めての質問です。
分かりにくい日本語かもしれませんが、よろしくごお願いいたします。
現在オーナー描画で、一度押すと赤くなり再度押すと緑になる(それを繰り返す)ボタンを
作成しようとしています。
まず、CButtonの派生クラス(DrawItemは実装)を継承したボタンを作成。
public変数でボタンの押下状態(初期値0で一度押すと1。次押すと0に戻るフラグ)を、ボ
タンのクリックイベントで書いておき、DrawItemのFillSolidRectする部分で判定をしてボタ
ンの色を変化させようとしています。
前提が長くなりましたが、上記のような状態でボタンをクリックすると
ボタンをクリック
↓
WM_DRAWITEMメッセージが発生
↓
BN_CLICKEDメッセージが発生
のような動作をしてしまい、ボタンの色がクリック時に変わりません。
(ウィンドウのフォーカスを他のものに変えたりするとdrawitemが走ってボタンの色は
期待した色に変わっています)
ボタンクリックのイベントにWM_DRAWITEMをSendMessageしてあげるなどしなければ
いけないのでしょうか?
ご存知の方いらっしゃいましたらよろしくご教授くださいませ。
すみません。間違いがありました。
訂正いたします。
誤>
ボタンクリックのイベントにWM_DRAWITEMをSendMessageしてあげるなどしなければ
正>
ボタンクリックのイベントで、自分自身(ボタンが配置されてあるフレーム自体に)に
WM_DRAWITEMをSendMessageしてあげるなどしなければ
ボタンクリックのイベントでInvalidateしてあげれば良いのでは?
さらに自己フォローです。お恥ずかしい。。。
<開発環境>
Win2000Server MS VC++6SP2
ヒント。
ボタンは、以下の4つのいずれかの状態にいます。
オーナー描画ボタンでは、以下の4つの状態が切り替わるタイミングで、
WM_DRAWITEMが発生します。
(再描画のタイミングもかな?)
・通常の状態
・フォーカスを受け取っている状態
・ボタンが押下されている状態
・使用不可(いわゆるグレー)の状態
4つの状態が遷移するタイミングと、ボタンの表面色の変更のタイミングを、
整理してみましょう。
>ボタンクリックのイベントでInvalidateしてあげれば良いのでは?
不良PGさんご回答ありがとうございます!
無事ボタンの表示はうまく動作するようになりました。
ところでInvalidateは、呼び出されたメソッド(ボタンクリック時の処理部分など)を
抜けた?時に有効になるのでしょうか。
(うまく説明できなくて申し訳ありません)
例えば
void CButtonDlg::OnButton1()
{
Invalidate(TRUE); // ここで呼び出す
if(pApp->iButtonStatus==0){
pApp->iButtonStatus=1;
}else{
pApp->iButtonStatus=0;
}
}
上のような書き方でもうまくいく(iButtonStatusはDrawItemでボタン背景色を判定する
フラグです)のですが、別にInvalidateを呼び出しているときに再描画まで行っている
というわけではないのですよね?
解決してるのに申し訳ありません。ちょっと気になったもので。。。
CWnd::Invalidateは、WM_PAINTをPostMessageしているようなものなので
(詳しくは::InvalidateRect参照)
すぐには処理されず次回以降メッセージループで処理されます。
ただ、先に書かない方が見やすさの点からも良くないと思われます
「に」「の」が抜けてます(^^;
誤)すぐには処理されず次回以降メッセージループで処理されます。
正)すぐには処理されずに次回以降のメッセージループで処理されます。
sugerさん返信ありがとうございます。
>・通常の状態
>・フォーカスを受け取っている状態
>・ボタンが押下されている状態
>・使用不可(いわゆるグレー)の状態
ボタンクリック→フォーカスの処理(ボタンに点線を引く)→押下処理(へこんでる&枠描画)
→通常の状態(通常のボタン描画)
となるんですよね?
最初の疑問点になってしまうのですが、ボタンのフォーカスとか押下状態はOSが勝手にメッセー
ジ発行してくれると思うのですが、ボタンクリックのメッセージはどのタイミング
に発行されるかわかりません。(デバッグするとVCの方にウィンドウのフォーカス移って
しまうので、状態がよく分かりませんでした)
ボタンがクリックされて、最初にフォーカスを取得するときにクリックイベントが走るのか
それとも押下されている状態もしくはリリースされた状態で呼ばれているのでしょうか?
(知る必要がないといわれればそれまでなのですが。。。^^;;)
もう少し調査して見ます。
色々とご回答ありがとうございました!
私ももっと勉強したいと思います。