Windows32APIプログラム

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

Windows32APIプログラム

#1

投稿記事 by mori » 13年前

ペイントのようなプログラムを作っているのですが

コード:

switch(uMsg) {
		case WM_CREATE: //ウィンドウが作られたら
			hdc = GetDC(hWnd);
			hMemDC = CreateCompatibleDC(hdc);
			hBitmap = CreateCompatibleBitmap(hdc, CANVAS_WINDOW_WIDTH, CANVAS_WINDOW_HEIGHT);
			ReleaseDC(hWnd, hdc);

			SelectObject(hMemDC, hBitmap);
			SelectObject(hMemDC, GetStockObject(BLACK_PEN));
			SelectObject(hMemDC, GetStockObject(WHITE_BRUSH));
			Rectangle(hMemDC, -1, -1, CANVAS_WINDOW_WIDTH, CANVAS_WINDOW_HEIGHT);

			SelectObject(hMemDC, GetStockObject(BLACK_BRUSH));

			return 0L;

		case WM_MOUSEMOVE:
			if(wParam == MK_LBUTTON) {
				int x = LOWORD(lParam), y = HIWORD(lParam);
				Ellipse(hMemDC, x-2, y-2, x+2, y+2);
				InvalidateRect(hWnd, NULL, FALSE);
			}
			return 0L;

		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			BitBlt(hdc, 0, 0, CANVAS_WINDOW_WIDTH, CANVAS_WINDOW_HEIGHT, hMemDC, 0, 0, SRCCOPY);
			EndPaint(hWnd, &ps);
			return 0L;	
	}

こんな感じでマウスが動いたらそこに円を描画するようにしています
鉛筆で書いたようにスーっと線が引けるかと思ったのですが、処理が遅いのか点と点の位置が離れてしまいました。
マウスを動かし、なめらかな線が引けるにはどうしたらよいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: Windows32APIプログラム

#2

投稿記事 by softya(ソフト屋) » 13年前

Windows32APIと呼ぶことはまずありません。Win32APIかWindowsAPIですね。
マウスが動くたびにInvalidateRect(hWnd, NULL, FALSE);しているので描画の分だけ遅延が発生して余計間が離れてしまっているものと思われます。
それでもマウスが高速に動くとなめらかに線が引けることはありませんので、座標と座標の間は補完計算して描画します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Ryo

Re: Windows32APIプログラム

#3

投稿記事 by Ryo » 13年前

WM_MOUSEMOVEは、現実のマウス動作、つまりアナログの事象に対し、
いかなる抜けもなく完全に発生するわけではないので
どうしても途切れ途切れになります(他処理があったり、PCが重いときなど顕著に)
そこで、前回の値を覚えて、今回の値とを結ぶようにしないといけない。
#最初の一回はWM_LBUTTONDOWNなどで

おまけ
1.InvalidateRect()の直後にUpdateWindow()したほうがいいかも
2.描画する内容・サイズによっては、InvalidateRectで、必要範囲だけを指定しないと
ちらつきが起きたりします

閉鎖

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