再描画がされない理由

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
uwlover

再描画がされない理由

#1

投稿記事 by uwlover » 16年前

こんばんは。
現在、左クリックすると左上に、右クリックすると右下に円が移動するプログラムを作っているのですが、
クリックしても再描画されず、ウィンドウを最小化することで再描画されます。以下のプログラムです。
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rc;
	static int x1,x2,y1,y2;

	switch (msg) {
		case WM_DESTROY:
			PostQuitMessage(0);
			break;

		case WM_CREATE:
			x1 = 0;
			y2 = 0;
			x2 = 20;
			y2 = 20;
			break;
		
		case WM_LBUTTONDOWN:
			x1 -= 1;
			y1 -= 1;
			x2 -= 1;
			y2 -= 1;
			if(x1 < 0 || y1 < 0)
			{
             x1 += 1;
			 y1 += 1;
			 x2 += 1;
			 y2 += 1; 
			}
			InvalidateRect(hWnd,&rc,TRUE);
			break;

		case WM_RBUTTONDOWN:
			x1 += 1;
			y1 += 1;
			x2 += 1;
			y2 += 1;
			if(x2 > 30 || y2 > 30)
			{
             x1 -= 1;
			 y1 -= 1;
			 x2 -= 1;
			 y2 -= 1;
		 	}
			InvalidateRect(hWnd,&rc,TRUE);
			break;

		case WM_PAINT:
			hdc = BeginPaint(hWnd,&ps);
			Ellipse(hdc,x1,y1,x2,y2);
			EndPaint(hWnd,&ps);
			break;
		
 		default:
			return (DefWindowProc(hWnd, msg, wp, lp));
	}
	return 0;
}
クリックの際にInvalidateRect関数を使って無効領域を意図的に生成し、再描画命令を出すようにしている
はずなのですが…

Ace

Re:再描画がされない理由

#2

投稿記事 by Ace » 16年前

InvalidateRect()の後にUpdateWindow()を呼びましょう。
そうでないとWM_PAINTメッセージが呼ばれないので、再描画がされません。

Justy

Re:再描画がされない理由

#3

投稿記事 by Justy » 16年前


>クリックの際にInvalidateRect関数を使って無効領域を意図的に生成

 InvalidateRect関数の第二引数に何を入れていますか?
 コードの通りだと未初期化変数を入れているように見えるのですが。

uwlover

Re:再描画がされない理由

#4

投稿記事 by uwlover » 16年前

>JUSTYさん
あ、RECT構造体を初期化していなかった…GetClientRect関数を使ってどこかで初期化しないといけないですね。
でも、一応プログラムとしては問題なく動くんですよね…初期化してないよ警告もありませんでしたし。というか、
Windowsプログラミングではどこで初期化したの?って思うようなオブジェクトがしばしば現れる気がします。

>ACEさん
残念ながら、その方法では上手くいきませんでした。

Justy

Re:再描画がされない理由

#5

投稿記事 by Justy » 16年前


>GetClientRect関数を使ってどこかで初期化しないといけないですね

 クライアント領域全体を対象にするのであれば、RECT構造体のポインタではなく
NULLを入れてもいいですよ。

Ace

Re:再描画がされない理由

#6

投稿記事 by Ace » 16年前

言葉足らずでした。すみません。

Justyさんも回答していますが、一般的に全体を再描画したい場合は
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
とすればよいと思います。

余談ですがダブルバッファならウィンドウの背景を消去する必要はないのでInvalidateRectの第三引数をFALSEにしたりします(代わりにバッファを塗りつぶすことになります)。

uwlover

Re:再描画がされない理由

#7

投稿記事 by uwlover » 16年前

お二人方、どうもありがとうございました。引数にNULLを指定することで上手く行きました。
しかし、自分の本に一応載ってはいました…もっとちゃんと読まないといけないな…

閉鎖

“C言語何でも質問掲示板” へ戻る