DrawItemが呼ばれるタイミング – プログラミング – Home

DrawItemが呼ばれるタイミング
 
通知
すべてクリア

[解決済] DrawItemが呼ばれるタイミング


dt
 dt
(@dt)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

初めての質問です。
分かりにくい日本語かもしれませんが、よろしくごお願いいたします。

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

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

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

ボタンをクリック

WM_DRAWITEMメッセージが発生

BN_CLICKEDメッセージが発生

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

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

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


引用未解決
トピックタグ
dt
 dt
(@dt)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

すみません。間違いがありました。
訂正いたします。

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

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


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

ボタンクリックのイベントでInvalidateしてあげれば良いのでは?


返信引用
dt
 dt
(@dt)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

さらに自己フォローです。お恥ずかしい。。。

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


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

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

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

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


返信引用
dt
 dt
(@dt)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

>ボタンクリックのイベントでInvalidateしてあげれば良いのでは?

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

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

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

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


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

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

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


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

「に」「の」が抜けてます(^^;
誤)すぐには処理されず次回以降メッセージループで処理されます。
正)すぐには処理されずに次回以降のメッセージループで処理されます。


返信引用
dt
 dt
(@dt)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

sugerさん返信ありがとうございます。

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

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

となるんですよね?

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました