ExplorerListGadget & Images Thumbnails [Windows]

Share your advanced PureBasic knowledge/code with the community.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

ExplorerListGadget & Images Thumbnails [Windows]

Post by RASHAD »

Feel free to adapt it for your needs

Code: Select all

CompilerIf Not #PB_Compiler_Unicode 
  MessageRequester("Info","Please Compile in Unicode Mode", #PB_MessageRequester_Ok|#MB_ICONWARNING)
  End
CompilerEndIf

UseJPEG2000ImageDecoder()
UseTGAImageDecoder()

Global *token, *Image,Image
Global HBITMAP,Thread,Path$,Finish,Large_IL
Global Var.lv_item,row,Col,iSize,w,h

row = 0
col = 1
iSize = 128

Var\mask       =  #LVIF_IMAGE

Image = 0

Structure PPMColor
  r.a
  g.a
  b.a
EndStructure

Structure PGMColor
  c.a
EndStructure

Structure RectF
  x.f
  y.f
  width.f
  height.f
EndStructure
 
Structure GdiplusStartupInput
  GdiPlusVersion.i
  *DebugEventCallback.DebugEventProc
  SuppressBackgroundThread.i
  SuppressExternalCodecs.i
EndStructure

Structure ImageCodecInfo
  clsid.CLSID
  formatID.GUID
  *codecName
  *dllName
  *formatDescription
  *filenameExtension
  *mimeType
  flags.l
  version.l
  sigCount.l
  sigSize.l
  *sigPattern.byte
  *sigMask.byte
EndStructure

Procedure.i Gdiplus_New(version = 1, *hEventCB = #Null, Codecs = #False, bgThread = #False)
  OpenLibrary(0, "gdiplus.dll")
  Protected *token, input.GdiplusStartupInput
  With input
    \GdiPlusVersion = version
    \DebugEventCallback = *hEventCB
    \SuppressExternalCodecs = Codecs
    \SuppressBackgroundThread = bgThread
  EndWith
  CallFunction(0, "GdiplusStartup", @*token, @input, #Null)
  ProcedureReturn *token
EndProcedure

Procedure SetImg(gad,Row,Col,iImg)
  Var\iItem    = Row
  Var\iSubItem = Col
  Var\iImage   = iImg ;Index of image in the list
  SendMessage_(GadgetID(gad), #LVM_SETITEM, 0, @Var)
EndProcedure

Procedure LoadPPGM(Image,filename$)
  Result = ReadFile(#PB_Any, filename$,#PB_Ascii)
  If Result
    If CreateImage(Image, 1, 1)
      Format$ = ReadString(Result)
      Dimensions$ = ReadString(Result)
      If Val(StringField(Dimensions$, 1, " ")) = 0
        Dimensions$ = ReadString(Result)
      EndIf
      w  = Val(StringField(Dimensions$, 1, " "))
      h  = Val(StringField(Dimensions$, 2, " "))
      If w = 0 Or h = 0
        ProcedureReturn 1
      EndIf
      ResizeImage(Image, w, h)
      StartDrawing(ImageOutput(Image))
      max = Val(ReadString(Result))
      Select Format$
        Case "P2"
          Stringlen = Lof(Result) - Loc(Result)
          content$  = Space(Stringlen*SizeOf(Character)+1)
          Dim color.s(0)
          ReadData(Result, @content$, Stringlen)
          content$ = PeekS(@content$,-1,#PB_Ascii)
          CreateRegularExpression(1, "\d+")
          ExtractRegularExpression(1, content$, color())
          For y = 0 To h - 1
            For x = 0 To w - 1
              pos = (y*w + x)*1
              Plot(x, y,RGB(Val(color(pos)),Val(color(pos)),Val(color(pos))))
            Next
          Next
       
        Case "P3"
          Stringlen = Lof(Result) - Loc(Result)
          content$  = Space(Stringlen*SizeOf(Character)+1)
          Dim color.s(0)
          ReadData(Result, @content$, Stringlen)
          content$ = PeekS(@content$,-1,#PB_Ascii)
          CreateRegularExpression(1, "\d+")
          ExtractRegularExpression(1, content$, color())
          For y = 0 To h - 1
            For x = 0 To w - 1
              pos = (y*w + x)*3
              r=Val(color(pos))*255 / max
              g=Val(color(pos+1))*255 / max
              b=Val(color(pos+2))*255 / max
              Plot(x, y, RGB(r,g,b))
            Next
          Next
         
        Case "P5"
          Bufferlen = Lof(Result) - Loc(Result)
          *Buffer   = AllocateMemory(Bufferlen)
            ReadData(Result, *Buffer, Bufferlen)
            For y = 0 To h - 1
              For x = 0 To w - 1
                *gray.PGMColor = pos + *Buffer
                Plot(x, y,RGB(*gray\c,*gray\c,*gray\c))
                pos + 1
              Next
            Next
         
        Case "P6"
          Bufferlen = Lof(Result) - Loc(Result)
          *Buffer   = AllocateMemory(Bufferlen)
          ReadData(Result, *Buffer, Bufferlen)
          For y = 0 To h - 1
            For x = 0 To w - 1
              *color.PPMColor = pos + *Buffer
              Plot(x, y, RGB(*color\r*255 / max, *color\g*255 / max, *color\b*255 / max))
              pos + 3
            Next
          Next
      EndSelect
      StopDrawing()     
      CloseFile(Result)
    ProcedureReturn 1
    EndIf
  EndIf
EndProcedure

Procedure Resizewindow_EX()
  ResizeGadget(5,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20,WindowHeight(0)-50) 
  ResizeGadget(2,#PB_Ignore,#PB_Ignore,WindowWidth(0) - 35,WindowHeight(0)-65)
  ResizeGadget(12,#PB_Ignore,WindowHeight(0)-30,#PB_Ignore,#PB_Ignore)
EndProcedure

Procedure PopulateLI(par)
  Finish = 0
  SetGadgetText(12,"WAIT")
  DisableWindow(0,1)
  If ILwnd
     ImageList_Destroy_(ILwnd)
  EndIf
  ClearGadgetItems(0)
  img = CreateImage(#PB_Any,iSize,iSize+10,24,$FFFFFF)
  ILwnd = ImageList_Create_(iSize,iSize+10,#ILC_COLOR32|#ILC_MASK, 0, 300)
  SendMessage_(GadgetID(0), #LVM_SETIMAGELIST, #LVSIL_SMALL, ILwnd)
  Path$ = GetGadgetText(1)
  If ExamineDirectory(0, Path$, "*.*")
    *token = Gdiplus_New() 
    Repeat
      NextEntry     = NextDirectoryEntry(0)                   
      FileName$     = DirectoryEntryName(0)
      File$ = Path$+FileName$
      Ext$ = LCase(GetExtensionPart(FileName$))
      If FileSize(File$)  > 0; And FileSize(Path$ + FileName$) < 100000
        Select Ext$
          Case "bmp","jpg","jpeg","jpe","jfif","png","tif","tiff","gif","emf","wmf","ico","rle"
              If *token                   
                CallFunction(0,"GdipCreateBitmapFromFile",@File$, @*image)
                CallFunction(0,"GdipCreateHBITMAPFromBitmap", *Image,@HBITMAP,0)
                CallFunction(0,"GdipGetImageDimension",*image, @width.f, @height.f)
                hScale.f = iSize/width
                vScale.f = iSize/height
                If hScale > vScale
                    Scale.f = vScale*0.9
                Else
                    Scale.f = hScale*0.9
                EndIf
                imgH = CopyImage_(HBITMAP,#IMAGE_BITMAP,Scale*width,Scale*height,0)
                y = (iSize-Scale*height)/2
                hdc = StartDrawing(ImageOutput(img))
                  Box(0,0,iSize+10,iSize+10,$FFFFFF)
                  DrawImage(imgh,5,y)
                  SelectObject_(hdc,FontID(1))
                  SetBkMode_(hDc, #TRANSPARENT)
                  SetTextColor_(hDc, $0)
                  r.RECT : r\left = 0 : r\top = iSize-5 : r\right = iSize : r\bottom = 10
                  DrawText_(hdc,@FileName$,Len(FileName$),@r,#DT_NOCLIP | #DT_CENTER | #DT_VCENTER |#DT_WORDBREAK	)
                StopDrawing()
                item = ImageList_Add_(ILwnd,ImageID(img),0)
                SetImg(0,row,col,item)
                col+1
                If col > 8
                  col = 1
                  row+1
                EndIf
                DeleteObject_(HBITMAP)
                DeleteObject_(imgH)
              EndIf
           
          Case "cur"
            hCursor = LoadCursorFromFile_(@File$)
            If hCursor
              item = ImageList_AddIcon_(ILwnd,hCursor)
              SetImg(0,row,col,item)
              col+1
              If col > 8
                col = 1
                row+1
              EndIf   
              DeleteObject_(hCursor)  
            EndIf
           
          Case "jp2","tga"
            LoadImage(0,File$)
            If IsImage(0)
              hScale.f = iSize/ImageWidth(0)
              vScale.f = iSize/ImageHeight(0)
              If hScale > vScale
                  Scale.f = vScale*0.9
              Else
                  Scale.f = hScale*0.9
              EndIf
              imgH = CopyImage_(ImageID(0),#IMAGE_BITMAP,Scale*ImageWidth(0),Scale*ImageHeight(0),0)
              y = (iSize-Scale*ImageHeight(0))/2
              hdc = StartDrawing(ImageOutput(img))
                Box(0,0,iSize+10,iSize+10,$FFFFFF)
                DrawImage(imgh,5,y)
                SelectObject_(hdc,FontID(1))
                SetBkMode_(hDc, #TRANSPARENT)
                SetTextColor_(hDc, $0)
                r.RECT : r\left = 0 : r\top = iSize-5 : r\right = iSize : r\bottom = 10
                DrawText_(hdc,@FileName$,Len(FileName$),@r,#DT_NOCLIP | #DT_CENTER | #DT_VCENTER |#DT_WORDBREAK	)
              StopDrawing()
              item = ImageList_Add_(ILwnd,ImageID(img),0)
              SetImg(0,row,col,item)
              col+1
              If col > 8
                col = 1
                row+1
              EndIf 
              DeleteObject_(imgH)
            EndIf
            
          Case "ppm","pgm"
            If IsImage(0)
              FreeImage(0)
            EndIf
            LoadPPGM(Image, File$)
            If IsImage(Image)
              hScale.f = iSize/w
              vScale.f = iSize/h
              If hScale > vScale
                  Scale.f = vScale*0.9
              Else
                  Scale.f = hScale*0.9
              EndIf
              imgH = CopyImage_(ImageID(Image),#IMAGE_BITMAP,Scale*w,Scale*h,0)
              y = (iSize-Scale*h)/2
              hdc = StartDrawing(ImageOutput(img))
              Box(0,0,iSize+10,iSize+10,$FFFFFF)
              DrawImage(imgh,5,y)
              SelectObject_(hdc,FontID(1))
              SetBkMode_(hDc, #TRANSPARENT)
              SetTextColor_(hDc, $0)
              r.RECT : r\left = 0 : r\top = iSize-5 : r\right = iSize : r\bottom = 10
              DrawText_(hdc,@FileName$,Len(FileName$),@r,#DT_NOCLIP | #DT_CENTER | #DT_VCENTER |#DT_WORDBREAK	)
            StopDrawing()
            item = ImageList_Add_(ILwnd,ImageID(img),0)
            SetImg(0,row,col,item)
              col+1
              If col > 8
                col = 1
                row+1
              EndIf  
              DeleteObject_(imgH)
            EndIf 
         
        EndSelect
      EndIf
    Until NextEntry = 0
  EndIf
  Delay(50)
  Finish = 1
  SetGadgetText(12,"GO")
  DisableWindow(0,0)          
EndProcedure

LoadFont(0,"Consolas",14)
LoadFont(1,"Arial",7)

OpenWindow(0,0,0,800,600,"ExplorerListGadget & Thumbnails",#PB_Window_SystemMenu|#PB_Window_ScreenCentered| #PB_Window_MaximizeGadget| #PB_Window_SizeGadget)
SetWindowColor(0,$AAAAAB)
ContainerGadget(5,10,10,780,545,#PB_Container_Flat)
  ExplorerListGadget(0,0,0,0,0,"",#PB_Explorer_NoParentFolder |  #PB_Explorer_NoDriveRequester | #PB_Explorer_NoMyDocuments | #PB_Explorer_AutoSort)
  SetGadgetItemAttribute(0, 0,#PB_Explorer_ColumnWidth ,0,0)
  ExplorerTreeGadget(1, 0,0,0,0, "*.*",#PB_Explorer_NoFiles)
  SplitterGadget(2, 5, 5, 768, 530, 1,0, #PB_Splitter_Vertical|#PB_Splitter_Separator)
  SetGadgetState(2,160)
CloseGadgetList() 

SetGadgetFont(1,FontID(0))
;SendMessage_(GadgetID(0),#LVM_SETVIEW,#LV_VIEW_ICON,0)
SetGadgetColor(1, #PB_Gadget_BackColor, $D2D2D2)

;ButtonGadget(10,10,565,50,25,"RUN")
TextGadget(12,10,565,80,25,"START",#SS_CENTER|#SS_CENTERIMAGE)
SetGadgetColor(12,#PB_Gadget_FrontColor,$0000FF)
SetGadgetFont(12,FontID(0))

SetWindowLongPtr_(GadgetID(0), #GWL_STYLE, GetWindowLongPtr_(GadgetID(0), #GWL_STYLE)|#LVS_NOCOLUMNHEADER)
SendMessage_(GadgetID(0), #LVM_SETEXTENDEDLISTVIEWSTYLE , #LVS_EX_SUBITEMIMAGES, #LVS_EX_SUBITEMIMAGES)
Header = SendMessage_(GadgetID(0), #LVM_GETHEADER, 0, 0)
AddGadgetColumn(0, 1, "",iSize+5)
AddGadgetColumn(0, 2, "",iSize+5)
AddGadgetColumn(0, 3, "",iSize+5)
AddGadgetColumn(0, 4, "",iSize+5)
AddGadgetColumn(0, 5, "",iSize+5)
AddGadgetColumn(0, 6, "",iSize+5)
AddGadgetColumn(0, 7, "",iSize+5)
AddGadgetColumn(0, 8, "",iSize+5)

BindEvent(#PB_Event_SizeWindow,@Resizewindow_EX())
Repeat           
  Select WaitWindowEvent()     
    Case #PB_Event_CloseWindow
        CallFunction(0,"GdipDeleteGraphics",*Localgfx) 
        CallFunction(0,"GdiplusShutdown",*token)
        CloseLibrary(0)
        Quit = 1       
   
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          Select EventType()
             Case #PB_EventType_Change
                If IsThread(Thread)      
                  KillThread(Thread)
                EndIf
                Thread = CreateThread(@PopulateLI(),32)                                 
          EndSelect 


      EndSelect
  EndSelect
Until Quit = 1
End

DataSection
  IconHeader_32:
    Data.l 0,0,1,0,0,0,0,16,0,0,0,0
    
  Header:
    Data.l 0,0,2,0,0,0,0,16,0,0,0,0
    
  FrameDimensionPage:
    Data.l  $7462DC86
    Data.u  $6180, $4C7E
    Data.b  $8E, $3F, $EE, $73, $33, $A7, $A4, $83
    
  clsid_jpeg: ; clsid for jpeg image format
    Data.l $557CF401
    Data.w $1A04
    Data.w $11D3
    Data.b $9A,$73,$00,$00,$F8,$1E,$F3,$2E
  
  clsid_EncoderQuality:
    Data.l $1D5BE4B5
    Data.w $FA4A
    Data.w $452D
    Data.b $9C,$DD,$5D,$B3,$51,$05,$E7,$EB    
EndDataSection
Egypt my love
User avatar
RSBasic
Moderator
Moderator
Posts: 1228
Joined: Thu Dec 31, 2009 11:05 pm
Location: Gernsbach (Germany)
Contact:

Re: ExplorerListGadget & Images Thumbnails [Windows]

Post by RSBasic »

Works fine. Thank you. Image
Image
Image
Post Reply