[GDI] Flicker-free drawing, Jak rysować na bitmapie i ...

0

Witam,
jako że nie zmieściło się w temacie już precyzuję o co mi chodzi. Mam problem, chcę stworzyć aplikację (coś w stylu painta) i nie mogę poradzić sobie z migotaniem obrazu podczas rysowania. Znalazłem na stronce Dark Cult of C++ http://darkcult.gamedev.pl/kursy/apianim.html jak rozwiązać ten problem, tylko niestety to mi nie działa, dalej miga, a w dodatku wyświetlany obraz jest monochromatyczny - czarny i biały : (. Zaznaczam, że nie chcę korzystać z żadnego MFC i C# i innych. Chcę to zrobić w czystym win32 api w C++.

Kod w funkcji przetwarzającej komunikaty:

case WM_MOUSEMOVE:
		m_mouseX = GET_X_LPARAM( lParam );
		m_mouseY = GET_Y_LPARAM( lParam );
		InvalidateRect( m_hWnd, NULL, TRUE );
		return 0;

case WM_PAINT:
		rysuj();
		ValidateRect( m_hWnd, NULL );
		return 0;

Oto funkcja odpowiedzialna za rysowanie:

CAplikacja::rysuj()
        HDC hdcBufor;
	HBITMAP hbmBuf, hbmOldBuf;

	PAINTSTRUCT ps;
	POINT p1 = { 0 };
	p1.x = 10;
	p1.y = 10;
	wchar_t napis[40] = { 0 };
	swprintf_s( napis, 40, L"mouseX = %d, mouseY = %d", m_mouseX, m_mouseY );
	HDC hDC = NULL;
	hDC = BeginPaint( m_hWnd, &ps );
	
		hdcBufor = CreateCompatibleDC( hDC );
		hbmBuf = CreateCompatibleBitmap( hdcBufor, ps.rcPaint.right, ps.rcPaint.bottom );
		hbmOldBuf = ( HBITMAP ) SelectObject( hdcBufor, hbmBuf );
		FillRect(hdcBufor, &( ps.rcPaint ), ( HBRUSH ) GetStockObject( WHITE_BRUSH ) );

		TextOut( hdcBufor, 30, 20, napis, 40);
		HBRUSH newBrush = CreateHatchBrush( HS_BDIAGONAL, RGB ( 0, 0, 0 ) );
		HGDIOBJ oldBrush = SelectObject( hdcBufor, ( HGDIOBJ )newBrush );
		SetBkColor( hdcBufor, RGB ( 120, 120, 120 ) );
		SetBkMode( hdcBufor, OPAQUE );
		Rectangle( hdcBufor, p1.x, p1.y, m_mouseX, m_mouseY );
		SelectObject( hdcBufor, oldBrush );
		BitBlt ( hDC, 0, 0, ps.rcPaint.right, ps.rcPaint.bottom, hdcBufor, 0, 0, SRCCOPY );
		SelectObject( hdcBufor, hbmOldBuf );
		DeleteObject ( hbmBuf );
		DeleteObject( newBrush );

	EndPaint( m_hWnd, &ps );
}

m_hWnd - uchwyt do okna
m_mouse[X/Y] - współrzędne myszki

0

tylko niestety to mi nie działa, dalej miga

Poczytaj o WM_ERASEBKGND.

a w dodatku wyświetlany obraz jest monochromatyczny

hbmBuf = CreateCompatibleBitmap( hDC , ps.rcPaint.right, ps.rcPaint.bottom );
0

Dzięki wielkie, masz ode mnie 2 [browar] : ). Tylko musisz je wyeksportować z emotki : ).

1 użytkowników online, w tym zalogowanych: 0, gości: 1