ImageGadget, nach Zuweisung eines Image dann FreeImage ok ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

ImageGadget, nach Zuweisung eines Image dann FreeImage ok ?

Beitrag von hjbremer »

Guten Abend allerseits.

Weiß jemand ob ich nach einem SetGadgetState(dragImageGadget, ImageID(dragimagenr)) für ein ImageGadget

das Image mit FreeImage(dragimagenr) freigeben darf ?

Wird also so etwas wie eine eine Kopie erstellt für das ImageGadget oder muß das Image weiter existieren ?

Ich habe zumindest bis jetzt nach etwas Testen kein Problem festgestellt nach FreeImage, aber es würde mich
beruhigen wenn man FreeImage wirklich benutzen darf.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o

Beitrag von Shardik »

hjbremer hat geschrieben:Weiß jemand ob ich nach einem SetGadgetState(dragImageGadget, ImageID(dragimagenr)) für ein ImageGadget

das Image mit FreeImage(dragimagenr) freigeben darf ?
Dieselbe Frage wurde auch schon im englischen Forum gestellt, aber bisher nicht von offizieller Seite (von Fred oder freak) beantwortet. Mistrel und WilliamL scheinen bisher ebenfalls keine Probleme entdeckt zu haben, wenn sie ein Image mit FreeImage() nach einem SetGadgetState() freigaben.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o

Beitrag von STARGÅTE »

So ganz ist mir das auch nicht klar.
Allerdings kann man ja mit GetGadgetState() die ImageID aus dem Gadget "zurückholen"
und diese dann wie andere ImageIDs wieder nutzen (z.B. bei ImageGadget oder DrawImage()).

Löscht man das original Image jedoch vorher, ist diese ImageID ungültig und führt zu Fehlern:

Code: Alles auswählen

Enumeration
	#Window
	#Gadget1
	#Gadget2
	#Gadget3
	#Image
	#Image2
EndEnumeration

UsePNGImageDecoder()

LoadImage(#Image, #PB_Compiler_Home+"Examples\Sources\Data\world.png")

OpenWindow(#Window, 0, 0, 800, 450, "Vector Canvas Gadget", #PB_Window_MaximizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
Debug "ImageID(#Image) = "+ImageID(#Image)
ImageGadget(#Gadget1, 5, 5, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))
Debug "GetGadgetState(#Gadget1) = "+GetGadgetState(#Gadget1)

FreeImage(#Image) ; Kommentiere dies ein/aus

Debug "GetGadgetState(#Gadget1) = "+GetGadgetState(#Gadget1)
ImageGadget(#Gadget2, 55, 5, GadgetWidth(#Gadget1), GadgetHeight(#Gadget1), GetGadgetState(#Gadget1))
Debug "GetGadgetState(#Gadget2) = "+GetGadgetState(#Gadget2)

CreateImage(#Image2, 32, 32)
If StartDrawing(ImageOutput(#Image2))
	DrawImage(GetGadgetState(#Gadget1), 0, 0, 32, 32)
	StopDrawing()
EndIf
ImageGadget(#Gadget3, 105, 5, ImageWidth(#Image2), ImageHeight(#Image2), ImageID(#Image2))
Debug "GetGadgetState(#Gadget3) = "+GetGadgetState(#Gadget3)

Repeat
	
	Select WaitWindowEvent()
		
		Case #PB_Event_CloseWindow
			Break
		
	EndSelect
	
ForEver

End
Allerdings ist mir dann nicht ganz klar, wie das erste Gadget selbst trotzdem sein Bild beibehält.
Möglicherweise wird dieses doch noch zwischengespeichert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o

Beitrag von mk-soft »

Wie es aussieht verwendet Windows intern immer eine Kopie des Bildes für die Ausgabe (HDC)
Es ist aber immer noch die HBITMAP vom Image zugewiesen.

Code: Alles auswählen

;-TOP
Enumeration
   #Window
   #Gadget1
   #Gadget2
   #Gadget3
   #Image
   #Image2
EndEnumeration

UsePNGImageDecoder()

LoadImage(#Image, #PB_Compiler_Home+"Examples\Sources\Data\world.png")

OpenWindow(#Window, 0, 0, 800, 450, "Vector Canvas Gadget", #PB_Window_MaximizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
Debug "HBITMAP ImageID(#Image) = "+ImageID(#Image)
ImageGadget(#Gadget1, 5, 5, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))
Debug "HBITMAP GetGadgetState(#Gadget1) = "+GetGadgetState(#Gadget1)
Debug "HBITMAP #Gadget1 = " + SendMessage_(GadgetID(#Gadget1), #STM_GETIMAGE, #IMAGE_BITMAP, 0)

;FreeImage(#Image) ; Kommentiere dies ein/aus

Debug "HBITMAP GetGadgetState(#Gadget1) = "+GetGadgetState(#Gadget1)
ImageGadget(#Gadget2, 55, 5, GadgetWidth(#Gadget1), GadgetHeight(#Gadget1), GetGadgetState(#Gadget1))
Debug "HBITMAP GetGadgetState(#Gadget2) = "+GetGadgetState(#Gadget2)
Debug "HBITMAP #Gadget2 = " + SendMessage_(GadgetID(#Gadget2), #STM_GETIMAGE, #IMAGE_BITMAP, 0)

;hBitMap = GetGadgetState(#Gadget1)
hBitMap = SendMessage_(GadgetID(#Gadget1), #STM_GETIMAGE, #IMAGE_BITMAP, 0)
CreateImage(#Image2, 32, 32)
If StartDrawing(ImageOutput(#Image2))
   DrawImage(hBitMap, 0, 0, 32, 32)
   StopDrawing()
EndIf
ImageGadget(#Gadget3, 105, 5, ImageWidth(#Image2), ImageHeight(#Image2), ImageID(#Image2))
Debug "HBITMAP GetGadgetState(#Gadget3) = "+GetGadgetState(#Gadget3)
Debug "HBITMAP #Gadget3 = " + SendMessage_(GadgetID(#Gadget3), #STM_GETIMAGE, #IMAGE_BITMAP, 0)

If StartDrawing(ImageOutput(#Image))
   Box(0, 0, 32, 32, RGB(255,0,0))
   StopDrawing()
EndIf

SetGadgetState(#Gadget1, ImageID(#Image))

Repeat
   
   Select WaitWindowEvent()
      
      Case #PB_Event_CloseWindow
         Break
      
   EndSelect
   
ForEver

End
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o

Beitrag von mk-soft »

Habe jetzt ein wenig nachgelesen.

Es kann nach dem zuweisen der Image, wenn es nicht weiter gebraucht wird, gelöscht werden.
(Ausnahme bei XP: Images mit Alpha-Channel)

Siehe Important -> Link: https://docs.microsoft.com/en-us/window ... m-setimage
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o

Beitrag von hjbremer »

Dank an alle für die Antworten.

Ich denke entscheidend ist wozu man das Image braucht.

In meinem speziellem Fall wird es nur ein einziges mal gebraucht für das ImageGadget.
Beim nächsten Aufruf von CreateImage wäre das alte Bild mit FreeImage gelöscht worden.

Mir geht es vor allem um das Refresh des Windows. z.B. wenn das ImageGadget bewegt wird.

Hat das ImageGadget eine Kopie des Bildes braucht es beim Refresh das Original nicht.
Hat es aber keine Kopie war mein Gedanke, das Windows ev. das Original irgendwann brauchen könnte.

Ich habe nun etwas mehr getestet und in keinem Fall hat das ImageGadget das Bild verloren.

Das Problem ist halt das ich nirgends eine Info darüber gefunden habe ob man es löschen darf.

Vielen Dank für die Bemühungen. :allright:

Dank an mk-soft für den Link

Leider ist die Google Übersetzung ins Deutsche mäßig

Kann das jemand in verständlichen Worten übersetzen
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o

Beitrag von mk-soft »

Versuch mal die Übersetzung mit http://www.DeepL.com
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten