[gelöst] Icon aus Exe laden und Resizen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

[gelöst] Icon aus Exe laden und Resizen

Beitrag 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
Zuletzt geändert von scholly am 17.05.2008 14:37, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
N00B
Beiträge: 122
Registriert: 11.07.2007 22:28

Beitrag 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))


Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Beitrag 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 ;-)
Zuletzt geändert von Regenduft am 25.03.2008 16:19, insgesamt 1-mal geändert.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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 ?
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag 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 :)
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

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