Bild mit transparentem hintergrund über desktop legen
-
hallo allerseits !
gibt es eine möglichkeit, ein bild mit ransparentem hintergrund gewissermaßen "über" den desktop zu zeichnen?ich hatte versucht es so zu machen, wie man auf den dekstop schreibt, mit getdesktopwindow und getdc und gehofft, dass man dann irgendwie ein bild draufpacken könnte
dann versucht, das mit einer transparenten dialog-ressource mit picture-control zu machen ... aba da muss das bild doch auch wieder ein bmp sein?
und per google konnte ich bisher nur einen beitrag finden, in dem behauptet wurde, man müsse das bild in ein icon umwandeln...?also, weiß jemand, wie das funktioniert? bzw., ob es überhaupt funktioniert? :p
danke für jeden tipp!
-
Dafür musst du ein entsprechend geformtes PopUp-Fenster erstellen (SetWindowRegion())
-
hallo winregion!
danke, regions scheinen die antwort zu sein. doch wieder komme ich nicht weiter
mit setrectrgn() kann man scheinbar rechteckige regions erstellen. soll man nun den späteren transparenz-bereich des bildes mit tausend winzigen rechtecken ausfüllen? um so an die form der region zu kommen?
es müsste eine funktion geben, der ich mein bild gebe, und die dann anhand der pixelfarbe (oder ähnlich) eine rgndata-struktur erstellt?weiter verstehe ich die dokumentationen jedenfalls gerade nicht
-
radagast schrieb:
es müsste eine funktion geben, der ich mein bild gebe, und die dann anhand der pixelfarbe (oder ähnlich) eine rgndata-struktur erstellt?
Solch eine Funktion musst du dir selber schreiben: Mit GetDIBits() holst du dir die Pixel-Daten und untersuchst diese auf ein Bestimmte Farbe, die Später transparent sein soll. Für jeden nicht-transparenten Pixel fügst du der Aktuellen Region ein entsprechendes Rechteck hinzu (Union). Ist zwar sehr Rechenintensiv, aber dafür schnell implementiert – Die Funktion wird ja vermutlich nur einmal zu Programmstart ausgeführt(?).
-
hallo winregion!
danke abermals für deine hilfe. ich hätte nicht gedacht, dass diese art der "bildverarbeitung" so kompliziert ist :p
von was braucht getdibits bspw. noch einen device context, wenn ich anschließend den bitmap-handle übergebe? naja, wohl erstmal unwichtig, nur den rest verstehe ich auch nicht so richtig
das, was die funktion scannt, wird in LPBITMAPINFO lpbi, gespeichert? und die farben der einzelnen pixel in RGBQUAD bmiColors[1] jener struktur? ich müsste jetzt also den hintergrund meines bildes bspw. rot färben, als bmp speichern, dann getdibits aufrufen, dann dieses pixelarray nach der passenden farbe durchsuchen, und von den passenden pixeln dann irgendwie mit extcreateregion() die region erstellen?
-
Nein es geht einfacher. Du erzeugst eine Maske mit allen Bits in der Bitmap die eine bestimmte Farbe haben. Diese Maske benutzt Du dann für eine Raster-Operation.
Das Prinzip ist hier zu sehen, auch wenn es MFC ist, lässt es sich einfach auf die API-Funktionen überführen:
http://www.codeproject.com/KB/graphics/transbitmapmask.aspxOder dieser uralt Artikel:
http://www.codeguru.com/Cpp/G-M/bitmap/article.php/c1753