MFC Transparente Bitmap

Hi,

Also, ich bin neu in C++ und MFC.
Bin aber über die grösste Anfängerhürde gesprungen und habe nun mein Programm welches auf eine MySQL DB im Netz zugreift.

Nun mein momentantes Problem/Hinderniss:
Ich möchte ein Logo in mein Dialogfenster einfügen. Das geht ja auch,
aber ich möchte den Hintergrund transparent. So wie ich das sehe, müsste man Weiss irgendwie als Transparent wählen können (da Weiss die Hintergrundfarbe ist).

Danke für die Hilfe!

Hallo,

also…
zunächst mal, mit was programmierst du?
Wenn Visual C++ dann kannste weiterlesen :wink:
Also es gibt da mehrere Möglichkeiten.
Wenn ich dich richtig verstehe willst du ein bitmap mit teilweise transparenten Feldern in eine Dialoganwendung zeichnen.

Nun zunächst mal, gibt es soweit es mir bekannt ist,
in Bitmaps keinen vordefinierten Farbsatz für Transparenz.
Nun gibt es dennoch verschiedene Möglichkeiten:

-Falls dein Logo klein ist,
kannst du dir überlegen ob du es als Icon speicherst.
Das geht ganz normal über den Editor.
Bei Icons hast du den Vorteil dass es im Editor in der Farbpalette eine Farbe für Transparenz gibt.
Nachteil ist die geringe Auflösung mit standardmäßigen 32x32Pixel ( die sich allerdings noch ein wenig hochschrauben läst).

-eine weitere recht unschöne aber manchmal erfolgreiche MEthode ist das Täuschen…
Du änderst dein Bitmap insofern, als dass du mit irgendeinem Grafikprogramm(MS Paint sollte es hier schon tun) per Screenshot den zu überlegenden, transparent erscheinen sollenden Hintergrund in dein Bitmap einarbeitest.
Aber wie gesagt, dies ist eher die uneleganteste Variante.

-Die korrekte Vorgehensweise ist mit Masken zu arbeiten.
Ich selbst habe dis bisher nur in regulären SDI Anwendungen ausprobiert, es sollte allerdings kein Problem sein das auf die Dialogebene umzubiegen.
Folgendes Beispiel sollte das Prinzip verständlich machen:

/////////////////////////////////////////////////
void CBeispielDlg::open_mouth:nPaint()
{

//…hier kommt Vorarbeit…
//Bild als CBitmap-Objekt abgelegt
//Transparente Bitmap-Darstellung:
// (Maskiert wird RGB(0,0,0)
BITMAP bm; //BITMAP-Struktur bm deklarieren
Bild.GetObject(sizeof(bm),&bm);
//Größe und Adresse von CBitmap Bild --> BITMAP bm

CDC SpeicherDC;
SpeicherDC.CreateCompatibleDC(pDC); //SpeicherDC initialisieren
CBitmap *pOldImageBitmap = SpeicherDC.SelectObject(&Bild); //Bild --> Speicher

CDC MaskDC;
MaskDC.CreateCompatibleDC(pDC); //MaskDC initialisieren

CBitmap MaskBitmap;
MaskBitmap.CreateBitmap( bm.bmWidth, bm.bmHeight, 1, 1, NULL );
CBitmap *pOldMaskBitmap = MaskDC.SelectObject( &MaskBitmap );

SpeicherDC.SetBkColor( RGB(0,0,0) );
MaskDC.BitBlt( 0, 0, bm.bmWidth, bm.bmHeight, &SpeicherDC, 0, 0, SRCCOPY );

CDC OrDC;
OrDC.CreateCompatibleDC( pDC );

CBitmap OrBitmap;
OrBitmap.CreateCompatibleBitmap( &SpeicherDC, bm.bmWidth, bm.bmHeight );
CBitmap *pOldOrBitmap = 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( pDC );

CBitmap TempBitmap;
TempBitmap.CreateCompatibleBitmap( &SpeicherDC, bm.bmWidth, bm.bmHeight );
CBitmap *pOldTempBitmap = TempDC.SelectObject( &TempBitmap );

TempDC.BitBlt( 0, 0, bm.bmWidth, bm.bmHeight, pDC, 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 );

pDC->BitBlt( X, Y, bm.bmWidth, bm.bmHeight, &TempDC, 0, 0, SRCCOPY );

TempDC.SelectObject( pOldTempBitmap );
OrDC.SelectObject( pOldOrBitmap );
MaskDC.SelectObject( pOldMaskBitmap );
SpeicherDC.SelectObject( pOldImageBitmap );
CDialog::open_mouth:nPaint();
}

Werde mal schauen ob ich noch irgendwas finde.
Vielleicht hilft das ja shcon ein wenig…

freundlichst,
Sebastian Schneider

Hallo,

also…
zunächst mal, mit was programmierst du?
Wenn Visual C++ dann kannste weiterlesen :wink:

Nachdem MFC nur mit Visual C++ geht, hat er wohl nicht großartig viele andere Möglichkeiten :wink:

-Die korrekte Vorgehensweise ist mit Masken zu arbeiten.
Ich selbst habe dis bisher nur in regulären SDI Anwendungen
ausprobiert, es sollte allerdings kein Problem sein das auf
die Dialogebene umzubiegen.
Folgendes Beispiel sollte das Prinzip verständlich machen:

[ganz viel code]

Ok, man kanns sich ja auch Umständlich machen, wenns einfach gehen würde.
Ich wäre eher dafür du besorgst dir die CxImage Klassen (Kostenlos, selbst für Kommerzielle Produkte - http://www.codeproject.com/bitmap/cximage.asp) und zeichnest einfach ein PNG-Image mit Transparenter Ebene hin :wink:

Das mit der Transparenz selbst ist dann noch so ne eigene Sache … die Fenster in Windows kennen nicht wirklich soetwas. Um z.B. einen Hintergrund zu machen, der über den gesamten Dialog geht, kannst du dir entweder Parent Device Context holen und den bei dir als „Hintergrund“ zeichnen oder im Dialog ein Bitmap definieren und beim Zeichnen den Bereich deines Steuerelements ausfüllen :smile:
(ich glaub spätestens jetzt kapierts keiner mehr :smiley:)

bye,
Christoph