ページ 11

Windows32APIプログラム

Posted: 2012年12月15日(土) 20:55
by mori
ペイントのようなプログラムを作っているのですが

コード:

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;	
	}

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

Re: Windows32APIプログラム

Posted: 2012年12月15日(土) 21:07
by softya(ソフト屋)
Windows32APIと呼ぶことはまずありません。Win32APIかWindowsAPIですね。
マウスが動くたびにInvalidateRect(hWnd, NULL, FALSE);しているので描画の分だけ遅延が発生して余計間が離れてしまっているものと思われます。
それでもマウスが高速に動くとなめらかに線が引けることはありませんので、座標と座標の間は補完計算して描画します。

Re: Windows32APIプログラム

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

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