Shell32.dll: Icons darstellen und drucken

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag von sibru »

hiermit geht´s:

Code: Alles auswählen

;Modul      Icon2Image Version 1.07 vom 21.04.2008
;#PB_Vers = "4.20"
;
;Funktion:  Umformung Icon --> PB-Image
;           Ein Icon -z.Bsp. von LoadIcon_() oder ExtractIconEx_()- wird zu
;           einem PB-Image umgesetzt und die #ImageNr des neuen Images wird
;           zurückgeliefert.
;
;Aufruf:    ImageNr = Icon2Image(IconID {,HG_Farbe})
;           IconID:   Handle des umzusetzenden Quell-Icon´s
;           HG_Farbe: Hintergrund-Farbe für transparente Icon´s, wenn nicht
;                     angegeben, so wird FensterRahmen-Farbe benutzt
;           
;           Diese Funktion liefert die #ImageNr des erzeugten PB-Images oder
;           0, wenn ein ungültiges Icon übergeben wurde.
;

;#jaPBeExt exit
Procedure Icon2Image(IconID, HG_Col = - 1)
  Protected IconBr, IconHo, IconInfo.ICONINFO
  Protected ImgNr, ImgID, ImgHDC
  If GetIconInfo_(IconID, @IconInfo)  ;check Icon & get IconSize:
    IconBr = IconInfo\xHotspot * 2
    IconHo = IconInfo\yHotspot * 2
    ImgNr = CreateImage(#PB_Any, IconBr, IconHo)
    ImgHDC = StartDrawing(ImageOutput(ImgNr))
    If HG_Col<0 : HG_Col = GetSysColor_(#COLOR_3DFACE): EndIf
    Box(0, 0, IconBr, IconHo, HG_Col)
    #DI_NORMAL = 3
    DrawIconEx_(ImgHDC, 0, 0, IconID, IconBr, IconHo, 0, 0, #DI_NORMAL)
    StopDrawing()
  EndIf
  ProcedureReturn ImgNr
EndProcedure
Bild Bild
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Das Ausdrucken funktioniert schon. Du müsstest wegen dem Event den Button schon länger fest halten. Dann kommt auch der Printerrequester.

Ich habe den Code etwas abgeändert. Damit reagiert Dein Button zum
Drucken besser. Für die fehlenden Bilder musst Du dir schon was einfallen lassen.


Code: Alles auswählen

#window = 0
#button = 555

kmax = 30 ;(die ersten 30 Icons aus shell32.dll)

OpenWindow(#window, 0 , 0 , 700 , 460 , "Icons" , #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

scroll_y = (kmax/4) * 70
ScrollAreaGadget(#PB_Any, 10, 25, 680, 430, 648, scroll_y, 100)
ButtonGadget(#button, 590, scroll_y-20, 50, 20, "Drucken")
           
For k = 0 To kmax
   x_pos = 30 + 100*(k%6)
   y_pos = 20 + 100*(k/6)
   hIcon.l = 0
   ExtractIconEx_("shell32.dll",k,@hIcon,0,1)
   ImageGadget(k, x_pos, y_pos, 32, 32, hIcon, 0)
   TextGadget(#PB_Any, x_pos + 7, y_pos +40, 20, 20, Str(k))
Next

LoadFont(0, "Arial",44)

Repeat

Event = WaitWindowEvent()
 
Select Event
  Case #PB_Event_Gadget
  Select EventGadget()
    Case #button
        If PrintRequester()
          If StartPrinting("Icon-Druck")
             
             If StartDrawing(PrinterOutput())
                For k = 0 To kmax
                   ;nach 20 Bildern neue Seite anfangen
                    If k%20 = 0 And k>0
                      NewPrinterPage()
                    EndIf     
                    x_pos = 500 + 24*45*(k%4)
                    y_pos = 200 + 24*55*((k/4) - 5*(k/20)) 
                    ExtractIconEx_("shell32.dll",k,@hIcon,0,1)   
                    DrawImage(hIcon, x_pos, y_pos , 1000, 1000)
                    DrawingFont(FontID(0))
                    DrawText(x_pos, y_pos + 520, Str(k))
                 Next
                 StopDrawing()
             EndIf
             StopPrinting()
          EndIf     
        EndIf
    EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow  
Bild
Win11 Pro 64-Bit, PB_6.11b1
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Beitrag von Andi »

Das Drucken von Icons scheint etwas schwierig zu sein (vielleicht sogar überhaupt nicht möglich?). Ich komme mit den Befehlen

Code: Alles auswählen

ExtractIconEx_() bzw. LoadImage_()
StartDrawing(PrinterOutput())
DrawImage() bzw. DrawIcon_()/DrawIconEx_() 
leider nicht zum Ziel
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
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 »

Warum nutzt Du nicht die Procedure von sibru?
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
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Beitrag von Andi »

Aber sibrus Code beinhaltet doch keine Ausgabe auf dem Drucker: StartDrawing(ImageOutput(ImgNr)). Ich habe die Zeile natürlich abgeändert, aber gedruckt wurde nichts.
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
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 »

sibrus code wandelt auch nur das icon zum image!
das image kannste dann auch ausdrucken :wink:
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
Andi
Beiträge: 79
Registriert: 27.05.2008 17:29
Wohnort: Berlin

Beitrag von Andi »

Danke, ts-soft! Jetzt klappt es! Ich hatte nicht erkannt, dass es bei sibrus Prozedur um eine Umwandlung icon->image ging und die Druckoption noch nicht enthalten ist. :oops:
PB + B4X = greatest tools on earth
Win 10 | PB 5.72
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

Andi hat geschrieben:Danke, ts-soft! Jetzt klappt es! Ich hatte nicht erkannt, dass es bei sibrus Prozedur um eine Umwandlung icon->image ging und die Druckoption noch nicht enthalten ist. :oops:
dabei stehts doch da:

Code: Alles auswählen

;Funktion:  Umformung Icon --> PB-Image 
Passiert eben jedem mal :wink:
Win11 x64 | PB 6.20
Antworten