Seite 1 von 1

[gelöst] Icon aus Exe laden und Resizen

Verfasst: 18.03.2008 23:54
von scholly
moin, moin...

Gibt es einen einfacheren als den von mir gewählten Weg?

Code: Alles auswählen

PB_icon_img_id = ExtractIcon_(0,#PB_Compiler_Home+"PureBasic.exe",0)

OpenWindow(0,0,0,400,100,"get PB-Icon",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
  
ImageGadget(1, 10, 10, 16, 16, PB_icon_img_id) 
ImageGadget(2, 50, 10, 32, 32, PB_icon_img_id) 
ImageGadget(3, 90, 10, 48, 48, PB_icon_img_id) 

CreateImage(1,32,32)
DC=StartDrawing(ImageOutput(1))
  DrawIcon_(DC,0,0,PB_icon_img_id)
StopDrawing()
ImageGadget(4,210, 10, 32, 32, ImageID(1))

CreateImage(2,16,16)
CopyImage(1,2)
ResizeImage(2,16,16,#PB_Image_Smooth)
ImageGadget(5,260, 10, 16, 16, ImageID(2)) 

CreateImage(3,48,48)
CopyImage(1,3)
ResizeImage(3,48,48,#PB_Image_Smooth)
ImageGadget(6,290, 10, 48, 48, ImageID(3))
  
Repeat
Until WindowEvent()=#PB_Event_CloseWindow

End

Verfasst: 25.03.2008 02:47
von N00B
Leider krieg ich da keine vernünftige Schleife hin, die auch funzt :freak:

Habs es 1000 x gedreht und gewendet, aber ich krieg es nicht besser als Schleife gebacken.

Code: Alles auswählen

  PB_icon_img_id = ExtractIcon_(0,#PB_Compiler_Home+"PureBasic.exe",0)
  
  OpenWindow(0,0,0,400,100,"get PB-Icon",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  CreateGadgetList(WindowID(0))
  
  Loop_Max = 2
  BLA_1 = 100
  BLA_2 = 200
  BLA_3 = 300
  
  Loop_H_W = 16
  Loop_P_Vertical = 10
  
  Loop_P_Vertical_2 = 210
  
  For Bla_Bla = 0 To Loop_Max
    ImageGadget(BLA_1, Loop_P_Vertical, 10, Loop_H_W, Loop_H_W, PB_icon_img_id)
    CreateImage(BLA_1, Loop_H_W, Loop_H_W)
    
    ImageGadget(BLA_2,Loop_P_Vertical_2, 10, Loop_H_W, Loop_H_W, ImageID(BLA_1))
    
    ResizeImage(BLA_1, Loop_H_W, Loop_H_W,#PB_Image_Smooth)
    CopyImage(BLA_1,BLA_2)
    
    ImageGadget(BLA_3,Loop_P_Vertical_2, 10, Loop_H_W, Loop_H_W, ImageID(BLA_2))
    
    DC=StartDrawing(ImageOutput(BLA_1))
    DrawIcon_(DC,0,0,PB_icon_img_id)
    StopDrawing()
    
    
    BLA_1 = BLA_1 + 1
    BLA_2 = BLA_2 + 1
    BLA_3 = BLA_3 + 1
    
    Loop_H_W = Loop_H_W + 16
    Loop_P_Vertical = Loop_P_Vertical + 40
    
    
    Loop_P_Vertical_2 = Loop_H_W + Loop_P_Vertical_2
    
    
  Next
  
  Repeat
  Until WindowEvent()=#PB_Event_CloseWindow
  
  End
Das Problem ist der StartDrawing Abschnitt.


Ohne Schleife würde ich das so aufbauen, da geht das Copy & Paste schneller :mrgreen: und die GadgetID´s lassen sich schneller erhöhen und die ImageGadget´s kannst schon mal oben alle hinsetzen.

Code: Alles auswählen

PB_icon_img_id = ExtractIcon_(0,#PB_Compiler_Home+"PureBasic.exe",0)

OpenWindow(0,0,0,400,100,"get PB-Icon",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
 
ImageGadget(100, 10, 10, 16, 16, PB_icon_img_id)
ImageGadget(101, 50, 10, 32, 32, PB_icon_img_id)
ImageGadget(102, 90, 10, 48, 48, PB_icon_img_id)

CreateImage(100,32,32)
CreateImage(101,16,16)
CreateImage(102,48,48)

DC=StartDrawing(ImageOutput(100))
DrawIcon_(DC,0,0,PB_icon_img_id)
StopDrawing()

ImageGadget(199,210, 10, 32, 32, ImageID(100))



ResizeImage(100,16,16,#PB_Image_Smooth)
CopyImage(100,101)

ImageGadget(200,260, 10, 16, 16, ImageID(101))



ResizeImage(101,48,48,#PB_Image_Smooth)
CopyImage(101,102)

ImageGadget(201,290, 10, 48, 48, ImageID(102))
 
Repeat
Until WindowEvent()=#PB_Event_CloseWindow

End
Was ich übrigens sehr interessant finde ist, daß PB hier offensichtlich ein Problem hat, daß Erste Gadget muss anscheinend immer die ursprüngliche Icon Größe haben.(anders hat es um´s Verrecken nicht gefunzt, und ich schätze auch darum funzt die Schleife nicht)

Achte mal auf die ID´s und die H und W Werte

16 = 100
32 = 101
48 = 102

danach

32 = 100 <-- ?????
16 = 101
48 = 102

und danach wieder

32 = 100 <-- ?????
16 = 101
48 = 102


Code: Alles auswählen

ImageGadget(100, 10, 10, 16, 16, PB_icon_img_id)
ImageGadget(101, 50, 10, 32, 32, PB_icon_img_id)
ImageGadget(102, 90, 10, 48, 48, PB_icon_img_id)

CreateImage(100,32,32)
CreateImage(101,16,16)
CreateImage(102,48,48)

DC=StartDrawing(ImageOutput(100))
DrawIcon_(DC,0,0,PB_icon_img_id)
StopDrawing()

ImageGadget(199,210, 10, 32, 32, ImageID(100))



ResizeImage(100,16,16,#PB_Image_Smooth)
CopyImage(100,101)

ImageGadget(200,260, 10, 16, 16, ImageID(101))



ResizeImage(101,48,48,#PB_Image_Smooth)
CopyImage(101,102)

ImageGadget(201,290, 10, 48, 48, ImageID(102))



Verfasst: 25.03.2008 15:46
von scholly
Da hab ich wohl mal wieder die Frage flasch gestellt :(

Das Icon kann in verschiedenen Größen vorliegen, z.B. in PB mit 16x16, 32x32 und 48x48.
Mit ExtractIcon_() kommt man aber wohl nur an das 32er ran und muß dann in PB vergrößern/verkleinern.
Das würde ich mir eigentlich gern sparen, aber ich habe keinen Weg gefunden, die anderen Größen direkt zu laden.

Meine Hoffnung war nun, jemand würde mir diesen anderen Weg zeigen.

Verfasst: 25.03.2008 16:00
von Regenduft
Hab' da 'nen Codefetzen, den ich mal modifiziert hatte:

Code: Alles auswählen

Procedure.l ExeIconID(klein.b = 0)
  Protected *ExeName, DateiInfos.SHFILEINFO, SizeFlag.l
  
  ; Initialisieren und Speicher reservieren.
  *ExeName = AllocateMemory(255)
  GetModuleFileName_(0, *ExeName, 255)

  ; Icon-Größe wählen.
  If klein
    SizeFlag = #SHGFI_SMALLICON
  Else
    SizeFlag = #SHGFI_LARGEICON
  EndIf

  ; Icon-Handle ermitteln.
  SHGetFileInfo_(*ExeName, #Null, @DateiInfos.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | SizeFlag)

  ; Speicher freigeben.
  FreeMemory(*ExeName)

  ; Handle rückgeben.
  ProcedureReturn DateiInfos\hIcon

EndProcedure
Vielleicht mal noch die M$-Doku durchblättern... hoffe es hilft! Ist meine erste gepostete Antwort ;-)

Verfasst: 25.03.2008 16:09
von scholly
Regenduft hat geschrieben:PS: Wie funzt das nur mit dem cade-tag?!?
Das sag ich Dir erst, wenn aus Kinheit dann Kindheit geworden ist :lol: :lol: :lol:

Bei "BBCode in diesem Beitrag deaktivieren" den Haken wech...

Zurück zum Icon:
In deinem Code taucht ja auch wieder nur SMALLICON und LARGEICON auf, genauso wie bei ExtractIconEx_(). Das mag je eventuell zu richtigen Ergebnissen führen, wenn nur diese 3 Größen 16/32/48 in der .exe oder .ico drin sind, aber was, wenn mehr, z.B. wie in der shel32.dll drin sind ?

Verfasst: 25.03.2008 16:48
von ts-soft
Nimm LoadImage_ (API), vorher die Exe wie eine DLL laden :mrgreen:
Dann kannste die größe angeben, bzw. es auch Windows überlassen

Verfasst: 25.03.2008 20:31
von scholly
Hat zwar was gedauert, aber mit dem Ergebnis bin ich halbwegs zufrieden.
Zum Vergleich, was bei den verschiedenen Lade-Möglichkeiten 'rauskommt:

Code: Alles auswählen

OpenWindow(0,0,0,250,320,"get, resize, display PB-Icon",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
TextGadget(99,10,0,250,20,"wirklich vorhanden sind 16x16,32x32 und 48x48")

StartDrawing(WindowOutput(0))
  win_bg = Point(1,1)
StopDrawing()

;#########################################################################################
PB_icon_img_id = ExtractIcon_(0,#PB_Compiler_Home+"PureBasic.exe",0)
ImageGadget(1, 10, 40, 16, 16, PB_icon_img_id) 
ImageGadget(2, 50, 40, 32, 32, PB_icon_img_id) 
ImageGadget(3, 90, 40, 48, 48, PB_icon_img_id)
ImageGadget(4,150, 40, 64, 64, PB_icon_img_id)

;#########################################################################################

;#########################################################################################
PB_icon_img2_id = ExtractIcon_(2,#PB_Compiler_Home+"PureBasic.exe",0)

CreateImage(1,32,32)
CreateImage(2,16,16)
CreateImage(3,48,48)
CreateImage(4,64,64)

DC=StartDrawing(ImageOutput(1))
  DrawIcon_(DC,0,0,PB_icon_img2_id)
  FillArea(1, 1, -1, win_bg)
StopDrawing()

CopyImage(1,2)
CopyImage(1,3)
CopyImage(1,4)

ResizeImage(2,16,16,#PB_Image_Smooth)
ResizeImage(3,48,48,#PB_Image_Smooth)
ResizeImage(4,64,64,#PB_Image_Smooth)

ImageGadget(5, 50,100, 32, 32, ImageID(1))
ImageGadget(6, 10,100, 16, 16, ImageID(2)) 
ImageGadget(7, 90,100, 48, 48, ImageID(3))
ImageGadget(8,150,100, 64, 44, ImageID(4))
;######################################################################################### 

;#########################################################################################
Ergebnis = OpenLibrary(0, #PB_Compiler_Home+"PureBasic.exe")

ImageGadget( 9, 10,170, 16, 16, LoadImage_(Ergebnis,1, #IMAGE_ICON, 16, 16, LR_LOADTRANSPARENT)) 
ImageGadget(10, 50,170, 32, 32, LoadImage_(Ergebnis,1, #IMAGE_ICON, 32, 32, LR_LOADTRANSPARENT)) 
ImageGadget(11, 90,170, 48, 48, LoadImage_(Ergebnis,1, #IMAGE_ICON, 48, 48, LR_LOADTRANSPARENT)) 
ImageGadget(12,150,170, 64, 64, LoadImage_(Ergebnis,1, #IMAGE_ICON, 64, 64, LR_LOADTRANSPARENT)) 
;#########################################################################################

Repeat
Until WindowEvent()=#PB_Event_CloseWindow

End
Wenn wer noch ne Lösung hat, bitte hier reinstellen :)

Verfasst: 05.08.2008 05:08
von Hoto
ts-soft hat geschrieben:Nimm LoadImage_ (API), vorher die Exe wie eine DLL laden :mrgreen:
Dann kannste die größe angeben, bzw. es auch Windows überlassen
Kann es sein, dass man auf die Art nicht bei allen Dateien die Icons auslesen kann? Bei z.B. WMP "wmplayer.exe" funktioniert das bei mir irgendwie nicht.