DrawItemが呼ばれるタイミング

[戻る]
dt 2002/04/11(木) 15:29:58
初めての質問です。
分かりにくい日本語かもしれませんが、よろしくごお願いいたします。

現在オーナー描画で、一度押すと赤くなり再度押すと緑になる(それを繰り返す)ボタンを
作成しようとしています。

まず、CButtonの派生クラス(DrawItemは実装)を継承したボタンを作成。
public変数でボタンの押下状態(初期値0で一度押すと1。次押すと0に戻るフラグ)を、ボ
タンのクリックイベントで書いておき、DrawItemのFillSolidRectする部分で判定をしてボタ
ンの色を変化させようとしています。

前提が長くなりましたが、上記のような状態でボタンをクリックすると

ボタンをクリック
↓
WM_DRAWITEMメッセージが発生
↓
BN_CLICKEDメッセージが発生

のような動作をしてしまい、ボタンの色がクリック時に変わりません。
(ウィンドウのフォーカスを他のものに変えたりするとdrawitemが走ってボタンの色は
 期待した色に変わっています)

ボタンクリックのイベントにWM_DRAWITEMをSendMessageしてあげるなどしなければ
いけないのでしょうか?

ご存知の方いらっしゃいましたらよろしくご教授くださいませ。

dt 2002/04/11(木) 15:31:55
すみません。間違いがありました。
訂正いたします。

誤>
ボタンクリックのイベントにWM_DRAWITEMをSendMessageしてあげるなどしなければ

正>
ボタンクリックのイベントで、自分自身(ボタンが配置されてあるフレーム自体に)に
WM_DRAWITEMをSendMessageしてあげるなどしなければ

不良PG 2002/04/11(木) 16:10:29
ボタンクリックのイベントでInvalidateしてあげれば良いのでは?

dt 2002/04/11(木) 16:11:11
さらに自己フォローです。お恥ずかしい。。。

<開発環境>
Win2000Server MS VC++6SP2

sugar 2002/04/11(木) 16:15:52
ヒント。
ボタンは、以下の4つのいずれかの状態にいます。
オーナー描画ボタンでは、以下の4つの状態が切り替わるタイミングで、
WM_DRAWITEMが発生します。
(再描画のタイミングもかな?)

・通常の状態
・フォーカスを受け取っている状態
・ボタンが押下されている状態
・使用不可(いわゆるグレー)の状態

4つの状態が遷移するタイミングと、ボタンの表面色の変更のタイミングを、
整理してみましょう。

dt 2002/04/11(木) 16:32:08
[[解決]]
>ボタンクリックのイベントでInvalidateしてあげれば良いのでは?

不良PGさんご回答ありがとうございます!
無事ボタンの表示はうまく動作するようになりました。

ところでInvalidateは、呼び出されたメソッド(ボタンクリック時の処理部分など)を
抜けた?時に有効になるのでしょうか。
(うまく説明できなくて申し訳ありません)
例えば

void CButtonDlg::OnButton1() 
{
 Invalidate(TRUE); // ここで呼び出す
 if(pApp->iButtonStatus==0){
   pApp->iButtonStatus=1;
 }else{
   pApp->iButtonStatus=0;
 }
}
上のような書き方でもうまくいく(iButtonStatusはDrawItemでボタン背景色を判定する
フラグです)のですが、別にInvalidateを呼び出しているときに再描画まで行っている
というわけではないのですよね?

解決してるのに申し訳ありません。ちょっと気になったもので。。。

不良PG 2002/04/11(木) 16:47:07
CWnd::Invalidateは、WM_PAINTをPostMessageしているようなものなので
(詳しくは::InvalidateRect参照)
すぐには処理されず次回以降メッセージループで処理されます。

ただ、先に書かない方が見やすさの点からも良くないと思われます

不良PG 2002/04/11(木) 16:48:28
「に」「の」が抜けてます(^^;
誤)すぐには処理されず次回以降メッセージループで処理されます。
正)すぐには処理されずに次回以降のメッセージループで処理されます。

dt 2002/04/11(木) 16:57:47
sugerさん返信ありがとうございます。

>・通常の状態
>・フォーカスを受け取っている状態
>・ボタンが押下されている状態
>・使用不可(いわゆるグレー)の状態

ボタンクリック→フォーカスの処理(ボタンに点線を引く)→押下処理(へこんでる&枠描画)
→通常の状態(通常のボタン描画)

となるんですよね?

最初の疑問点になってしまうのですが、ボタンのフォーカスとか押下状態はOSが勝手にメッセー
ジ発行してくれると思うのですが、ボタンクリックのメッセージはどのタイミング
に発行されるかわかりません。(デバッグするとVCの方にウィンドウのフォーカス移って
しまうので、状態がよく分かりませんでした)
ボタンがクリックされて、最初にフォーカスを取得するときにクリックイベントが走るのか
それとも押下されている状態もしくはリリースされた状態で呼ばれているのでしょうか?
(知る必要がないといわれればそれまでなのですが。。。^^;;)
もう少し調査して見ます。

色々とご回答ありがとうございました!
私ももっと勉強したいと思います。

古いスレッドには追加発言できません。