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 Dialogfeldes

    Aufgabenstellung, 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 passt

    teflon



  • 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


Anmelden zum Antworten