Оригинальный код 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
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
Комментарии
Отправить комментарий