API das ImageWidth(#Image) entspricht

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

API das ImageWidth(#Image) entspricht

Beitrag von Josh »

Hi,

kann mir bitte wer sagen, wie ich per API die Breite und Höhe eines Images ermitteln kann. Hintergrund warum ich das brauche ist folgender:

Bei einem vorhandenen ButtonImageGadget kann ich mit GetGadgetAttribute das OS Handle des Images ermitteln. So weit ich weiß, gibt es ja noch immer keinen Weg um vom OS Handle zur #Image zu kommen.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: API das ImageWidth(#Image) entspricht

Beitrag von Kiffi »

Ohne Api:

Code: Alles auswählen

    myImage = GetGadgetAttribute(#myButtonImageGadget, #PB_Button_Image) 
    ImageGadget(#myImageGadget,0,0,0,0,myImage)
    HideGadget(#myImageGadget, #True)
    Debug GadgetWidth(#myImageGadget)
    Debug GadgetHeight(#myImageGadget)
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: API das ImageWidth(#Image) entspricht

Beitrag von Josh »

Danke Kiffi, hab es inzwischen selber gefunden. Es geht mit GetObject_. Da ich es nur Windows only brauche, scheint mir das die einfachere Lösung als den Umweg über ein extra Gadget.

Generell muss ich sagen, dass ich das extrem schwach von Purebasic finde, dass es keine Umkehrbefehle für ImageId, GadgetId etc. gibt, zumal ich mir nicht vorstellen kann, dass eine Implementierung ein riesen Aufwand wäre.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: API das ImageWidth(#Image) entspricht

Beitrag von Bisonte »

Josh hat geschrieben:Generell muss ich sagen, dass ich das extrem schwach von Purebasic finde, dass es keine Umkehrbefehle für ImageId, GadgetId etc. gibt, zumal ich mir nicht vorstellen kann, dass eine Implementierung ein riesen Aufwand wäre.
Wenn der Compiler sie nicht in der Objektliste hat, wie soll er die dann kennen ?

Wenn man das Image mit PB erstellt oder eingelesen hat, ist das kein Problem... dazu hat Danilo im Forum was gepostet (frag mich jetzt nich wo...)
GadgetID,WindowID,ToolbarID und StatusbarID lassen sich auch wieder in die ObjectNummern zurückverfrachten, WENN sie denn mit PB erstellt
wurden. (Code ist in RSBasic's WinAPI_Library zu finden)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: API das ImageWidth(#Image) entspricht

Beitrag von Josh »

Bisonte hat geschrieben:Wenn man das Image mit PB erstellt oder eingelesen hat, ist das kein Problem... dazu hat Danilo im Forum was gepostet (frag mich jetzt nich wo...)
Du meinst wahrscheinlich diesen Beitrag. Dazu habe ich folgende Fragen:

1) Import ""
Was wird da mit "" importiert?

2) ASM Code
Da ich ungern etwas verwende das ich nicht verstehe und keinen blassen Dunst von ASM habe, habe ich da ein wenig weiter gesucht und habe mir folgende Variante von Danilo's Code zusammengebastelt. Funktioniert ohne Probleme, aber vielleicht sieht jemand einen Fehler, den ich nicht bedacht habe.

Code: Alles auswählen

Import ""
    PB_Image_Objects
    PB_Object_EnumerateAll(*object,*callback,*d)
    PB_Object_EnumerateStart(*object)
    PB_Object_EnumerateNext(*object,*id.Integer)
    PB_Object_EnumerateAbort(*object)
    PB_Object_Count(*object)
EndImport

Procedure ImageFromImageID(ImageID)
    Protected id, result = -1

    PB_Object_EnumerateStart(PB_Image_Objects)
    While PB_Object_EnumerateNext(PB_Image_Objects,@id)
        If ImageID = ImageID(id)
            result = id
            PB_Object_EnumerateAbort(PB_Image_Objects)
            Break
        EndIf
    Wend
    ProcedureReturn result
EndProcedure



CreateImage(1,200,300)
CreateImage(2,100,150)
img = CreateImage(#PB_Any,123,456)

Debug ImageFromImageID( ImageID(1)   )
Debug ImageFromImageID( ImageID(2)   )
Debug ImageFromImageID( ImageID(img) )
Debug ImageFromImageID( 12 ) ; wrong, not PB ImageID
Danke
Josh
Zuletzt geändert von Josh am 08.11.2012 22:37, insgesamt 1-mal geändert.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: API das ImageWidth(#Image) entspricht

Beitrag von Regenduft »

Zu 1):

Sieht ganz so aus, als ob da PureBasic-Funktionen importiert werden, auf welche man so normaler Weise keinen Zugriff hat. Man könnte auch Funktionen importieren, auf welche man eh schon Zugriff hat, allerdings habe ich absolut keine Ahnung wie die genau "dekoriert" werden, außer dass sie ganz typisch mit "PB_" beginnen.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: API das ImageWidth(#Image) entspricht

Beitrag von Bisonte »

Soweit wie ich das verstanden habe, wird mit Import "" diejenigen Static Libs importiert, die die entsprechenden Funktionen enthalten (zumindest wenn sie PB-Static Libs sind wie Gadget.lib oder Window.lib)

Und bei deinem Beispiel lehn ich mich mal aus dem Fenster und sag : Sieht gut aus....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten