ページ 11

再描画がされない理由

Posted: 2009年9月22日(火) 19:25
by uwlover
こんばんは。
現在、左クリックすると左上に、右クリックすると右下に円が移動するプログラムを作っているのですが、
クリックしても再描画されず、ウィンドウを最小化することで再描画されます。以下のプログラムです。
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関数を使って無効領域を意図的に生成し、再描画命令を出すようにしている
はずなのですが…

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

Posted: 2009年9月22日(火) 19:37
by Ace
InvalidateRect()の後にUpdateWindow()を呼びましょう。
そうでないとWM_PAINTメッセージが呼ばれないので、再描画がされません。

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

Posted: 2009年9月22日(火) 19:44
by Justy

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

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

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

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

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

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

Posted: 2009年9月22日(火) 20:30
by Justy

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

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

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

Posted: 2009年9月22日(火) 22:12
by Ace
言葉足らずでした。すみません。

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

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

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

Posted: 2009年9月22日(火) 23:33
by uwlover
お二人方、どうもありがとうございました。引数にNULLを指定することで上手く行きました。
しかし、自分の本に一応載ってはいました…もっとちゃんと読まないといけないな…