Hilfe bei BitBlt

EriFo

Erfahrenes Mitglied
Hallo miteinander ^_^

Ich würde gerne ein Bitmap zeichnen, was Transparente Bereiche hat.
Die Hilfethemen in der MSDN beiehen sich aber ausschliesslich auf API
Das in MFC-Source "umzuwandeln" währe ja fast kein Problem aber es gibt da ein paar Sachen die ich nicht vestehe.

Volgendes Beispiel asu der MSDN :

Code:
// Set up destination for monochrome blt. These are the default 
// values and may not need to be changed. They should also be 
// restored.
SetBkColor(hdcDest, RGB(255, 255, 255));    // 1s --> 0xFFFFFF
SetTextColor(hdcDest, RGB(0, 0, 0));        // 0s --> 0x000000

// Do the real work.
BitBlt(hdcDest, x, y, dx, dy, hdcMask, 0, 0, SRCAND);
BitBlt(hdcDest, x, y, dx, dy, hdcSrc, x0, y0, SRCPAINT);

Wo bekommen die den HDC der Bitmaps her oder und wie bekomme ich in der MFC den DC zu einem Bitmap ?!
Hat jemand sowas schonmal gemacht oder kann mir eine 2. Quelle empfehlen ?

M.f.G. Erik
 
Ein DC ist keine Eigenschaft eines Bitmaps. Vielmehr ist ein DC eine Art abstrakte Kapselung eines Zeichenoberfläche. Ein DC kann ein Speicherbereich sein, eine Bitmap, aber auch ein Drucker.
Ein DC hat neben Farbe, Hintergrundfarbe, Pen usw. auch eine BITMAP als "Eigenschaft".

Um an einen zweiten DC mit der BITMAP zu kommen, rufst du CreateCompatibleDC auf. Die Funktion gibt's in der API direkt und ist auch ein Member von CDC.

In dem kompatiblen, zweiten DC selektierst du die Bitmap als Bearbeitungsfläche mittels SelectObject. Dann kannst du BitBlt damit aufrufen.

Der Ordnung halber solltest du die alte Bitmap wieder in den DC reinselektieren, danach kannst du den DC deleten.

Würde so aussehen:

Code:
void OnDraw( CDC* pDC )
{

  CDC     dcBitmap;

  dcBitmap.CreateCompatibleDC( pDC );

  CBitmap*  pBmOld = dcBitmap.SelectObject( m_pMyBitmap );

  pDC->SetBkColor( RGB(255, 255, 255));    // 1s --> 0xFFFFFF
  pDC->SetTextColor( RGB(0, 0, 0));        // 0s --> 0x000000

  // Do the real work.
  pDC->BitBlt( x, y, dx, dy, &dcBitmap, 0, 0, SRCAND);
  pDC->BitBlt(hdcDest, x, y, dx, dy, &dcBitmap, x0, y0, SRCPAINT);  

  // und aufräumen
  dcBitmap.SelectObject( pBmOld );

  dcBitmap.DeleteDC();

}
 
Ich Dank dir vielmals.
Mit CReateCompatibleDC(..) hatte ich auch schon rumgebastelt aber es endete immer in einem Absturz. °-_-

Werd mal versuchenm durch dein Beispiel die Geheimnisse des DC zu ergründen >_<

M.f.G. Erik
 
Zurück