Problem podczas używania funkcji BitBlt

0

Witam, frgament mojego kodu:

                case WM_CREATE:
			SetTimer(hWnd, 1, 30, NULL);
			hdc = GetDC(hWnd);
			memDC = CreateCompatibleDC(hdc);
			GetClientRect(hWnd, &ClientRect);
			ReleaseDC(hWnd, hdc);
			break;
		case WM_TIMER:
			hdc = BeginPaint(hWnd, &ps);
			ClassTimer(hWnd, hdc);
			EndPaint(hWnd, &ps);
			break;
		case WM_LBUTTONDOWN:
			OnLButtonDown(LOWORD(lParam), HIWORD(lParam));
			break;
		case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		bitmapa = CreateCompatibleBitmap(hdc, ClientRect.right - ClientRect.left, ClientRect.bottom - ClientRect.top);
		SelectObject(memDC, bitmapa);
		Paint23(memDC);
		BitBlt(hdc, 0,0,ClientRect.right - ClientRect.left, ClientRect.bottom - ClientRect.top, memDC, 0, 0, SRCCOPY);
		DeleteObject(bitmapa);
		ReleaseDC(hWnd, hdc);
		EndPaint(hWnd, &ps);
		break;

Wszystko działa pięknie tzn. rysuje się płynnie. Mam problem jedynie z tłem. Gdy rysowałem na ekranie nie używając bitmapy tło było białe, teraz zaś jest czarne. Proszę o porady:) i z góry dziękuję.

0

WM_CREATE: skoro zapisujesz ClientRect i tworzysz memDC, to stwórz tutaj też bitmapę i wstaw ją do memDC. Będzie wydajniej w timerze:

memDC = CreateCompatibleDC(hdc);
DeleteObject(SelectObject(memDC, CreateCompatibleBitmap(...))); // bitmapy nie zapamiętuj w zmiennej
ReleaseDC(hwnd, hdc);
break;
//case WM_DESTROY:
//  DeleteDC(memDC);
//  break;
//case WM_PAINT:
//  hdc = BeginPaint(hWnd, &ps);
//  Paint23(memDC);
//  BitBlt(hdc, ...);
//  EndPaint(...);

WM_TIMER: błąd, BeginPaint nie zadziała tutaj (tylko w WM_PAINT). Użyj GetDC, albo hdc z WM_CREATE zapisz w globalnej zmiennej, a usuń w WM_DESTROY.

WM_PAINT: pierwszy SelectObject jest BAD. Albo usuń to co zwraca (patrz wyżej), albo zapamiętaj i zwróć później:

HGDIOBJ oryginalnaBitmapa = SelectObject(memDC, innaBitmapa);
...
SelectObject(memDC, oryginalnaBitmapa);
// innaBitmapa moze zostać usunięta dopiero tutaj

Taki leak można łatwo wykryć za pomocą np. ProcessExplorer, zakładka Performance -> gdi handles. Jeśli ciągle rośnie, to gdzieś czegoś nie usuwasz.

Ostatnia uwaga: złe nazewnictwo zmiennych, utrudnia analizę kodu. Nazwy zmiennych globalnych i lokalnych powinny się wyraźnie różnić. Standardowo zmienne globalne mają prefix g_, na przykład g_memDC.

0

poprawiłem zgodnie z Twoimi wskazówkami, ale niestety ekran dalej jest czarny poza tym co rysuje:(
EDIT:
Już wiem co było źle, czarne tło było domyślne, należało pomalować białym i wsio:) dziękuję za pomoc!

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