Seite 1 von 2

Icon zoomen

Verfasst: 03.09.2004 20:20
von CNESM
Hi,

ich hab mal echt ne doofe Frage, bekomme es aber nicht hin.

Ich möchte gern ein Icon, das in einem Imagegadget bereits dargestellt wird, in einen weiteren Imagegadet anzeigen, jedoch mit dem unterschied, das es im zweiten größer dargestellt wird (das ganze soll dann 32 * 10 = 320, also eine breite und Höhe von 320 Pixeln besitzen). Das Bild soll quasie gestreckt, gezoomt etc werden, wie ihr das auch nennen möchtet. Soll im Grunde genau so aussehen, wie im CodeArchiv Beispiel "Little_Magnifier.pb". Hier mal der kleine Ansatz. Alle meine Versuche haben zum Absturz von Purebasic geführt :(

Code: Alles auswählen

ImageGadget(86,141,100,32,32,ExtractIcon_(0,"C:\WINME\SYSTEM\shell32.dll",0))  
ResizeImage(......code]

Bitte helft mir :)

Verfasst: 03.09.2004 23:38
von Lars
Sorry, dass ich so etwas ganz doofes antworte:
Selber schreiben :wink:

Ein zoom sollte noch machbar sein, wenn du dich damit abfindest, dass es
halt ein wenig pixelig wird.

Verfasst: 04.09.2004 12:17
von CNESM
Hi,

das will ich ja gerade das es pixelig wird :)

Selber schreiben habe ich versucht und mit Bilder, die ich mittels LoadImage laden kann, ist das ja auch einfach möglich, doch bei Icons kracht mir Purebasic immer :(

Verfasst: 04.09.2004 12:25
von DarkDragon
Das ist das komische an PB und icons: Wenn man Icons mittels LoadImage lädt kann man sie nicht bearbeiten. Das wollte ich auch einmal machen, für ein Animiertes Systray Icon, doch ich hab es nie geschafft.

Verfasst: 04.09.2004 12:34
von Lars
Faszinierend :shock:

Verfasst: 04.09.2004 12:35
von CNESM
Hi,

hier mal die einfacher Erklärung:

Das erste zeigt das Laden eines Bildes, das zweite das Laden eines icons:

Code: Alles auswählen

Global asd.s

If OpenWindow(0,200,200,900,500,#PB_Window_SystemMenu,"Test") : Else : End : EndIf
If CreateGadgetList(WindowID()) : Else : End : EndIf

LoadImage(33,"D:\Projekte\12.bmp") 
ResizeImage(33,320,320) 
ImageGadget(86,0,0,32,32,UseImage(33)) 

asd=Str(ExtractIcon_(0,"C:\WINOWS\SYSTEM\shell32.dll",1))
ResizeImage(asd,320,320) 
ImageGadget(87,400,0,32,32,asd) 

Repeat
   EventID.l = WindowEvent()
   Delay(10)
Until EventID=#PB_EventCloseWindow
;
End

Verfasst: 04.09.2004 12:45
von Lars
Dass dieser Code nicht funktioniert, verwundert nicht.

Ich gehe davon aus, du hast dein Windows nicht in "C:\WINOWS"
installiert.

Desweiteren hast du asd als String deklariert und füllst ihn mit der String
ausgabe des Handles des Icons. Wo soll das hin führen?

Was du bei ResizeImage() brauchst, ist die PB-Interne #ID und die
bekommst du nicht von einem API Handle, daran scheitert es schon. Ich
vermute, du musst dann aller mit Api machen /:->

Verfasst: 04.09.2004 12:52
von CNESM
Hi,
Dass dieser Code nicht funktioniert, verwundert nicht.

Ich gehe davon aus, du hast dein Windows nicht in "C:\WINOWS"
installiert.
Daran liegts net, da das eigentlich auch nicht der Originalcode ist, nur schnell runter geschrieben. Auch mit richtiger Pfadangabe keine Besserung.
Desweiteren hast du asd als String deklariert und füllst ihn mit der String
ausgabe des Handles des Icons. Wo soll das hin führen?

Was du bei ResizeImage() brauchst, ist die PB-Interne #ID und die
bekommst du nicht von einem API Handle, daran scheitert es schon. Ich
vermute, du musst dann aller mit Api machen
Erstmal: Ich habe keine Ahnung von Handle, ID, String, Long usw. Ich probiere so lange rum, setze $,&,.l,.s etc., bis das dann irgendwie geht. Was ich da mache, weiss ich net :D

Bin ja generell der Meinung, das diese ImageID Kram der größte Kack ist. Warum wird nicht generell auf Handle umgestellt? so gäbs keine Probleme. Wie soll das denn bitte mit API aussehen?

Verfasst: 04.09.2004 13:20
von DarkDragon
>Bin ja generell der Meinung, das diese ImageID Kram der größte Kack ist. Warum wird nicht generell auf Handle umgestellt? so gäbs keine Probleme. Wie soll das denn bitte mit API aussehen?

Ich denke mir dass wenn man komplett auf WinAPI Handles umsteigt der Linux kram wieder nicht funktioniert ;) . Wenn du willst kann ich dir im ICQ mal Handles und so Beibringen. Meistens liefert die WinAPI keine Strings zurück sondern nur Pointer auf Strings. Außerdem solltest du auch nur Strings durch Pointer übergeben, da es schneller ist.

So geht es hier:

Code: Alles auswählen

Global asd

If OpenWindow(0,200,200,900,500,#PB_Window_SystemMenu,"Test") : Else : End : EndIf

File.s = "C:\WINDOWS\system32\shell32.dll"

asd = ExtractIcon_(0,@File.s,1)

Width = 32
Height = 32

hDC = GetDC_(WindowID())

Repeat
   DrawIconEx_(hDC, 0, 0, asd, Width, Height, 0, 0, $2)
   EventID.l = WindowEvent()
   Delay(10)
Until EventID=#PB_EventCloseWindow
ReleaseDC_(WindowID(), hDC)
End

Verfasst: 04.09.2004 13:31
von CNESM
Hi,

danke :) Werde mal schauen, welche ich nun verwende. Finde es aber toll, das du so schnell geholfen hast :) und auf die Hilfe, mir da mal alles zu erklären, komme ich gerne zurück :)

Da ich wusste, das das gehen muss, hab ich nochmal ein bissle rumprovbiert und siehe da, ohne weitere API sogar mit PB möglich:

Code: Alles auswählen

Global IconS

If OpenWindow(0,200,200,900,500,#PB_Window_SystemMenu,"Loupe") : Else : End : EndIf
If CreateGadgetList(WindowID()) : Else : End : EndIf

LoadImage(33,"D:\Projekte\Nacasi\button\button\Symboldateien\12.bmp") 
ResizeImage(33,320,320) 
ImageGadget(86,0,0,32,32,UseImage(33)) 

IconS=ExtractIcon_(0,"C:\WINDOWS\SYSTEM\shell32.dll",2)


hImg = CreateImage(120,320,320) ;321
StartDrawing(ImageOutput()) 
Box(0, 0, 321,321,RGB(255,255,255))   
DrawImage(IconS,0,0,320,320) 
StopDrawing() 

ImageGadget(2,340,0,320,320,hImg)

Repeat
   EventID.l = WindowEvent()
   Delay(10)
Until EventID=#PB_EventCloseWindow
;
End
ich spreche mich hierfür für eine Funktion ala:

LoadIcon(1,Pfad,Iconummer)

aus, wleche auch unter Linux und AmigoOS laufen sollte :)

Deine Methode scheint schneller zu laufen, dennoch würde ich gerne so wenig API wie möglich verwenden. Ist es denn möglich meine Methode noch etwas schneller zu machen?