[C++ / WinAPI] podwojne buforowanie

0

Witam
Mam problem, chce zrobic podwojne buforowanie wykorzystujac StretchBlt tak aby moc jednoczesnie skalowac wyswietlany obraz.
Poki co mam takie cos:

	HDC memDC;
	HBITMAP hMemBmp;
	HBITMAP hOldBmp;
hdc = BeginPaint(hWnd, &ps);
	memDC = CreateCompatibleDC(hdc);
	hMemBmp = CreateCompatibleBitmap(memDC, 700, 600);
	hOldBmp = (HBITMAP)SelectObject(memDC, hMemBmp);
		//rysowanie po memDC, wykorzystujac m.in. rozne kolorowe piorka
	StretchBlt(hdc, 0, 0, iWidth, iHeight, memDC, 0, 0, 700, 600, SRCCOPY);
	SelectObject(memDC, hOldBmp);
	DeleteObject(hMemBmp);
	DeleteObject(hOldBmp);
	DeleteDC(memDC);
EndPaint(hWnd, &ps);

Teraz problem.. nie zdaje sie to dzialac tak jak powinno, nadal jest miganie gdy puscimy to w timer, oraz przy skalowaniu...
Gdy ta linijka:

hMemBmp = CreateCompatibleBitmap(memDC, 700, 600);

wyglada tak jak jest teraz, to obraz jest czarnobialy mimo zastosowania kolorowych piorek (przy rysowaniu na zwyklym hDC nie am tego problemy i piorka sa kolorowe)
Gdy zmienie na:

hMemBmp = CreateCompatibleBitmap(hdc, 700, 600);

To odswiezanie jest znacznie wolniejsze, znim sie przerysuje trwa to pareset milisekund i widac wyrazne pojawianie sie obrazu ale kolory juz sa widoczne..
Co jest.. jak temu zaradzic by byly kolory i skalowanie szybkie z zastosowaniem podobnej techniki?
Bylbym wdzieczny za pomoc...

0

to nie potrzebne

DeleteObject(hOldBmp);

to tez nie za kazdym razem

hMemBmp = CreateCompatibleBitmap(memDC, 700, 600);

generalnie

  1. tworzysz bitmape (np. wm_create)

  2. w timerze rysujesz po niej/czyscisz etc ...

  3. jak nie potrzebujesz kasujesz (np. w wm_destroy)

pytasz o kod ktory rysuje/maluje ze nie dziala wycinajac go ... myslisz ze sie komus bedzie chcialo przerabiac ... co przeszkodzilo dac tobie minimalny przyklad stwarzajacy problem, nawet z setpixel !

0
PSDK napisał(a)

Note: When a memory device context is created, it initially has a 1-by-1 monochrome bitmap selected into it.

Czyli musisz tworzyć bitmapę na podstawie kontekstu okna.

To odswiezanie jest znacznie wolniejsze, znim sie przerysuje trwa to pareset milisekund

StretchBlt jest o wiele wolniejsza od BitBlt, więc nie ma się co dziwić.

Zablokuj WM_ERASEBKGND, bo domyślna obsługa tego komunikatu powoduje odmalowanie okna przed WM_PAINT. A to jest główna przyczyna migotania.

0

reichel
za duzo obchodzenia naokolo tego.. poza tym musialbym byc wtedy caly czas w trybie rysowania.
a odnosnie tego co rysuje, akurat ta wiedza jest zbedna, jak mowilem wykorzytuje pedzelki do naryoswania linii, chyba nie ma sensu wklejac tu zbednego kodu zaciemniajacego obraz i sytuacje.

0x666
Dzieki, troszke pomoglo.

Niemniej juz jest ok, dzieki

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