Fiesek Geschrieben 6. September 2002 Teilen Geschrieben 6. September 2002 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! GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
idefix Geschrieben 6. September 2002 Teilen Geschrieben 6. September 2002 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
idefix Geschrieben 6. September 2002 Teilen Geschrieben 6. September 2002 Nachtrag http://www.codeproject.com/bitmap/maskblt.asp Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 9. September 2002 Autor Teilen Geschrieben 9. September 2002 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. GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
idefix Geschrieben 9. September 2002 Teilen Geschrieben 9. September 2002 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 9. September 2002 Autor Teilen Geschrieben 9. September 2002 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: GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
idefix Geschrieben 9. September 2002 Teilen Geschrieben 9. September 2002 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) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
idefix Geschrieben 9. September 2002 Teilen Geschrieben 9. September 2002 Blödsinn, na klar wird es mit StrechtBlt auch funktionieren, aber die übergabe Parameter sorry Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 9. September 2002 Autor Teilen Geschrieben 9. September 2002 Sorry, what's koor? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 9. September 2002 Autor Teilen Geschrieben 9. September 2002 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? :( GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
idefix Geschrieben 9. September 2002 Teilen Geschrieben 9. September 2002 Koordinaten (sind eh immer Null) Ich wollte mal gerade das ausprobieren, was ich so schlaues von mir gegeben habe. CopyImage(....,LR_MONOCHROME) bedeutet doch schwarz/weiß welche Farbe sollst den nun sein? In dem beispiel sind die Bitmaps MONOCHROME Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 9. September 2002 Autor Teilen Geschrieben 9. September 2002 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* GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
idefix Geschrieben 9. September 2002 Teilen Geschrieben 9. September 2002 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 9. September 2002 Autor Teilen Geschrieben 9. September 2002 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! GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
idefix Geschrieben 9. September 2002 Teilen Geschrieben 9. September 2002 wo ist denn GetPixel(dcSrc,x,y); dcSrc=GetDC("hwndAppWin") also linke ober Ecke vom Window oder sehe ich das falsch? Ist da auch dcDes? oder sollte es besser GetPixel(dcSrcWork,x,y); lauten? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 9. September 2002 Autor Teilen Geschrieben 9. September 2002 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! GREETZ ******** * Fiesek * ******** P:S:: Hab ich mich eigentlich schon einmal für Deine Hilfe bedankt? wenn nicht dann DANKE :e@sy !!!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 9. September 2002 Autor Teilen Geschrieben 9. September 2002 Original geschrieben von idefix wo ist denn GetPixel(dcSrc,x,y); dcSrc=GetDC("hwndAppWin") also linke ober Ecke vom Window oder sehe ich das falsch? Ist da auch dcDes? oder sollte es besser GetPixel(dcSrcWork,x,y); lauten? Steht in der 2. Schleife. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
idefix Geschrieben 9. September 2002 Teilen Geschrieben 9. September 2002 Äh, nicht wo das steht sonder wo die Koor sind bzw. wessen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 10. September 2002 Autor Teilen Geschrieben 10. September 2002 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! GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 11. September 2002 Autor Teilen Geschrieben 11. September 2002 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! GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
idefix Geschrieben 12. September 2002 Teilen Geschrieben 12. September 2002 Brauchst du noch Hilfe? Ich habe noch mal in Beispielen gefroscht und etwas lauffähiges zusammen kopiert. Das Thema hat mich selber mal ziemlich beschäftig Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 12. September 2002 Autor Teilen Geschrieben 12. September 2002 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. GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
idefix Geschrieben 13. September 2002 Teilen Geschrieben 13. September 2002 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 13. September 2002 Autor Teilen Geschrieben 13. September 2002 WOW, da kann ich ja wieder ein bisschen studieren. Ich hab Dir eine PM mit meiner Adresse geschickt, ist die angekommen? GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 20. September 2002 Autor Teilen Geschrieben 20. September 2002 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. GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.