Zum Inhalt springen

Transparente Bilder in GDI (c++)


Fiesek

Empfohlene Beiträge

Grüß Euch!

Ich hab folgendes Problem:

Hier ersteinmal die Syntax

BOOL CPictureDraw::CreateMask(HDC dcDest, HDC dcSrc, long nObjectWidth, long nObjectHeight, SIZE m_PictureSize,HBITMAP m_hBitmap, COLORREF clrKey)

{

	HBITMAP hBitmapMask;

	HDC dcSrcWork, dcDestWork;

	BITMAP bm;

	HBRUSH hBrush;

	RECT rc;


	hBitmapMask = (HBITMAP)CopyImage(m_hBitmap, IMAGE_BITMAP, 0, 0, LR_MONOCHROME);

	if(!hBitmapMask)

		return FALSE;


	GetObject(m_hBitmap, sizeof(bm), &bm);


	dcSrcWork=CreateCompatibleDC(NULL);

	dcDestWork=CreateCompatibleDC(dcSrc);


	SelectObject(dcSrcWork, m_hBitmap);

	SelectObject(dcDestWork, hBitmapMask);


	hBrush = CreateSolidBrush(RGB(0,0,0));


	for(unsigned int x=0; x<bm.bmWidth; x++)

	{

		for(unsigned int y=0; y<bm.bmHeight; y++)

		{

			COLORREF z=GetPixel(dcSrc,x,y);

			if(z != clrKey)

			{

				rc.left=x;

				rc.top=y;

				rc.right=x+1;

				rc.bottom=y+1;

				FillRect(dcDestWork, &rc, hBrush);

			}

		}

	}


	DeleteObject(hBrush);

	DeleteDC(dcSrcWork);

	DeleteDC(dcDestWork);

	HDC dcWork=CreateCompatibleDC(dcSrc);

	SelectObject(dcWork, hBitmapMask);


	::StretchBlt(dcDest, 0, 0, nObjectWidth, nObjectHeight, 

				 dcWork, 0, 0, m_PictureSize.cx, m_PictureSize.cy, SRCCOPY);


	DeleteDC(dcWork);

	return TRUE;

}

Diese Parameter werden mitgegeben:

- HDC dcDest = PaintDC

- HDC dcSrc = HDC

- long nObjectWidth = Objektbreite in Pixel

- long nObjectHeight = Objekthöhe in Pixel

- SIZE m_PictureSize = enthält die Größe des Orginalbildes

- HBITMAP m_hBitmap = ist das Orginalbild

- COLORREF clrKey = enthält die Farbe, die Transparent darzustellen ist.

Ich hab ein Problem schon mit der Wiedergabe der monochromen Maske.

Ich kopiere das Orginalbild mit dem Flag LR_MONOCHROME und habe dann eine komplett weiße Maske.

Dann lass ich in dieser Maske immer ein Pixel schwarz malen, wenn das vergleichbare Pixel sich in der Farbe nicht mit dem clrKey (die trasparent darzustellende Farbe) gleicht.

Wenn ich diese Maske daa gleich auf meinem Desktop wiedergeben will mit meinem dcDest (PaintDC) und die clrKey etwas anderes ist als RGB(255,255,255) ist die komplette Maske schwarz. :confused:

Wenn ich clrKey weiß ( RGB(255,255,255) ) wähle, dann kann ich die richtige Maske darstellen.

Wer kann mir bitte helfen?

Vieleicht seh ich ja das Programm vor lauter Code nicht! :D

:P GREETZ :P

********

* Fiesek *

********

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von idefix

FillRect würde ich durch SetPixel ersetzen, aber nur am Rande.

Aber warum benutzt du nicht SRCAND oder SRCERASE oder so anstelle von SRCCOPY

und läßt das Setzen von Hand bleiben?

StretchBlt übernimmt dann diese Arbeit.

Danke für die Antworten!

SetPixel unterstützt leider kein zeichnen auf Memory DC's. :(

Ich hab mal SRCCOPY genommen um mir auf meinem PaintDC das Ergebnis der Maskenbildung anschauen zu können. Im Normalfall würde ich zuerst die Maske mit MERGEPAINT und dann das Orginal mit SRCAND in den PaintDC zeichnen.

Aber die Maske bildet sich nicht so richtig wie sie soll!

Das einzige, was ich hinkriege ist weiß transparent zu zeichnen, alles andere will nicht so richtig.

:P GREETZ :P

********

* Fiesek *

********

Link zu diesem Kommentar
Auf anderen Seiten teilen

Verstehe nicht was du willst.

Irgendwie ist der Wurm drin.

Also bei einer beliebigen Bitmap soll eine Farbe aus maskiert werden, um

im Darstellenden DC tranparent (bzw nicht) gezeichtet zu werden. Habe ich

verstanden. Die Maskierungfarbe soll beliebig aber eine sein. I got it.

was ist dann

long nObjectWidth, long nObjectHeight, SIZE m_PictureSize

Welches Object und welches Picture (m_PictureSize which scope global,local,object?

vieleicht kleiner Dreher wird aber nicht das Problem sein)

Ach, jetzt verstehe ich den Rest erst. Nun soll die org. Bitmap auch noch

gestrecht werden. Findest du das nicht ein bißchen viel?

Strechten könnte man erstmal raus nehmen oder ? Nur um das Ganze

übersichtlicher zu machen. Ich habe den Verdacht dass die Koordinaten und Größe irgendwie

nicht stimmen.

Am Schluß:

SelectObject(dcWork, hBitmapMask);

::StretchBlt(dcDest, 0, 0, nObjectWidth, nObjectHeight,

dcWork, 0, 0, m_PictureSize.cx, m_PictureSize.cy,SRCCOPY);

Irgendwie fehlt mir der Zusammenhang zwischen der Größe hBitmapMask und m_PictureSize

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich muss hier ein Visualisierungobjekt für ein graphisches Steuerungs- und Projektierungswerkzeug (firmeneigen) schreiben.

Innerhalb des Objektes werden die Bilder dar gestellt.

m_PictureSize enthält die Orginalgröße des Bildes und nObjectWidth/-Height enthalten die Maße des Objectes, damit ich nachher das Bild auch auf die richtige Größe stretchen kann.

Du meinst also, es könnte am StretchBlt liegen?

Soll ich mal einfach nur BitBlt ausprobieren?

Ich hab es nun mittlerweile geschafft, eine korrekte Maske zu erstellen.

Das letzte Problem liegt im Kopierbefehl mit dem Attribut SRCAND, das will nicht wie ich es will.

Meine Maske zeigt weiße Pixel für muss gemalt werden und transparente Pixel für soll transparent bleiben, aber SRCAND will nicht! :(

Ob ich den Tag noch erlebe, an dem ich mein Objekt fertig stelle? :confused:

:P GREETZ :P

********

* Fiesek *

********

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke das es mit Strechtblt nicht funktioniert, aber koor und größe.

Vieleicht hilft dir ein Beispiel aus der MSDN

wenn du mit ShrinkBitmap in der MSDN suchen läßt (nicht Index)

erhälts du ein Sample.(reines Win32 API)

Hier werden Bitmaps in ein Popup Menü hinein kopiert

Vorher werden sie auf die richtige Größe gebracht

danach (besser wenn das Menü aufpoppt) werden die Bitmaps so

hinein kopiert das sie die bkcolor nicht veränderen. (Klingt ähnlich wie bei dir)

Wenn es weiter hilft, solltst du mal die grundfarbe der bitmaps im resource editor

ändern (org weiß auf rot oder so) und versuchen das sie wieder richtig erscheinen. Vieleicht

wird dann der Zusammenhang klarer. ( ist nur so'n gedanke hab's selber noch nicht

probiert)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Pass auf, ich hab hier folgendes kleines Mini-Bitmap erstellt:

3 Pixel breit und 3 Pixel hoch, in den Ecken schwarz inder Mitte rot und der Rest weiß.

Wenn ich weiß transparent zeichnen lassen will, geht das ohne mullen und knullen! ;)

Wenn ich schwarz transparent zeichnen lassen will, erstellt er mir noch die richtige Maske, aber er zeichnet dann trotzdem nur weiß transparent (verrückt, gell?) und wenn ich rot weg haben will ist die Maske schon fehlerhaft (koplett schwarz).

Ich krieg hier noch ne Meise, weil ich den Fehler einfach nicht finde.

Da kann mir auch kein Debugger helfen.

Es ist doch logisch OK, warum funzt denn das net? :( :( :(

:P GREETZ :P

********

* Fiesek *

********

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es ist am Ende ein weißes Bild auf einem Schwarzen Hintergrund!

Ich empfehle, es danach vor der Schleife mit einem 2. HBrush RGB(255,255,255) auszumalen, damit ist dann das Bild wirklich monochrome!

Andernfalls erhäst Du eine komplett schwarze Maske, wenn Du Schwarz transparent haben willst!

Teilweise finde ich es nicht mehr logisch!

Vieleicht liegt der Fehler ja auch woanders? *hoffend die Daumen drückend*

:P GREETZ :P

********

* Fiesek *

********

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also

Org bitmap sei 0,0,32,32 24 bit Farbtiefe (bei dir PictureSize )

Destination Size sei 0,0,64,64 (bei dir nObjectWidth, nObjectHeight)

hBitmapMask ist monochrom und 0,0,32,32 1bit farbtiefe (korrekt?)

bm wird dann 0,0,32,32 sein

dcSrcWork wird nicht weiter benutzt

SelectObject(dcSrcWork, m_hBitmap); warum? sehe nicht wofür

dcDestWork hier wird hBitmapMask selectiert

hBrush ist schwarz

dann werden die Pixel die nicht mit clrKey über einstimmen schwarz gesetzt. (waren sie vorher

weiß? wahrscheinlich)

dcWork ist mit hBitmapMask verheiratet (wie dcDestWork)

sterchtblt(dcDest // bildschirm ziel irgendwo

koor (0,0) größe 64,64

dcWork//hBitmapMask

koor (0,0),größe (32,32)? wenn Picture size gleich m_hBitmap bzw hBitmap

in worten: du kopierts und größerst eine s/w Bitmap in eine destination region bei der die größe nicht oder zufällig gewollt aber nicht garantiert anders ist als die

org. Bitmap. äh

Okay, angenommen bunter Adler auf weißen hintergund

clrKey=weiß;

Ergebnis schwarzer Adler auf weißen Grund oder?

wenn clrkey=grün

Ergebnis schwarzer Adler auf schwarzen Grund wenn bunt kein grün enthält

enthält bunt grün kann Strechtblt bei Verkleinerung alles schwarz machen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier nochmal die momentan aktuelle Syntax:

BOOL CPictureEx::CreateMask(HDC dcDest, HDC dcSrc, long nObjectWidth, long nObjectHeight, SIZE m_PictureSize,HBITMAP m_hBitmap, COLORREF clrKey)

{

	HBITMAP hBitmapMask;

	HDC dcSrcWork, dcDestWork;

	BITMAP bm;

	HBRUSH hBrush, hBrush2;

	RECT rc;


	hBitmapMask = (HBITMAP)CopyImage(m_hBitmap, IMAGE_BITMAP, 0, 0, LR_MONOCHROME);

	if(!hBitmapMask)

		return FALSE;


	GetObject(m_hBitmap, sizeof(bm), &bm);


	dcSrcWork=CreateCompatibleDC(NULL);

	dcDestWork=CreateCompatibleDC(dcSrc);


	SelectObject(dcSrcWork, m_hBitmap);

	SelectObject(dcDestWork, hBitmapMask);


	/*	// Nur zu Testzwecken!

	::StretchBlt(dcDest, 0, 0, nObjectWidth, nObjectHeight, 

				 dcDestWork, 0, 0, m_PictureSize.cx, m_PictureSize.cy, SRCCOPY);

	*/


	hBrush = CreateSolidBrush(RGB(0,0,0));

	hBrush2 = CreateSolidBrush(RGB(255,255,255));


	for(unsigned int x=0; x<bm.bmWidth; x++)

	{

		for(unsigned int y=0; y<bm.bmHeight; y++)

		{

			rc.left=x;

			rc.top=y;

			rc.right=x+1;

			rc.bottom=y+1;

			FillRect(dcDestWork, &rc, hBrush2);			

		}

	}

	for(x=0; x<bm.bmWidth; x++)

	{

		for(unsigned int y=0; y<bm.bmHeight; y++)

		{

			COLORREF z=GetPixel(dcSrc,x,y);

			if(z != clrKey)

			{

				rc.left=x;

				rc.top=y;

				rc.right=x+1;

				rc.bottom=y+1;

				FillRect(dcDestWork, &rc, hBrush);

			}

		}

	}


	DeleteObject(hBrush);

	DeleteObject(hBrush2);

	DeleteDC(dcSrcWork);


	// Nur zu Testzwecken

	/*

	::StretchBlt(dcDest, 0, 0, nObjectWidth, nObjectHeight, 

				 dcDestWork, 0, 0, m_PictureSize.cx, m_PictureSize.cy, SRCCOPY);//MERGEPAINT);

	*/

	DeleteDC(dcDestWork);

	TransStretchBlt(dcDest, dcSrc, nObjectWidth, nObjectHeight, m_PictureSize, m_hBitmap, hBitmapMask);

	return TRUE;

}


BOOL CPictureEx::TransStretchBlt(HDC dcDest, HDC dcSrc, long nObjectWidth, long nObjectHeight, 

								 SIZE m_PictureSize, HBITMAP m_hBitmap, HBITMAP hBitmapMask)

{

	HDC dcWork=CreateCompatibleDC(dcSrc);

	//SelectObject(dcWork, hBitmapMask);

	SelectObject(dcSrc, hBitmapMask);

	::StretchBlt(dcDest, 0, 0, nObjectWidth, nObjectHeight, 

				 dcSrc, 0, 0, m_PictureSize.cx, m_PictureSize.cy, SRCCOPY);//MERGEPAINT);

	/*

	SelectObject(dcSrc, m_hBitmap);

	::StretchBlt(dcDest, 0, 0, nObjectWidth, nObjectHeight,

				 dcSrc, 0, 0, m_PictureSize.cx, m_PictureSize.cy, SRCAND);

	*/

	DeleteDC(dcWork);

	return TRUE;

}

Die erste For-Schleife zeichnet die komplette Maske weiß, die zweite Schleife vergleicht dann die Bildpixel des Orginals mit dem clrKey!

:P GREETZ :P

********

* Fiesek *

********

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von idefix

Also

Org bitmap sei 0,0,32,32 24 bit Farbtiefe (bei dir PictureSize )

Destination Size sei 0,0,64,64 (bei dir nObjectWidth, nObjectHeight)

hBitmapMask ist monochrom und 0,0,32,32 1bit farbtiefe (korrekt?)

Jau

bm wird dann 0,0,32,32 sein

dcSrcWork wird nicht weiter benutzt

SelectObject(dcSrcWork, m_hBitmap); warum? sehe nicht wofür

Wird mit der neuen Syntax deutlich, den benutze ich zu Testzwecken, ist aber eigentlich unwichtig und verschwindet später.

dcDestWork hier wird hBitmapMask selectiert

hBrush ist schwarz

dann werden die Pixel die nicht mit clrKey über einstimmen schwarz gesetzt. (waren sie vorher

weiß? wahrscheinlich)

Die erste Version hat nicht gefunzt, deswegen hab ich die Maske komplet weiß gemacht, jetzt funzt das!

dcWork ist mit hBitmapMask verheiratet (wie dcDestWork)

sterchtblt(dcDest // bildschirm ziel irgendwo

koor (0,0) größe 64,64

dcWork//hBitmapMask

koor (0,0),größe (32,32)? wenn Picture size gleich m_hBitmap bzw hBitmap

dcDest ist der aktuelle PaintDC, der die Audgabe im Object und damit auch auf dem Bildschirm ermöglicht!

in worten: du kopierts und größerst eine s/w Bitmap in eine destination region bei der die größe nicht oder zufällig gewollt aber nicht garantiert anders ist als die

org. Bitmap. äh

Okay, angenommen bunter Adler auf weißen hintergund

clrKey=weiß;

Ergebnis schwarzer Adler auf weißen Grund oder?

wenn clrkey=grün

Ergebnis schwarzer Adler auf schwarzen Grund wenn bunt kein grün enthält

enthält bunt grün kann Strechtblt bei Verkleinerung alles schwarz machen.

Hm, Aus schwarz wird nachher weiß (MERGEPAINT) und das vorherige weiß verschwindet.

Da wo nun weiß ist kann per SRCAND überall gezeichnet werden, wo jeweils ein Pixel aktiv ist (logischers AND) und da wo kein Pixel aktiv ist zieht AND nicht!

So soll es funzen, tut es aber leider nicht!

:P GREETZ :P

********

* Fiesek *

********

P:S:: Hab ich mich eigentlich schon einmal für Deine Hilfe bedankt? wenn nicht dann DANKE :e@sy !!!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von idefix

Äh, nicht wo das steht

sonder wo die Koor sind bzw. wessen?

Nein, innerhalb des großen Desktops ist mein kleines Objekt, vergleichbar einem eigenen Fensterchen und in ihm ist dann 0,0.Der dcDest ist der PaintDC von eben diesem kleinen Objektfenster!

:P GREETZ :P

********

* Fiesek *

********

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin schon wieder ein Stück weiter!

Die Masken werden schonmal richtig erstellt und wiedergegeben!

Bevor man dem dcSrc ein neues Bitmap zuordnet, sollte man sich den alten Zustand des DC merken, und das könnte so aussehen:

HBITMAP hOldBitmap


hOldBitmap=(HBITMAP)SelectObject(dcDestWork, hBitmapMask);

Wenn man dann mit allen seinen Operationen auf diesem DC fertig ist, muss man ihm seinen alten Zustand wieder zuweisen, weil man sonst Objektleichen und Fehler produziert.

Ganz besonders witzig wird es, wenn man die oberen Programmteile mehrmals hintereinander ablaufen lässt wie es ein WM_PAINT verursacht.

Wenn ich das Ding zum Laufen bekommen hab, poste ich das Ergebnis!

:P GREETZ :P

********

* Fiesek *

********

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja. das wär super, Hilfe brauch ich noch!

Ich bin wie gesagt nun schon soweit, dass ich die Masken richtig zeichnen kann, aber die Transparenz auf den Orginalbildern will nicht, leider. :(

Hast Du was rausgefunden?

Ich hab schon Seitenweise Code studiert, aber so richtig gefressen hab ich das wohl noch nicht.

Wenn Du eine Lösung hättest wäre ich sehr begierig sie zu erfahren.

:P GREETZ :P

********

* Fiesek *

********

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich habe das Ganze einbißchen aufgeteilt

case WM_CREATE:

//Laden aus der Resource

g_OrgBitmap[0] =LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP1));

g_OrgBitmap[1] =LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP2));

//Monochrome Bitmap erstellen, mit der Maskierungsfarbe

g_MaskBitmap[0] =BitmapMask(g_OrgBitmap[0],RGB(255,255,255));

g_MaskBitmap[1] =BitmapMask(g_OrgBitmap[1],RGB(255,0,255));

//Neue Bitmap erstellen wobei die Bitmask schwarz ist

g_ResBitmap[0] =MaskBitmap(g_OrgBitmap[0],g_MaskBitmap[0]);

g_ResBitmap[1] =MaskBitmap(g_OrgBitmap[1],g_MaskBitmap[1]);

case WM_PAINT:

for(int i=0;i<BITMAPSIZE;i++)

{

//Original zeichen

DrawBitmap(hdc,g_OrgBitmap,10+i*200,10,48,48);

DrawBitmap(hdc,g_OrgBitmap,70+i*200,10,64,64);

//Mono Maskbitmap zeichen

DrawBitmap(hdc,g_MaskBitmap,10+i*200,80,48,48);

DrawBitmap(hdc,g_MaskBitmap,70+i*200,80,64,64);

//Color Maskbitmap zeichen

DrawBitmap(hdc,g_ResBitmap,10+i*200,160,48,48);

DrawBitmap(hdc,g_ResBitmap,70+i*200,160,64,64);

//Naja, Bitmap Transparent zeichnen

DrawBitmapTransparent(hdc,g_ResBitmap,g_MaskBitmap,10+i*200,240,48,48);

DrawBitmapTransparent(hdc,g_ResBitmap,g_MaskBitmap,70+i*200,240,64,64);

}

///////////////////////////////////////////////////////////////////

void DrawBitmap(HDC hdc,HBITMAP hBitmap,int x,int y,int cx,int cy)

{

HDC hdcMem;

BITMAP bm;

GetObject(hBitmap,sizeof(bm),&bm);

hdcMem= CreateCompatibleDC(hdc);

SelectObject(hdcMem,hBitmap);

StretchBlt(hdc,x,y,cx,cy,hdcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);

DeleteDC(hdcMem);

}

///////////////////////////////////////////////////////////////////

void DrawBitmapTransparent(HDC hdc,HBITMAP hBitmap,HBITMAP hMaskBitmap,int x,int y,int cx,int cy)

{

HDC hdcMem;

HDC hdcMask;

BITMAP bm;

GetObject(hBitmap,sizeof(bm),&bm);

hdcMem=CreateCompatibleDC(hdc);

SelectObject(hdcMem,hBitmap);

hdcMask=CreateCompatibleDC(hdc);

SelectObject(hdcMask,hMaskBitmap);

// 0x220326 >> MSDN suchen nach Ternary Raster Operations

// Die Table enthält alle ROP Werte die nicht mit Defines definiert sind

// Kopiere alle Pixel die nicht schwarz sind und invertiere diese zu schwarz

StretchBlt(hdc,x,y,cx,cy,hdcMask,0,0,bm.bmWidth,bm.bmHeight,0x220326);//D & ~S

//Da zeichnen wo schwarz ist

StretchBlt(hdc,x,y,cx,cy,hdcMem,0,0,bm.bmWidth,bm.bmHeight,SRCPAINT);// S|D

DeleteDC(hdcMem);

DeleteDC(hdcMask);

}

///////////////////////////////////////////////////////////////////

// Monochrome Bitmap erstellen

HBITMAP BitmapMask(HBITMAP hBitmap,COLORREF Color)

{

HDC hdcMem;

HDC hdcMask;

BITMAP bm;

HBITMAP hBitmapMask;

GetObject(hBitmap,sizeof(bm),&bm);

hdcMem=CreateCompatibleDC(NULL);

SelectObject(hdcMem,hBitmap);

hBitmapMask=CreateBitmap(bm.bmWidth,bm.bmHeight,1,1,NULL);

hdcMask=CreateCompatibleDC(NULL);

SelectObject(hdcMask,hBitmapMask);

//Der eigentliche Trick Hintergrundfarbe als Maske benutzen

// habe ich im Petzold gefunden war mir neu

SetBkColor(hdcMem,Color);

BitBlt(hdcMask,0,0,bm.bmWidth,bm.bmHeight,hdcMem,0,0,NOTSRCCOPY);

DeleteDC(hdcMem);

DeleteDC(hdcMask);

return hBitmapMask;

}

///////////////////////////////////////////////////////////////////

// Original Maskierungsfarbe durch schwarz ersetzen

HBITMAP MaskBitmap(HBITMAP hBitmap,HBITMAP hMaskBitmap)

{

HDC hdcMem;

HDC hdcMask;

BITMAP bm;

HBITMAP hBitmapMask;

GetObject(hBitmap,sizeof(bm),&bm);

hdcMem=CreateCompatibleDC(NULL);

hdcMask=CreateCompatibleDC(NULL);

hBitmapMask=

CreateBitmap(bm.bmWidth,bm.bmHeight,bm.bmPlanes,bm.bmBitsPixel,NULL);

SelectObject(hdcMask,hBitmapMask);

//Maske kopieren

SelectObject(hdcMem,hMaskBitmap);

BitBlt(hdcMask,0,0,bm.bmWidth,bm.bmHeight,hdcMem,0,0,SRCCOPY);

//Rest kopieren bis auf die Maskierung

SelectObject(hdcMem,hBitmap);

BitBlt(hdcMask,0,0,bm.bmWidth,bm.bmHeight,hdcMem,0,0,SRCAND);

DeleteDC(hdcMem);

DeleteDC(hdcMask);

return hBitmapMask;

}

Es läßt sich mit sicherheit einiges zusammenfassen

aber nun kann man die Entwicklung genau mit verfolgen

ich kann dir auch das ganze Projekt zusenden. Ich weiß nur nicht

wie

Ansonsten viel Spaß weiterhin

Link zu diesem Kommentar
Auf anderen Seiten teilen

Grüß Euch!

Endlich hab ich es geschafft eine ordentliche Transparenz innerhalb meines Objektes zu erzeugen.

Mit der normalen Windows GDI ist dies eine mögliche Lösung:

void DrawBitmapTransparent(HDC hdc,HBITMAP hBitmap,HBITMAP hMaskBitmap,int x,int y,int cx,int cy)

{

	HDC hdcMem;

	HDC hdcMask;

	BITMAP bm;


	GetObject(hBitmap,sizeof(bm),&bm);


	hdcMem=CreateCompatibleDC(hdc);

	SelectObject(hdcMem,hBitmap);


	hdcMask=CreateCompatibleDC(hdc);

	SelectObject(hdcMask,hMaskBitmap);


	// 0x220326 >> MSDN suchen nach Ternary Raster Operations

	// Die Table enthält alle ROP Werte die nicht mit Defines definiert sind

	// Kopiere alle Pixel die nicht schwarz sind und invertiere

	StretchBlt(hdc,x,y,cx,cy,hdcMask,0,0,bm.bmWidth,bm.bmHeight,0x220326);//D & ~S

	StretchBlt(hdc,x,y,cx,cy,hdcMem,0,0,bm.bmWidth,bm.bmHeight,SRCPAINT);// S|D


	DeleteDC(hdcMem);

	DeleteDC(hdcMask);

}

///////////////////////////////////////////////////////////////////

// Monochrome Bitmap erstellen

HBITMAP BitmapMask(HBITMAP hBitmap,COLORREF Color)

{

	HDC hdcMem;

	HDC hdcMask;

	BITMAP bm;

	HBITMAP hBitmapMask;


	GetObject(hBitmap,sizeof(bm),&bm);


	hdcMem=CreateCompatibleDC(NULL);

	SelectObject(hdcMem,hBitmap);


	hBitmapMask=CreateBitmap(bm.bmWidth,bm.bmHeight,1,1,NULL);

	hdcMask=CreateCompatibleDC(NULL);

	SelectObject(hdcMask,hBitmapMask);


	SetBkColor(hdcMem,Color);

	BitBlt(hdcMask,0,0,bm.bmWidth,bm.bmHeight,hdcMem,0,0,NOTSRCCOPY);


	DeleteDC(hdcMem);

	DeleteDC(hdcMask);


	return hBitmapMask;

}

///////////////////////////////////////////////////////////////////

// Original Maskierungsfarbe durch schwarz ersetzen

HBITMAP MaskBitmap(HBITMAP hBitmap,HBITMAP hMaskBitmap)

{

	HDC hdcMem;

	HDC hdcMask;

	BITMAP bm;

	HBITMAP hBitmapMask;


	GetObject(hBitmap,sizeof(bm),&bm);


	hdcMem=CreateCompatibleDC(NULL);


	hdcMask=CreateCompatibleDC(NULL);

	hBitmapMask=CreateBitmap(bm.bmWidth,bm.bmHeight,bm.bmPlanes,bm.bmBitsPixel,NULL);	

	SelectObject(hdcMask,hBitmapMask);


	//Maske kopieren

	SelectObject(hdcMem,hMaskBitmap);

	BitBlt(hdcMask,0,0,bm.bmWidth,bm.bmHeight,hdcMem,0,0,SRCCOPY);


	//Rest kopieren bis auf die Maskierung

	SelectObject(hdcMem,hBitmap);

	BitBlt(hdcMask,0,0,bm.bmWidth,bm.bmHeight,hdcMem,0,0,SRCAND);


	DeleteDC(hdcMem);

	DeleteDC(hdcMask);


	return hBitmapMask;

}

Bei weiteren Fragen einfach posten oder eine PM an mich.

Das wichtigste bei dem ganzen ist das richtige Handling der DC's.

:P GREETZ :P

********

* Fiesek *

********

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...