Создание значка из файла

 Оригинальный код Manhunter

Structure ICONDIR
  idReserved.w ; Зарезервировано (должно быть 0)
  idType.w     ; Тип ресурса (1 для иконок)
  idCount.w    ; Количество изображений в иконке
EndStructure
Structure ICONDIRENTRY
  bWidth.b      ; Ширина изображения в пикселах
  bHeight .b    ; Высота изображения в пикселах
  bColorCount.b ; Количество цветов
  bReserved.b   ; Зарезервировано
  wPlanes.w     ; Зарезервировано
  wBitCount.w   ; Зарезервировано
  dwBytesInRes.l; Размер данных изображения
  dwImageOffset.l ; Смещение данных относительно начала файла
EndStructure
Procedure LoadIconFromMemory(*lpMem,dSize); dsize =resolution,0-any
  id.ICONDIR
  ie.ICONDIRENTRY
  hicon=0
  *m=*lpMem
  CopyMemory(*lpMem,@id,SizeOf(ICONDIR))
  If id\idReserved
    Debug "Not icon"
  Else
    If id\idType=1
      If id\idCount
        *lpMem=*lpMem+SizeOf(ICONDIR)
        For i=1 To id\idCount
          CopyMemory(*lpmem,@ie,SizeOf(ICONDIRENTRY))
          If dsize=0 Or dsize=ie\bWidth
            ;if peekl(*m+ie\dwImageOffset)=$474E5089 PNG
            hicon=CreateIconFromResourceEx_(*m+ie\dwImageOffset,ie\dwBytesInRes,1,$30000,ie\bWidth,ie\bWidth,#LR_DEFAULTCOLOR)
            Break
          EndIf
          *lpMem=*lpMem+SizeOf(ICONDIRENTRY)
        Next i
      Else
        Debug "Zero count icons"
      EndIf
    Else
      Debug "not icon"
    EndIf
  EndIf
  ;Debug hicon
  ProcedureReturn hicon
EndProcedure
If OpenWindow(0, 0, 0, 230, 90, "Icon from Memory", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  hicon=LoadIconFromMemory(?icon_raw,32)
  If hicon
    SendMessage_(WindowID(0),#WM_SETICON,#ICON_BIG,hicon)
  Else
    Debug "Error icon"
  EndIf
  Repeat
    Event = WaitWindowEvent()
    If GetAsyncKeyState_(#VK_ESCAPE)&$8000
      Break
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf


Исходники+значок

Комментарии