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.
ImageGadget, nach Zuweisung eines Image dann FreeImage ok ?
- hjbremer
- Beiträge: 822
- Registriert: 27.02.2006 22:30
- Computerausstattung: von gestern
- Wohnort: Neumünster
ImageGadget, nach Zuweisung eines Image dann FreeImage ok ?
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
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o
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.hjbremer hat geschrieben:Weiß jemand ob ich nach einem SetGadgetState(dragImageGadget, ImageID(dragimagenr)) für ein ImageGadget
das Image mit FreeImage(dragimagenr) freigeben darf ?
Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o
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:
Allerdings ist mir dann nicht ganz klar, wie das erste Gadget selbst trotzdem sein Bild beibehält.
Möglicherweise wird dieses doch noch zwischengespeichert.
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
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o
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.
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o
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
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- 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
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.
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
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.
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
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Re: ImageGadget, nach Zuweisung eines Image dann FreeImage o
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive