クライアント領域で左クリックを押したままマウスを移動させた時の処理
(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 の環境で作成しています。
No.1ベストアンサー
- 回答日時:
InvalidateRect の第3引数を消去/描画のスイッチと
考えている?という意味かなと思われたのですが、そう
なのでしょうか?
更新リージョンの無効化時の処理は
1.背景消去・・・WM_ERASEBKGND(コーディングして
いない場合はデフォルトの塗りつぶし処理が行われる)
2.描画処理・・・WM_PAINT
の順になります。
第3引数の TRUE/FALSE は、この1を行うかどうかの
選択なので、どっちにしても2の WM_PAINT の描画分は
処理されます。
わけのわからん話ですが結局
InvalidateRect ≒ WM_PAINT(= 描画処理)と同じ、
と考えることとして(本当はちょっと違いますが)、
右クリック時は消去のみで行う場合は
・WM_ERASEBKGND をコールする
・フラグを持たせて、クリック時の case 内で立てる
ようにし、直後の WM_PAINT 内で
左ボタン時→描画する、右ボタン時→消去する
と条件処理する
・単に右クリック時処理として背景色ブラシで塗りつぶす
のどれかでいいと思います。
実際のところ背景消去といっても、内部的にはホワイト
ブラシで塗りつぶし処理をしているだけですので。
こういう意味で良かったのなら良かったということで
回答ありがとうございます。
今、あらためて質問文を読んだら回答者が理解しずらい文章でした。
失礼しました。
結局、WM_LBUTTONDOWN内でフラグを立たせ
flg = TRUE;
WM_PAINT処理内でフラグを判断し描画する。
同様にWM_RBUTTONDOWN内でも同様を処理で解決しました。
が、ウィンドウのサイズを変える事で
今まで描画していたのがすべて消えてしまいました。
ウィンドウのサイズを変えると、WM_PAINTへいきますよね?
WM_PAINTではflg==TRUEなら再描画すると処理してるから
だとは思うのですが、その判定を削除するまたは、flg==FALSE
とする他のBAGが発生します。
WM_RBUTTONDOWNからWM_PAINTと処理がいくと、
WM_PAINT内での描画する為のAPIが処理を行ってしまいます。
どうにか上手く問題回避する方法はないでしょうか?
当方、この問題により行き詰まっております。
宜しくお願いします。
No.2
- 回答日時:
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 は自発的メッセージではないので、
いつ走るかは本来不明なので、標準動作を描画の側に
した方が良いような。
てなことでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CPU・メモリ・マザーボード ストリーミングの一時処理用の領域について 1 2023/04/11 21:55
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Illustrator(イラストレーター) medibang paintで絵を描いて、A3やB3でコピーしたら線の画質が粗くなったのですが、解決 2 2023/04/04 06:48
- その他(動画サービス) 動画のストリーミングについての質問です。 1 2023/03/22 02:48
- 画像編集・動画編集・音楽編集 medibang paint を使っているのですが、 [画像をレイヤーとして開く]で写真をトレースし 2 2023/03/18 04:36
- ドライブ・ストレージ Win10を再インストールしたら、HDDの一部に未割り当て領域ができ何の操作もできません。 4 2023/05/19 05:31
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- Illustrator(イラストレーター) ワードに貼った画像のキャンバスと画像本体のサイズの調整 2 2022/05/19 18:31
- 美術・アート トレパク疑惑をかけられにくくするには ここ最近いわゆるトレパク警察のいいがかりがが厳しくなったようで 1 2023/08/21 09:59
- Chrome(クローム) Google Chromeのブラウザ(PC)ウインドウの移動について 3 2022/07/19 15:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MFCでOnPaintのタイミング
-
word
-
CScrollViewの使用方法について
-
TextBoxに文字を書いても表示さ...
-
MFC リストビューのツリー表示
-
C# Graphics.DrawLine();で行う...
-
UpdateData( FALSE); による文...
-
C++にて、塗りつぶされた円を描...
-
InvalidateRectの使い方について
-
プシュボタンのテキストの色を...
-
VC++プログラムをつかったBMP画...
-
VC++6.0における、テクスチャブ...
-
ダイアログのボタンコントロー...
-
OneNote 2010 文字と描画がずれる
-
MFCのタイマーのつかい方を教え...
-
C言語(dxlib)のDrawboxについ...
-
c言語を使いダイアログにbmpを...
-
ダイアログベースの再描画について
-
画面リサイズ時のちらつきをな...
-
DirectXとGDIの違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
NVIDIAのシェーダーキャッシュ
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
UpdateData( FALSE); による文...
-
TextBoxに文字を書いても表示さ...
-
VC++プログラムをつかったBMP画...
-
MFCでOnPaintのタイミング
-
エクセルでガンチャートを作成...
-
InvalidateRectの使い方について
-
FlexGridの一部のみ表示を更新...
-
VB.NETでPictureBoxへの描画に...
-
MFCのタイマーのつかい方を教え...
-
CStaticコントロールの静的イメ...
-
VBAにGDI+を参照させる方法
-
画面全体を再描画させたい
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
panelのスクロール表示について
-
CScrollViewの使用方法について
おすすめ情報