Seite 1 von 1

ImageGadget, nach Zuweisung eines Image dann FreeImage ok ?

Verfasst: 05.06.2020 20:53
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.

Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o

Verfasst: 05.06.2020 21:45
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.

Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o

Verfasst: 06.06.2020 02:15
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.

Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o

Verfasst: 06.06.2020 13:02
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

Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o

Verfasst: 06.06.2020 13:37
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

Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o

Verfasst: 06.06.2020 13:53
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

Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o

Verfasst: 06.06.2020 16:03
von mk-soft
Versuch mal die Übersetzung mit http://www.DeepL.com