Transparenz

Anfängerfragen zum Programmieren mit PureBasic.
walter741
Beiträge: 68
Registriert: 26.10.2008 09:21
Computerausstattung: P4, 2600, 1,5GB Ram, XP SP3
Wohnort: Wien

Transparenz

Beitrag von walter741 »

Hallo an alle Helfer in der Not

Sitze jetzt schon lange Zeit vor dem PC und durchforste dieses Forum.
Ich finde recht viel, lese recht viel und verstehe nichts.
Scheinbar bin ich zu doof dafür.

Ich lade ein Bild mit

LoadImage(22, GetGadgetItemText(#WE_ListIcon_1, GetGadgetState(#WE_ListIcon_1) , 1))

und zeige es mit

StartDrawing(WindowOutput(#Window_4))
DrawImage(ImageID(22), 60, 130 )
StopDrawing()

am Bildschirm an.

Das Bild ist ein bmp mit 100x60 Pixel
Da ist ein kleines Bild drauf. Der Hintergrund ist im Window-Grau.

Wird das Bild angezeigt so sehe ich nur das eigentliche Bild und der Hintergrung ist gleich dem Windows-Fenster.
Das Funktioniert alles sehr gut.

Wenn ich jetzt aber die Windows Darstellung zB auf Farbscheme Rosa umstelle, dann sieht man natürlich den gauen Hintergrund des Bildes.

Wie kann ich den Hintergrund Transparent machen.

Eine Idiotensichere Antwort wäre für mich vorteilhaft.

lg Walter
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

schau dir mal DrawAlphaImage() an... ;)

... um das dann korrekt transparent zu bekommen,
musst du allerdings das Image in der richtige Format ändern,
also in nem Bildbearbeiter* den Hintergrund auf transparent ändern und als PNG speichern.

(* z.B. http://photofiltre.free.fr/ )
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Beitrag von man-in-black »

naja, ich weis nicht, ob es was bringt,
aber du könntest auch gucken, welche Farbe das Fenster hat und das image dann mit fillarea() einfärben.

Dafür guckst du dir die Randfarbe des Images an und änderst sie jedesmal, wenn sich die Fensterfarbe ändert.

Code: Alles auswählen

...
if GetWindowColor(#Window) <> alte_fensterfarbe
  startdrawing(imageoutput(#Image))
     fillarea(1,1,-1,GetWindowColor(#Window))
  stopdrawing()
endif
...
muss aber wenn du es nimmst noch einiges anpassen,
doch damit dürften auch .bmp gehen. :allright:
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Hier eine Procedure von Mischa:

Code: Alles auswählen

Procedure DrawTransparentImage(TransImage.l, ZielImage.l, x.l, y.l, b.l, h.l, TransColor.l = #PB_Any) 
  Protected hdc.l, hzwischen.l, HdcTemp.l, obj.l, HdcBack.l, HdcObject.l, HdcMem.l, HdcSave.l
  Protected BmPAndBack.l, BmPAndObject.l, BmPAndMem.l, BmPSave.l, BmpBackOld.l, BmpObjectOld.l
  Protected BmpMemOld.l, BmpSaveOld.l, CColor.l, target.l
  
  ImageID(TransImage) : hdc = StartDrawing(ImageOutput(TransImage)) 
  hzwischen = CreateCompatibleBitmap_(hdc, b, h) : HdcTemp = CreateCompatibleDC_(hdc) 
  obj = SelectObject_(HdcTemp, hzwischen) : HdcBack = CreateCompatibleDC_(hdc) 
  HdcObject = CreateCompatibleDC_(hdc) : HdcMem = CreateCompatibleDC_(hdc) 
  HdcSave = CreateCompatibleDC_(hdc) : BmPAndBack = CreateBitmap_(b, h, 1, 1, 0) 
  BmPAndObject = CreateBitmap_(b, h, 1, 1, 0) : BmPAndMem = CreateCompatibleBitmap_(hdc, b, h) 
  BmPSave = CreateCompatibleBitmap_(hdc, b, h) : SetMapMode_(HdcTemp, GetMapMode_(hdc)) 
  BmpBackOld = SelectObject_(HdcBack, BmPAndBack) : BmpObjectOld = SelectObject_(HdcObject, BmPAndObject) 
  BmpMemOld = SelectObject_(HdcMem,BmPAndMem) : BmpSaveOld = SelectObject_(HdcSave, BmPSave) 
  SetStretchBltMode_(HdcTemp, #COLORONCOLOR) : StretchBlt_(HdcTemp, 0, 0, b, h, hdc, 0, 0, b, h, 13369376) 
  If TransColor = -1 : TransColor = GetPixel_(HdcTemp, (b - 1), 0) : EndIf 
  SetMapMode_(HdcTemp, GetMapMode_(hdc)) : BitBlt_(HdcSave, 0, 0, b, h, HdcTemp, 0, 0, $0CC0020) 
  CColor = SetBkColor_(HdcTemp, TransColor) : BitBlt_(HdcObject, 0, 0, b, h, HdcTemp, 0, 0, $0CC0020) 
  SetBkColor_(HdcTemp,RGB(255,255,255)) : Box(0, 0, b, h, GetSysColor_(#COLOR_BTNFACE))
  StopDrawing() : ImageID(ZielImage) : target = StartDrawing(ImageOutput(ZielImage)) 
  BitBlt_(HdcBack, 0, 0, b, h, HdcObject, 0, 0, $0330008) : BitBlt_(HdcMem, 0, 0, b, h, target, x, y, $0CC0020) 
  BitBlt_(HdcMem, 0, 0, b, h, HdcObject, 0, 0, $08800C6) : BitBlt_(HdcTemp, 0, 0, b, h, HdcBack, 0, 0, $08800C6) 
  BitBlt_(HdcMem, 0, 0, b, h, HdcTemp, 0, 0, $0EE0086) : BitBlt_(HdcTemp, 0, 0, b, h, HdcMem, 0, 0, $0CC0020) 
  BitBlt_(target, x, y, b, h, HdcTemp, 0, 0, $0CC0020) : StopDrawing() 
  DeleteObject_(obj) : DeleteObject_(BmpBackOld) : DeleteObject_(BmpObjectOld) : DeleteObject_(BmpMemOld) 
  DeleteObject_(BmpSaveOld) : DeleteDC_(HdcMem)  : DeleteDC_(HdcBack) : DeleteDC_(HdcObject) 
  DeleteDC_(HdcSave) : DeleteDC_(HdcTemp) : DeleteObject_(hzwischen) : DeleteObject_(BmPAndBack) 
  DeleteObject_(BmPAndObject) : DeleteObject_(BmPAndMem) : DeleteObject_(BmPSave) 
EndProcedure
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
walter741
Beiträge: 68
Registriert: 26.10.2008 09:21
Computerausstattung: P4, 2600, 1,5GB Ram, XP SP3
Wohnort: Wien

Beitrag von walter741 »

Ähhh Ja....

Danke für Eure Antworten und Codes.

Da bin ich die nächste Zeit mit Versuchen
eingedeckt.

Werde mal einiges testen.

Danke nochmals und einen schönen Abend noch!

lg Walter
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

walter741 hat geschrieben:Ähhh Ja....
... war auch mein erster Gedanke beim Anblick von Mischas Code... :mrgreen:

ist halt nicht nett formatiert und kommentiert...
das wird der Funktionalität aber wohl keinen Abbruch tun.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Kaeru Gaman hat geschrieben:
walter741 hat geschrieben:Ähhh Ja....
... war auch mein erster Gedanke beim Anblick von Mischas Code... :mrgreen:

ist halt nicht nett formatiert und kommentiert...
das wird der Funktionalität aber wohl keinen Abbruch tun.
Ich habe den Code schon nachformatiert, orginal sind die Variablen nicht
deklariert und es gibt keinerlei Spaces :mrgreen:
Trans- und Zielimage kann man ein und dasselbe nehmen, den letzten
parameter weglassen, dann sollte eigentlich jeder damit klarkommen :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
walter741
Beiträge: 68
Registriert: 26.10.2008 09:21
Computerausstattung: P4, 2600, 1,5GB Ram, XP SP3
Wohnort: Wien

Beitrag von walter741 »

Hallo

Dieses Ähhh Ja....

steht für den komplexen Code, den ich auch mit
optimaler Formatierung nicht sofort verstehen würde.

Ich bin ein Wochenendprogrammierer.
Mein derzeitiges Projekt hat erst 4.500 Codezeilen.
Ich werde noch einige Leben brauchen um Euch das Wasser reichen zu können.

Aber ich gebe sicher nicht auf und werde den Code von
Thomas testen.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

> Mein derzeitiges Projekt hat erst 4.500 Codezeilen.
Soo wenig ist das ja auch nicht.
Win11 x64 | PB 6.20
Antworten