Problem podczas używania funkcji BitBlt

Problem podczas używania funkcji BitBlt
SE
  • Rejestracja:ponad 15 lat
  • Ostatnio:prawie 15 lat
0

Witam, frgament mojego kodu:

Kopiuj
                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ę.

SA
  • Rejestracja:około 21 lat
  • Ostatnio:ponad 9 lat
  • Postów:513
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:

Kopiuj
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:

Kopiuj
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.

SE
  • Rejestracja:ponad 15 lat
  • Ostatnio:prawie 15 lat
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!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.