Transparente Bitmap ohne Flankern (Microsoft Q79212)
-
Guten Abend,
Meine Frage ist wie man mit dem Ansatz von MS mit einen Backpuffer benutzen kann. Um das Flackern zu verhindern.
void DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, int xStart, int yStart, COLORREF cTransparentColor) { BITMAP bm; COLORREF cColor; HBITMAP hBitAndBack, hBitAndObject, hBitAndMem, hBitSave, hBitBackOld, hBitObjectOld, hBitMemOld, hBitSaveOld; HDC hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave; POINT ptSize; hdcTemp = CreateCompatibleDC(hdc); SelectObject(hdcTemp, hBitmap); GetObject(hBitmap, sizeof(BITMAP), &bm); ptSize.x = bm.bmWidth; ptSize.y = bm.bmHeight; DPtoLP(hdcTemp, &ptSize, 1); hdcBack = CreateCompatibleDC(hdc); hdcObject = CreateCompatibleDC(hdc); hdcMem = CreateCompatibleDC(hdc); hdcSave = CreateCompatibleDC(hdc); hBitAndBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, 0); hBitAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, 0); hBitAndMem = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); hBitSave = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); hBitBackOld = (HBITMAP)SelectObject(hdcBack, hBitAndBack); hBitObjectOld = (HBITMAP)SelectObject(hdcObject, hBitAndObject); hBitMemOld = (HBITMAP)SelectObject(hdcMem, hBitAndMem); hBitSaveOld = (HBITMAP)SelectObject(hdcSave, hBitSave); SetMapMode(hdcTemp, GetMapMode(hdc)); BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY); cColor = SetBkColor(hdcTemp, cTransparentColor); BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY); SetBkColor(hdcTemp, cColor); BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY); BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY); BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND); BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND); BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp ,0, 0, SRCPAINT); BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY); BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY); DeleteObject(SelectObject(hdcBack, hBitBackOld)); DeleteObject(SelectObject(hdcObject, hBitObjectOld)); DeleteObject(SelectObject(hdcMem, hBitMemOld)); DeleteObject(SelectObject(hdcSave, hBitSaveOld)); DeleteDC(hdcMem); DeleteDC(hdcBack); DeleteDC(hdcObject); DeleteDC(hdcSave); DeleteDC(hdcTemp); }HDC übergebe ich windowDC siehe unten. Dabei wird direkt gezeichnet.
CClientDC windowDC (this);Meine Idee war es das ich mit DrawTransparentBitmap alle meine Bilder in einen backpuffer speichere und am ende mit StretchBlt es dem windowDC übergebe. Diesen Ansatz klappt leider nicht.
CDC backBufferDC; windowDC.StretchBlt (0, 0, rect.Width (), rect.Height (), &backBufferDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);Ich hoffe jemand kann mir helfen.
Muller
-
Das sollte Dir helfen: