Hallo,
also…
zunächst mal, mit was programmierst du?
Wenn Visual C++ dann kannste weiterlesen
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: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:nPaint();
}
Werde mal schauen ob ich noch irgendwas finde.
Vielleicht hilft das ja shcon ein wenig…
freundlichst,
Sebastian Schneider