Frage

Ich will eine Ernte-Funktion in einem bestehenden Motor schaffen. Dies ist, was ich schon habe:

bool Bitmap::Crop(RECT cropArea)
{
BITMAP bm;
GetObject(m_Handle, sizeof(bm), &bm);

HDC hSrc = CreateCompatibleDC(NULL);
SelectObject(hSrc, m_Handle);

HDC hNew = CreateCompatibleDC(NULL);
HBITMAP hBmp = CreateCompatibleBitmap(hNew, bm.bmWidth, bm.bmHeight);
HBITMAP hOld = (HBITMAP)SelectObject(hNew, hBmp);

BitBlt(hNew, 0, 0, bm.bmWidth, bm.bmHeight, hSrc, 0, 0, SRCCOPY);

SelectObject(hNew, hOld);

DeleteDC(hSrc);
DeleteDC(hNew);

DeleteObject(m_Handle);

m_Handle = hBmp;
}

Ich möchte es kopieren nur das gesamte Bild auf ein neues HBITMAP und ersetzen die alten mit ihm. Also ich weiß, dass es funktioniert. Danach wird es mit den BitBlt Parameter nur spielen.

m_Handle ist ein HBITMAP der Klasse Bitmap.

Das Ergebnis dieses Code ist nur ein schwarzer Bildschirm.

War es hilfreich?

Lösung

Sie niemals ein kompatibles Bitmap aus einem ‚frischen‘ Speicher DC erstellen. Es sei denn, das ist möchten Sie ein 1bpp Bitmap erstellen - das Bitmap-Standard in einem neuen Speicher ausgewählt DC ein 1x1 1bpp Bitmap ist - so jedes kompatible Bitmap Sie erstellen, die übereinstimmen. Welche neigt ganz in schwarz Ausgang führen.

Ihre Farbe Bitmap in in HSRC, so Verwendung , die dc die neue Bitmap zu machen.

Andere Tipps

Vielen Dank für die mir geholfen haben. Die Funktion funktioniert perfekt jetzt.

bool Bitmap::Crop(RECT cropArea)
{
HDC hSrc = CreateCompatibleDC(NULL);
SelectObject(hSrc, m_Handle);

HDC hNew = CreateCompatibleDC(hSrc);
HBITMAP hBmp = CreateCompatibleBitmap(hSrc, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top); 
HBITMAP hOld = (HBITMAP)SelectObject(hNew, hBmp);

bool retVal = (BitBlt(hNew, 0, 0, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top, hSrc, cropArea.left, cropArea.top, SRCCOPY))?true:false;

SelectObject(hNew, hOld);

DeleteDC(hSrc);
DeleteDC(hNew);

DeleteObject(m_Handle);

m_Handle = hBmp;

return retVal;
}

Zwei kleine Änderungen:

HBITMAP hBmp = CreateCompatibleBitmap(hNew, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top); 

BitBlt(hNew, 0, 0, cropArea.right - cropArea.left, cropArea.bottom - cropArea.top, hSrc, cropArea.left, cropArea.top, SRCCOPY); 

Sie könnten ein wenig mehr wollen Überprüfung sicherstellen, dass der angeforderte Bereich fällt in der Größe des ursprünglichen Bitmap.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top