E
Die "GetDIBits(..)" habe ich nun doch noch hinbekommen, zumindest für meinen Zweck,
mit reinen 32 Bit Bitmaps.
Es lag mit daran, dass in der "BITMAP" Struktur die Zeilenlänge immer durch 2
teilbar sein muss. Der Vollständigkeit hier noch das Resultat:
int CEnBitmap::GetDIBits2( HDC hdc, HBITMAP hbm, UINT start, UINT cLines, LPVOID lpvBits, LPBITMAPINFO lpBmi, UINT usage )
{
BITMAP bm; GetBitmap(&bm);
DWORD dwBitmapImageSize = lpBmi->bmiHeader.biSizeImage;
RGBQUAD* pQud = (RGBQUAD*) malloc(sizeof(RGBQUAD)*dwBitmapImageSize/4);
RGBQUAD* pQudStart = pQud;
DWORD dwValueBytesLine = bm.bmWidthBytes;
if(bm.bmWidthBytes % 3 == 1)
dwValueBytesLine = bm.bmWidthBytes-1;
RGBTRIPLE* pTriLine = (RGBTRIPLE*) malloc(sizeof(char)*dwValueBytesLine);
// Transformation from 24 Bit (RGBTRIPLE) to 32 Bit (RGBQUAD)
for(int i=0; i<bm.bmHeight; i++){
CopyMemory((char*)pTriLine, (char*)bm.bmBits+(i*bm.bmWidthBytes), sizeof(RGBTRIPLE)*dwValueBytesLine/3);
for(int k=0; k<(dwValueBytesLine/3); k++){
(pQud+k)->rgbBlue = (pTriLine+k)->rgbtBlue;
(pQud+k)->rgbGreen = (pTriLine+k)->rgbtGreen;
(pQud+k)->rgbRed = (pTriLine+k)->rgbtRed;
(pQud+k)->rgbReserved = 0;
}
if(i < bm.bmHeight-1) pQud += (bm.bmWidth);
}
CopyMemory((RGBQUAD*)lpvBits, (RGBQUAD*)pQudStart, sizeof(RGBQUAD)*dwBitmapImageSize/4);
free(pTriLine);
free(pQudStart);
return cLines;
}
Seltsamerweise wurde mit den Original-Methoden mit einer negativen Höhe gerechnet,
wodurch die Grafiken mit meiner Methode plötzlich auf dem Kopf standen.
Das habe ich noch geändert, und die Grafiken waren wieder normal.
Aber vielleicht kann mir jemand mit der "SetDIBits(..)" noch weiterhelfen.
Hier habe ich momentan gar keinen Plan, was ich da machen muss!
Mit "SetBitmapBits(..)" hab ich es schon versucht. Bleibt alles schwarz.
Sie ist in folgende Umgebung eingebettet ( "CEnBitmap" ist in CodeProject zu finden! )
// set the bits
HDC hdc = GetDC(NULL);
HBITMAP hbmSrc = ::CreateCompatibleBitmap(hdc, sizeDest.cx, sizeDest.cy);
if (hbmSrc)
{
BITMAPINFO bi;
BITMAP bm;
bm = PrepareBitmapInfo32(bi, hbmSrc);
if (bm.bmHeight > 0)
{
//if (SetDIBits(hdc, hbmSrc, 0, sizeDest.cy, pDestPixels, &bi, DIB_RGB_COLORS))
if (SetBitmapBits(bi.bmiHeader.biSizeImage, (void*)pDestPixels))
{
// delete the bitmap and attach new
DeleteObject();
bRes = Attach(hbmSrc);
}
}
::ReleaseDC(NULL, hdc);
if (!bRes)
::DeleteObject(hbmSrc);
}
Grüsse
Helmut