アプリ版:「スタンプのみでお礼する」機能のリリースについて

クライアント領域で左クリックを押したままマウスを移動させた時の処理
(WM_MOUSMOVE)として、マウスの位置情報を、
InvalidateRect(hWnd, NULL, FALSE);
でWM_PAINTに送り、WM_PAINTで描画処理をさせます。
右クリックでの処理として、
case WM_RBUTTONDOWN:
   InvalidateRect(NULL, NULL, TRUE);
   return 0;
とした時、WM_PAINTでは
右クリックによるWM_PAINTでは、クライアント領域を
再描画させない様にしたいのですが、
どのようにしたら良いのでしょうか?

クライアント領域に描画されたのを再描画させないことで、
消したいのです。
MS VC++ & Win98 の環境で作成しています。

A 回答 (2件)

InvalidateRect の第3引数を消去/描画のスイッチと


考えている?という意味かなと思われたのですが、そう
なのでしょうか?

更新リージョンの無効化時の処理は
1.背景消去・・・WM_ERASEBKGND(コーディングして
いない場合はデフォルトの塗りつぶし処理が行われる)
2.描画処理・・・WM_PAINT
の順になります。
第3引数の TRUE/FALSE は、この1を行うかどうかの
選択なので、どっちにしても2の WM_PAINT の描画分は
処理されます。

わけのわからん話ですが結局
InvalidateRect ≒ WM_PAINT(= 描画処理)と同じ、
と考えることとして(本当はちょっと違いますが)、
右クリック時は消去のみで行う場合は

・WM_ERASEBKGND をコールする
・フラグを持たせて、クリック時の case 内で立てる
 ようにし、直後の WM_PAINT 内で
 左ボタン時→描画する、右ボタン時→消去する
 と条件処理する
・単に右クリック時処理として背景色ブラシで塗りつぶす

のどれかでいいと思います。
実際のところ背景消去といっても、内部的にはホワイト
ブラシで塗りつぶし処理をしているだけですので。


こういう意味で良かったのなら良かったということで
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
今、あらためて質問文を読んだら回答者が理解しずらい文章でした。
失礼しました。

結局、WM_LBUTTONDOWN内でフラグを立たせ
flg = TRUE; 
WM_PAINT処理内でフラグを判断し描画する。
同様にWM_RBUTTONDOWN内でも同様を処理で解決しました。
が、ウィンドウのサイズを変える事で
今まで描画していたのがすべて消えてしまいました。
ウィンドウのサイズを変えると、WM_PAINTへいきますよね?
WM_PAINTではflg==TRUEなら再描画すると処理してるから
だとは思うのですが、その判定を削除するまたは、flg==FALSE
とする他のBAGが発生します。
WM_RBUTTONDOWNからWM_PAINTと処理がいくと、
WM_PAINT内での描画する為のAPIが処理を行ってしまいます。

どうにか上手く問題回避する方法はないでしょうか?
当方、この問題により行き詰まっております。
宜しくお願いします。

お礼日時:2002/04/26 23:49

BOOL rbutton_flag;


rbutton_flag = FALSE; //initialize

~~~

case WM_RBUTTONDOWN:
rbutton_flag = TRUE;
break;
case WM_PAINT:
if( rbutton_flag == TRUE ) {//右ボタン時抜け
rbutton_flag = FALSE;
break;
}

// その他描画処理
BeginPaint・・・

EndPaint・・・
break;


・・・というのでは?

WM_PAINT は自発的メッセージではないので、
いつ走るかは本来不明なので、標準動作を描画の側に
した方が良いような。
てなことでしょうか。
    • good
    • 0
この回答へのお礼

問題を解決することができました。
ありがとうございました。

お礼日時:2002/05/01 10:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!