Icon zoomen

Für allgemeine Fragen zur Programmierung mit PureBasic.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Icon zoomen

Beitrag 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 :)
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag 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.
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag 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 :(
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag von Lars »

Faszinierend :shock:
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag 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
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag 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 /:->
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag 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?
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag 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?
Antworten