Dialog - möchte Bitmap mit Transparents darstellen ?
-
Hallo,
ich bin MFC-Anfänger und würde gerne in meinem Picture-Steuerelement eine Bitmap zeigen bei der jedoch eine Farbe transparent dargestellt ist, ähnlich wie ein GIF-Format.
Geht das überhaupt und wenn ja würde ich mich über ein kleines Code-Beispiel sehr freuen.Mit freundlichen Grüßen
Bernd
-
Hi,
hat wirklich keiner eine Idee?
Ist die Frage zu banal oder zu schwierig?Hoffnungsvoll,
Bernd
-
beispiel kommt
allerdings sitzt die bitmap die ich zeichne nciht in einem control sondern ich mal sie dierekt auf den Hintergrund des DialogfeldesAufgabenstellung, es soll in (auf) einem Dialogfeld eine Bitmap angezeigt werden eine Farbe dieser Bitmap soll transparent sein. void COberflaechenEntwurf2Dlg::DrawBitmapWithTransparency(UINT ResourceID, int x, int y, int red, int green, int blue) { CBitmap Bild; Bild.LoadBitmap(ResourceID); int X = x; int Y = y; CClientDC dc( this ); BITMAP bm; //BITMAP-Struktur bm deklarieren //evtl. auch als Member-Variable Bild.GetObject( sizeof( bm ), &bm ); //Größe und Adresse von CBitmap Bild2 --> BITMAP bm CDC SpeicherDC; SpeicherDC.CreateCompatibleDC( &dc ); //SpeicherDC initialisieren SpeicherDC.SelectObject( & Bild ); //Bild2 --> Speicher CDC MaskDC; MaskDC.CreateCompatibleDC( &dc ); //MaskDC initialisieren CBitmap MaskBitmap; MaskBitmap.CreateBitmap( bm.bmWidth, bm.bmHeight, 1, 1, NULL ); MaskDC.SelectObject( &MaskBitmap ); SpeicherDC.SetBkColor( RGB( red, green, blue ) ); //Diese Farbe wird transparent dargestellt MaskDC.BitBlt( 0, 0, bm.bmWidth, bm.bmHeight, &SpeicherDC, 0, 0, SRCCOPY ); CDC OrDC; OrDC.CreateCompatibleDC( &dc ); CBitmap OrBitmap; OrBitmap.CreateCompatibleBitmap( &SpeicherDC, bm.bmWidth, bm.bmHeight ); OrDC.SelectObject( &OrBitmap ); OrDC.BitBlt( 0, 0, bm.bmWidth, bm.bmHeight, &SpeicherDC, 0, 0, SRCCOPY ); OrDC.BitBlt( 0, 0, bm.bmWidth, bm.bmHeight, &MaskDC, 0, 0, 0x220326 ); CDC TempDC; TempDC.CreateCompatibleDC( &dc ); CBitmap TempBitmap; TempBitmap.CreateCompatibleBitmap( &SpeicherDC, bm.bmWidth, bm.bmHeight ); TempDC.SelectObject( &TempBitmap ); TempDC.BitBlt( 0, 0, bm.bmWidth, bm.bmHeight, &dc, X, Y, SRCCOPY ); TempDC.BitBlt( 0, 0, bm.bmWidth, bm.bmHeight, &MaskDC, 0, 0, SRCAND ); TempDC.BitBlt( 0, 0, bm.bmWidth, bm.bmHeight, &OrDC, 0, 0, SRCPAINT ); dc.BitBlt( X, Y, bm.bmWidth, bm.bmHeight, &TempDC, 0, 0, SRCCOPY ); }
in ResourceID muss die ID einer BitmapResource übergeben werden
über x und y positioniert man die bitmap, (0,0 ist die obere linke ecke des Dialogfeldes)
red, green, blue übergibt man die Farbe (in RGB) die Transparent werden soll
die Methode muss (sollte) in der OnPaint methode des Dialogfeldes aufgerufen werden,
sonst verschwindet die bitmap bei jedem repaint des dialogfeldes.!!Die Bitmap wird NICHT gestreckt bzw gestaucht
code ist aus verschiedensten tuts zusammenkopiert
ach ja noch ein hinweis: du solltest bei der erstellung deiner bitmap einen bitgenauen editor verwenden, da einige editoren sich nicht so genau an den farbwert halten den sie gerade anzeigen (automatische transparenz zu vorherigen farbe) und dann natürlich die transparenz nciht funktioniert weil die pixelfarbe nciht passtteflon
-
Hallo teflon,
tausend Dank, ganz besonders für den kompletten und dokumentierten Code.
Ich würde diesen Beitrag gerne in den FAQ's sehen.Danke
Bernd