Что нового

Как задать пункту в ListView изображение из файла?

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
Мда..... я давно не имел дело с GUI подобного характера :whistle:, поэтому возникла проблема. Нужно задать изображение для определённого Item'а, но критично важно сделать это указав файл, а не индекс в ImageList.

Пример:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIListView.au3>

Global $iGUI_Left 			= -1
Global $iGUI_Top 			= -1
Global $iGUI_Width 			= 750
Global $iGUI_Height 		= 600

$hMain_GUI = GUICreate("Test GUI", $iGUI_Width, $iGUI_Height, $iGUI_Left, $iGUI_Top)

$hMenuItems_ListView = GUICtrlCreateListView("Item Name|Type|Displayed on...|Item Full Value", 280, 40, 450, $iGUI_Height-100, _
	BitOR($LVS_SHOWSELALWAYS, $LVS_SINGLESEL, $LVS_REPORT, $LVS_NOSORTHEADER))
$hMenuItems_ListView = GUICtrlGetHandle($hMenuItems_ListView)
_GUICtrlListView_SetExtendedListViewStyle($hMenuItems_ListView, $LVS_EX_CHECKBOXES)

_GUICtrlListView_InsertItem($hMenuItems_ListView, "Item", 0)
_GUICtrlListView_SetItemImage($hMenuItems_ListView, 0, 0) ; ???

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd


Понятно что для _GUICtrlListView_SetItemImage нужен индекс в ImageList, но мне нужно указать имя файла. Есть идеи?

P.S
Не хотелось бы использовать встроенные функции для создания элементов, т.к они “обладают” некими ограничениями.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
CreatoR
К сожалению, не смог найти исходную тему на оффсайте, чтобы сделать ссылку...
Однако в этом скрипте может оказаться много полезного...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
CreatoR, не совсем понятен вопрос, задать файл где: при вызове функции или в общем и целом? Но ImageList создать придется в любом случае или не будет картинок.

Код:
#include <GUIConstantsEx.au3>
#include <GUIImageList.au3>
#include <GUIListView.au3>
#include <WindowsConstants.au3>

Global $iGUI_Left = -1
Global $iGUI_Top = -1
Global $iGUI_Width = 750
Global $iGUI_Height = 600

$hMain_GUI = GUICreate("Test GUI", $iGUI_Width, $iGUI_Height, $iGUI_Left, $iGUI_Top)

$hMenuItems_ListView = GUICtrlCreateListView("Item Name|Type|Displayed on...|Item Full Value", 280, 40, 450, $iGUI_Height - 100, BitOR($LVS_SHOWSELALWAYS, $LVS_SINGLESEL, $LVS_REPORT, $LVS_NOSORTHEADER))
$hMenuItems_ListView = GUICtrlGetHandle($hMenuItems_ListView)
_GUICtrlListView_SetExtendedListViewStyle($hMenuItems_ListView, $LVS_EX_CHECKBOXES)
$hImage = _GUIImageList_Create(16, 16, 5, 1)
_GUICtrlListView_SetImageList($hMenuItems_ListView, $hImage, 1)

_GUICtrlListView_InsertItem($hMenuItems_ListView, "Item", 0)
_GUICtrlListView_SetItemImageEx($hMenuItems_ListView, 0, @AutoItExe, 0)

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _GUICtrlListView_SetItemImageEx($hWnd, $iIndex, $sIconFile, $sIconIndex)
	_GUIImageList_AddIcon($hImage, $sIconFile, $sIconFile)
	_GUICtrlListView_SetItemImage($hWnd, $iIndex, _GUIImageList_GetImageCount($hImage) - 1)
EndFunc   ;==>_GUICtrlListView_SetItemImageEx
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
snoitaleR [?]
в этом скрипте может оказаться много полезного
Спасибо, посмотрю.

Yashied [?]
не совсем понятен вопрос, задать файл где: при вызове функции или в общем и целом?
Задать на этапе создания (вставки) Item'а.

ImageList создать придется в любом случае или не будет картинок
Хм, получается придётся его всё время пополнять... а можно временно создать ImageList, задать элементу иконку, и сразу же удалить ImageList?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
CreatoR [?]
Хм, получается придётся его всё время пополнять... а можно временно создать ImageList, задать элементу иконку, и сразу же удалить ImageList?

Нет, картинка храниться только в ImageList'е. Если предусмотрено в процессе выполнения программы добавлять/удалять элементы из ListView, то придется добавлять/удалять соответствующие картинки из ImageList.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
И ещё проблема, если это файл *.png, то изображение не устанавливается, возможно ли это исправить?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Есть два пути:

  • С помощью GDIPlus поместить PNG на фон ListView - _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_WINDOW)), т.е. избавиться от прозрачности, а затем установить в ImageList HBitmap с помощью _GUIImageList_Add().
  • Опять же, с помощью GDIPlus преобразовать PNG в HIcon. В этом случае, в ImageList нужно помещать HIcon, используя _GUIImageList_ReplaceIcon().

    Код:
    $hIcon = DllCall($ghGDIPDll, 'int', 'GdipCreateHICONFromBitmap', 'ptr', $hImage, 'int*', 0)

 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
Yashied [?]
Опять же, с помощью GDIPlus преобразовать PNG в HIcon. В этом случае, в ImageList нужно помещать HIcon, используя _GUIImageList_ReplaceIcon().
Пример можно плиз, я что то не врублю как это реализовать :wacko:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Код:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <GUIImageList.au3>
#include <GUIListView.au3>
#include <WindowsConstants.au3>

Global $iGUI_Left = -1
Global $iGUI_Top = -1
Global $iGUI_Width = 750
Global $iGUI_Height = 600

_GDIPlus_Startup()

$hMain_GUI = GUICreate('Test GUI', $iGUI_Width, $iGUI_Height, $iGUI_Left, $iGUI_Top)

$hMenuItems_ListView = GUICtrlCreateListView('Item Name|Type|Displayed on...|Item Full Value', 280, 40, 450, $iGUI_Height - 100, BitOR($LVS_ICON, $LVS_SHOWSELALWAYS, $LVS_SINGLESEL, $LVS_REPORT, $LVS_NOSORTHEADER))
$hMenuItems_ListView = GUICtrlGetHandle($hMenuItems_ListView)
_GUICtrlListView_SetExtendedListViewStyle($hMenuItems_ListView, $LVS_EX_CHECKBOXES)
$hImageList = _GUIImageList_Create(32, 32, 5, 1)
_GUICtrlListView_SetImageList($hMenuItems_ListView, $hImageList, 1)

_GUICtrlListView_InsertItem($hMenuItems_ListView, 'Item', 0)
_GUICtrlListView_SetItemImageEx($hMenuItems_ListView, 0, 'MyImage.png')

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd

_GDIPlus_Shutdown()

Func _GUICtrlListView_SetItemImageEx($hWnd, $iIndex, $sFile)

	Local $hBitmap, $hImage, $hGraphic, $hBrush, $hPic

    $hBitmap = _WinAPI_CreateBitmap(32, 32, 1, 32)
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
	_WinAPI_DeleteObject($hBitmap)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
	$hBrush = _GDIPlus_BrushCreateSolid(BitOR(0xFF000000, _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_WINDOW))))
	_GDIPlus_GraphicsFillRect($hGraphic, 0, 0, 32, 32, $hBrush)
	$hPic = _GDIPlus_ImageLoadFromFile($sFile)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hPic, 0, 0, 32, 32)
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_BrushDispose($hBrush)
	_GDIPlus_ImageDispose($hImage)
	_GDIPlus_ImageDispose($hPic)
    _GUIImageList_Add($hImageList, $hBitmap)
    _GUICtrlListView_SetItemImage($hWnd, $iIndex, _GUIImageList_GetImageCount($hImageList) - 1)
	_WinAPI_DeleteObject($hBitmap)
EndFunc   ;==>_GUICtrlListView_SetItemImageEx

Func _WinAPI_SwitchColor($iColor)
	Return BitOR(BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0x0000FF), -16), BitShift(BitAND($iColor, 0xFF0000), 16))
EndFunc   ;==>_WinAPI_SwitchColor
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
Yashied
Супер! :IL_AutoIt_1:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Кстати, удаление ненужных элементов из ImageList можно делать через WM_NOTIFY - $LVN_DELETEITEM и $LVN_DELETEALLITEMS.



Добавлено:
Сообщение автоматически объединено:

Тоже самое, но с сохранением пропорций картинки.

Код:
Func _GUICtrlListView_SetItemImageEx($hWnd, $iIndex, $sFile)

	Local $hBitmap, $hImage, $hGraphic, $hBrush, $hPic, $W, $H

    $hBitmap = _WinAPI_CreateBitmap(32, 32, 1, 32)
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
	_WinAPI_DeleteObject($hBitmap)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
	$hBrush = _GDIPlus_BrushCreateSolid(BitOR(0xFF000000, _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_WINDOW))))
	_GDIPlus_GraphicsFillRect($hGraphic, 0, 0, 32, 32, $hBrush)
	$hPic = _GDIPlus_ImageLoadFromFile($sFile)
	$W = _GDIPlus_ImageGetWidth($hPic)
	$H = _GDIPlus_ImageGetHeight($hPic)
	If ($W) And ($H) Then
		If $W < $H Then
			$W = 32 * $W / $H
			$H = 32
		Else
			$H = 32 * $H / $W
			$W = 32
		EndIf
		_GDIPlus_GraphicsDrawImageRect($hGraphic, $hPic, (32 - $W) / 2, (32 - $H) / 2, $W, $H)
	EndIf
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_BrushDispose($hBrush)
	_GDIPlus_ImageDispose($hImage)
	_GDIPlus_ImageDispose($hPic)
    _GUIImageList_Add($hImageList, $hBitmap)
    _GUICtrlListView_SetItemImage($hWnd, $iIndex, _GUIImageList_GetImageCount($hImageList) - 1)
	_WinAPI_DeleteObject($hBitmap)
EndFunc   ;==>_GUICtrlListView_SetItemImageEx
 

AZJIO

Меценат
Меценат
Сообщения
2,761
Репутация
1,152
Добавил в пример Yashied итемы из системных иконок, а то MyImage.png нет, я уж думал не работает.
Добавил к функции $size - размер иконки

Код:
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <GUIImageList.au3>
#include <GUIListView.au3>
#include <WindowsConstants.au3>

Global $iGUI_Left = -1
Global $iGUI_Top = -1
Global $iGUI_Width = 750
Global $iGUI_Height = 600
Global $size = 64 ; размер итемов и иконок

_GDIPlus_Startup()

$hMain_GUI = GUICreate('Test GUI', $iGUI_Width, $iGUI_Height, $iGUI_Left, $iGUI_Top)

$hMenuItems_ListView = GUICtrlCreateListView('Item Name                |Type|Displayed on...|Item Full Value', 20, 20, $iGUI_Width-40, $iGUI_Height - 140, BitOR($LVS_ICON, $LVS_SHOWSELALWAYS, $LVS_SINGLESEL, $LVS_REPORT, $LVS_NOSORTHEADER))
$hMenuItems_ListView = GUICtrlGetHandle($hMenuItems_ListView)
_GUICtrlListView_SetExtendedListViewStyle($hMenuItems_ListView, $LVS_EX_CHECKBOXES)
$hImageList = _GUIImageList_Create($size, $size, 5, 1)
_GUICtrlListView_SetImageList($hMenuItems_ListView, $hImageList, 1)

; создание итемов из системных картинок
_GUICtrlListView_InsertItem($hMenuItems_ListView, 'table.bmp', 0)
_GUICtrlListView_SetItemImageEx($hMenuItems_ListView, 0, @ProgramFilesDir&'\Windows NT\Pinball\table.bmp', $size)

_GUICtrlListView_InsertItem($hMenuItems_ListView, 'wmpnss_color32.jpg', 0)
_GUICtrlListView_SetItemImageEx($hMenuItems_ListView, 0, @ProgramFilesDir&'\Windows Media Player\Network Sharing\wmpnss_color32.jpg', $size)

_GUICtrlListView_InsertItem($hMenuItems_ListView, 'wmpnss_bw32.jpg', 0)
_GUICtrlListView_SetItemImageEx($hMenuItems_ListView, 0, @ProgramFilesDir&'\Windows Media Player\Network Sharing\Web\wmpnss_bw32.jpg', $size)

_GUICtrlListView_InsertItem($hMenuItems_ListView, 'Wallpaper.jpg', 0)
_GUICtrlListView_SetItemImageEx($hMenuItems_ListView, 0, @WindowsDir&'\Web\Wallpaper.jpg', $size)

_GUICtrlListView_InsertItem($hMenuItems_ListView, 'oemlogo.bmp', 0)
_GUICtrlListView_SetItemImageEx($hMenuItems_ListView, 0, @SystemDir&'\oemlogo.bmp', $size)

_GUICtrlListView_InsertItem($hMenuItems_ListView, 'gif не работает', 0)
_GUICtrlListView_SetItemImageEx($hMenuItems_ListView, 0, @SystemDir&'\merlin.gif', $size)

_GUICtrlListView_InsertItem($hMenuItems_ListView, 'MyImage.png', 0)
_GUICtrlListView_SetItemImageEx($hMenuItems_ListView, 0, 'MyImage.png', $size)

_GUICtrlListView_InsertItem($hMenuItems_ListView, 'MyImage.png', 0)
_GUICtrlListView_SetItemImageEx($hMenuItems_ListView, 0, @ScriptDir&'\MyImage.png', $size)

_GUICtrlListView_InsertItem($hMenuItems_ListView, 'winnt.bmp', 0)
_GUICtrlListView_SetItemImageEx($hMenuItems_ListView, 0, @WindowsDir&'\winnt.bmp', $size)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd

_GDIPlus_Shutdown()


Func _WinAPI_SwitchColor($iColor)
    Return BitOR(BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0x0000FF), -16), BitShift(BitAND($iColor, 0xFF0000), 16))
EndFunc   ;==>_WinAPI_SwitchColor


Func _GUICtrlListView_SetItemImageEx($hWnd, $iIndex, $sFile, $size)

    Local $hBitmap, $hImage, $hGraphic, $hBrush, $hPic, $W, $H

    $hBitmap = _WinAPI_CreateBitmap($size, $size, 1, 32)
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    _WinAPI_DeleteObject($hBitmap)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
    $hBrush = _GDIPlus_BrushCreateSolid(_WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_WINDOW)))
    $hBrush = _GDIPlus_BrushCreateSolid(BitOR(0xFF000000, _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_WINDOW))))
    _GDIPlus_GraphicsFillRect($hGraphic, 0, 0, $size, $size, $hBrush)
    $hPic = _GDIPlus_ImageLoadFromFile($sFile)
    $W = _GDIPlus_ImageGetWidth($hPic)
    $H = _GDIPlus_ImageGetHeight($hPic)
    If ($W) And ($H) Then
        If $W < $H Then
            $W = $size * $W / $H
            $H = $size
        Else
            $H = $size * $H / $W
            $W = $size
        EndIf
        _GDIPlus_GraphicsDrawImageRect($hGraphic, $hPic, ($size - $W) / 2, ($size - $H) / 2, $W, $H)
    EndIf
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_ImageDispose($hPic)
    _GUIImageList_Add($hImageList, $hBitmap)
    _GUICtrlListView_SetItemImage($hWnd, $iIndex, _GUIImageList_GetImageCount($hImageList) - 1)
    _WinAPI_DeleteObject($hBitmap)
EndFunc   ;==>_GUICtrlListView_SetItemImageEx
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
Yashied
А прозрачность всё же можно сохранить?
«_WinAPI_GetSysColor($COLOR_WINDOW)» задаёт белый цвет у меня, может возможно вместо этого указать на прозрачность? Дело в том что у меня в списке устанавливается фоновое изображение, оно может быть разным, а вот фон у пунктов должен быть прозрачным, иначе выглядит оно не красиво.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Код:
#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <GUIImageList.au3>
#Include <GUIListView.au3>
#Include <File.au3>
#Include <WinAPI.au3>
#Include <WindowsConstants.au3>

Global Const $Path = @WindowsDir & '\Web\Wallpaper'

_GDIPlus_Startup()

$hForm = GUICreate('MyGUI', 800, 600, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX), $WS_EX_COMPOSITED)

$hListView = _GUICtrlListView_Create($hForm, 'Item', 0, 0, 800, 600, BitOR($LVS_AUTOARRANGE, $LVS_ICON))
_GUICtrlListView_SetTextBkColor($hListView, $CLR_NONE)
_GUICtrlListView_SetBkColor($hListView, 0xD9FFEB)
$hImageList = _GUIImageList_Create(64, 64, 5, 1)
_GUICtrlListView_SetImageList($hListView, $hImageList)

$FileList = _FileListToArray($Path, '*', 1)
If IsArray($FileList) Then
    For $i = 1 To $FileList[0]
        _GUICtrlListView_InsertItem($hListView, $FileList[$i], $i - 1)
        If StringRegExpReplace($FileList[$i], '^.*\.', '') = 'ico' Then
            _GUICtrlListView_SetItemIconEx($hListView, $i - 1, $hImageList, $Path & '\' & $FileList[$i])
        Else
            _GUICtrlListView_SetItemImageEx($hListView, $i - 1, $hImageList, $Path & '\' & $FileList[$i])
        EndIf
    Next
EndIf

GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd

_GDIPlus_Shutdown()

Func _GUICtrlListView_SetItemIconEx($hWnd, $iIndex, ByRef $hImageList, $sFile, $iIcon = 0)

    Local $Size = _GUIImageList_GetIconSize($hImageList)

    If (Not $Size[0]) Or (Not $Size[1]) Then
        Return 0
    EndIf

    Local $hIcon = DllCall('shell32.dll', 'int', 'SHExtractIconsW', 'wstr', $sFile, 'int', $iIcon, 'int', $Size[0], 'int', $Size[1], 'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)

    If (@error) Or (Not $hIcon[0]) Or (Not $hIcon[5]) Then
        Return 0
    EndIf
    _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon[5])
    _GUICtrlListView_SetItemImage($hWnd, $iIndex, _GUIImageList_GetImageCount($hImageList) - 1)
    _WinAPI_DestroyIcon($hIcon[5])
EndFunc   ;==>_GUICtrlListView_SetItemIconEx

Func _GUICtrlListView_SetItemImageEx($hWnd, $iIndex, ByRef $hImageList, $sFile)

    Local $Size = _GUIImageList_GetIconSize($hImageList)

    If (Not $Size[0]) Or (Not $Size[1]) Then
        Return 0
    EndIf

    Local $W, $H, $hGraphic, $hPic, $hImage, $hIcon

    _GDIPlus_Startup()
    $hPic = _GDIPlus_ImageLoadFromFile($sFile)
    $W = _GDIPlus_ImageGetWidth($hPic)
    $H = _GDIPlus_ImageGetHeight($hPic)
    If ($W < 0) Or ($H < 0) Then
        _GDIPlus_Shutdown()
        Return 0
    EndIf
    If $W < $H Then
        $W = $Size[0] * $W / $H
        $H = $Size[1]
    Else
        $H = $Size[1] * $H / $W
        $W = $Size[0]
    EndIf
    $hImage = DllCall($ghGDIPDll, 'int', 'GdipGetImageThumbnail', 'ptr', $hPic, 'int', $Size[0], 'int', $Size[1], 'ptr*', 0, 'ptr', 0, 'ptr', 0)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage[4])
    _GDIPlus_GraphicsClear($hGraphic, 0)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hPic, ($Size[0] - $W) / 2, ($Size[1] - $H) / 2, $W, $H)
    $hIcon = DllCall($ghGDIPDll, 'int', 'GdipCreateHICONFromBitmap', 'ptr', $hImage[4], 'ptr*', 0)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage[4])
    _GDIPlus_ImageDispose($hPic)
    _GDIPlus_Shutdown()
    If Not $hIcon[2] Then
        Return 0
    EndIf
    _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon[2])
    _GUICtrlListView_SetItemImage($hWnd, $iIndex, _GUIImageList_GetImageCount($hImageList) - 1)
    _WinAPI_DestroyIcon($hIcon[2])
    Return 1
EndFunc   ;==>_GUICtrlListView_SetItemImageEx

Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam)

	Local $Pos

	Switch $hWnd
		Case $hForm
			$Pos = WinGetClientSize($hForm)
			WinMove($hListView, '', 0, 0, $Pos[0], $Pos[1])
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
Yashied
Супер №2, то что нужно! :beer:
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Что-то не могу понять...
Код:
#cs ----------------------------------------------------------------------------

 Версия AutoIt: v3.3.6.1
 Автор: SECTOR (aka TroubleBeat)

#ce ----------------------------------------------------------------------------

#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#Include <GuiListView.au3>
#Include <GuiImageList.au3>
#include <WinApi.au3>
#include <GDIPlus.au3>

Global $app_Name = "Link Collection", $app_Version = "0.1"
Global $ini_file = @ScriptDir&"\LinkCollection.ini"

$Debug_LV = False

_StartScript()

$h_MainGUI = GUICreate($app_Name&" "&$app_Version,600,500,-1,-1,$WS_SYSMENU+$WS_MINIMIZEBOX)

$h_Menu_File = GUICtrlCreateMenu("Файл")
$h_Menu_OpenP = GUICtrlCreateMenuItem("Открыть",$h_Menu_File)
$h_Menu_SaveP = GUICtrlCreateMenuItem("Сохранить как",$h_Menu_File)
GUICtrlCreateMenuItem("",$h_Menu_File)
$h_Menu_Exit = GUICtrlCreateMenuItem("Выход",$h_Menu_File)

$h_Menu_Icons = GUICtrlCreateMenu("Иконки")
$h_Menu_Load = GUICtrlCreateMenuItem("Загрузить с выбранного",$h_Menu_Icons)
$h_Menu_LoadAll = GUICtrlCreateMenuItem("Загрузить все",$h_Menu_Icons)
$h_Menu_LoadNE = GUICtrlCreateMenuItem("Загрузить не загруженные",$h_Menu_Icons)
GUICtrlCreateMenuItem("",$h_Menu_Icons)
$h_Menu_DelAll = GUICtrlCreateMenuItem("Удалить все",$h_Menu_Icons)

$h_Main_List = GUICtrlCreateListView("Имя|Ссылка|Описание",8,10,580,350)

$h_Main_ImageList = _GUIImageList_Create(16,16,5,1)
_GUICtrlListView_SetImageList($h_Main_List,$h_Main_ImageList)

_GUICtrlListView_SetColumnWidth($h_Main_List,0,160)
_GUICtrlListView_SetColumnWidth($h_Main_List,1,160)
_GUICtrlListView_SetColumnWidth($h_Main_List,2,580-(160*2+8))
_GUICtrlListView_SetExtendedListViewStyle($h_Main_List,BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))

GUISetState()

_Load()
_LoadIcons()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE, $h_Menu_Exit
			_End()
	EndSwitch
WEnd

Func _Load()

	If Not FileExists($ini_file) Then Return FileWrite($ini_file,"")

	Local $aSec = IniReadSectionNames($ini_file)
	If Not IsArray($aSec) Or $aSec[0] < 1 Then Return 0

	Local $info, $name

	GUICtrlDelete($h_Main_List)
	Global $h_Main_List = GUICtrlCreateListView("Имя|Ссылка|Описание",8,10,580,350)
	_GUICtrlListView_SetImageList($h_Main_List,$h_Main_ImageList)
	_GUICtrlListView_SetColumnWidth($h_Main_List,0,160)
	_GUICtrlListView_SetColumnWidth($h_Main_List,1,160)
	_GUICtrlListView_SetColumnWidth($h_Main_List,2,580-(160*2+8))
	_GUICtrlListView_SetExtendedListViewStyle($h_Main_List,BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))

	For $n = 1 To $aSec[0]
		$name = IniRead($ini_file,$aSec[$n],"name",$aSec[$n])
		$info = IniRead($ini_file,$aSec[$n],"info","")
		_GUICtrlListView_InsertItem($h_Main_List,$name,$n-1)
		_GUICtrlListView_AddSubItem($h_Main_List,$n-1,$aSec[$n],1)
		_GUICtrlListView_AddSubItem($h_Main_List,$n-1,$info,2)
	Next

EndFunc

Func _LoadIcons()

	Local $m, $s, $f

	For $m = 0 To _GUICtrlListView_GetItemCount($h_Main_List)-1
		$s = _LinkRegExp(_GUICtrlListView_GetItemText($h_Main_List,$m,1))
		$f = @ScriptDir&"\Collection\Icons\"&$s&".ico"
		If FileExists($f) Then ConsoleWrite("! >> "&_GUICtrlListView_SetItemIconEx($h_Main_List,$m,$h_Main_ImageList,$f)&@CRLF)
	Next

EndFunc


Func _GUICtrlListView_SetItemIconEx($hWnd, $iIndex, ByRef $hImageList, $sFile, $iIcon = 0)

    Local $Size = _GUIImageList_GetIconSize($hImageList)

    If (Not $Size[0]) Or (Not $Size[1]) Then
        Return 0
    EndIf

    Local $hIcon = DllCall('shell32.dll', 'int', 'SHExtractIconsW', 'wstr', $sFile, 'int', $iIcon, 'int', $Size[0], 'int', $Size[1], 'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)

    If (@error) Or (Not $hIcon[0]) Or (Not $hIcon[5]) Then
        Return 0
    EndIf
    _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon[5])
    _GUICtrlListView_SetItemImage($hWnd, $iIndex, _GUIImageList_GetImageCount($hImageList) - 1)
    _WinAPI_DestroyIcon($hIcon[5])

	Return 1

EndFunc   ;==>_GUICtrlListView_SetItemIconEx

Func _LinkRegExp($sLink)
	Return StringRegExpReplace($sLink,"(http://)?(www.)?([^/]+)(/?.+)?","\2\3")
EndFunc

Func _StartScript($iExit = 1)

	Local $temp = StringUpper(StringReplace($app_Name," ","_")&"~Autoit3_Script~Data:q4w3e2r1<{(>})~-_~*")
	If WinExists($temp) And $iExit Then
		ConsoleWrite("!!! Script exist... Exit... "&@CRLF)
		Exit 1
	EndIf
	AutoItWinSetTitle($temp)
	ConsoleWrite("!!! Script started... Window: "&$temp&@CRLF)

EndFunc

Func _End($iErr = 0)

	If $iErr Then MsgBox(16,$app_Name&" - Error",$iErr)
	Exit

EndFunc

Func _LoadIcon($sPath)

	Local $sLink = "http://"&_LinkRegExp($sPath)&"/favicon.ico"
	Local $sTempFile = @TempDir&"\LinkCollectionTemp_"&Random(100000000,999999999,1)&".ico"
	Local $sOutFile = @ScriptDir&"\Collection\Icons\"&_LinkRegExp($sPath)&".ico"

	FileDelete($sTempFile)
	Sleep(10)
	InetGet($sLink,$sTempFile)
	Local $error = @error
	Sleep(10)
	Local $iByte = FileGetSize($sTempFile)
	ConsoleWrite('! _LoadIcon > In: "'&$sPath&'" | Out: "'&$sLink&'" | Error: '&$error&' | Load byte: '&$iByte&' |'&@CRLF)

	If Not @error Then
		FileDelete($sOutFile)
		Sleep(10)
		FileCopy($sTempFile,$sOutFile,8)
		Return 1
	EndIf

	FileDelete($sTempFile)

	Return 0

EndFunc

Вроде всё сделал правильно а иконки не появляются :scratch:


Добавлено:
Сообщение автоматически объединено:

up!!!
 

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Yashied
В твоем варианте,
Код:
#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <GUIImageList.au3>
#Include <GUIListView.au3>
#Include <File.au3>
#Include <WinAPI.au3>
#Include <WindowsConstants.au3>

Global Const $Path = @WindowsDir & '\Web\Wallpaper'

_GDIPlus_Startup()

$hForm = GUICreate('MyGUI', 800, 600, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX), $WS_EX_COMPOSITED)

$hListView = _GUICtrlListView_Create($hForm, 'Item', 0, 0, 800, 600, BitOR($LVS_AUTOARRANGE, $LVS_ICON))
_GUICtrlListView_SetTextBkColor($hListView, $CLR_NONE)
_GUICtrlListView_SetBkColor($hListView, 0xD9FFEB)
$hImageList = _GUIImageList_Create(64, 64, 5, 1)
_GUICtrlListView_SetImageList($hListView, $hImageList)

$FileList = _FileListToArray($Path, '*', 1)
If IsArray($FileList) Then
    For $i = 1 To $FileList[0]
        _GUICtrlListView_InsertItem($hListView, $FileList[$i], $i - 1)
        If StringRegExpReplace($FileList[$i], '^.*\.', '') = 'ico' Then
            _GUICtrlListView_SetItemIconEx($hListView, $i - 1, $hImageList, $Path & '\' & $FileList[$i])
        Else
            _GUICtrlListView_SetItemImageEx($hListView, $i - 1, $hImageList, $Path & '\' & $FileList[$i])
        EndIf
    Next
EndIf

GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd

_GDIPlus_Shutdown()

Func _GUICtrlListView_SetItemIconEx($hWnd, $iIndex, ByRef $hImageList, $sFile, $iIcon = 0)

    Local $Size = _GUIImageList_GetIconSize($hImageList)

    If (Not $Size[0]) Or (Not $Size[1]) Then
        Return 0
    EndIf

    Local $hIcon = DllCall('shell32.dll', 'int', 'SHExtractIconsW', 'wstr', $sFile, 'int', $iIcon, 'int', $Size[0], 'int', $Size[1], 'ptr*', 0, 'ptr*', 0, 'int', 1, 'int', 0)

    If (@error) Or (Not $hIcon[0]) Or (Not $hIcon[5]) Then
        Return 0
    EndIf
    _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon[5])
    _GUICtrlListView_SetItemImage($hWnd, $iIndex, _GUIImageList_GetImageCount($hImageList) - 1)
    _WinAPI_DestroyIcon($hIcon[5])
EndFunc   ;==>_GUICtrlListView_SetItemIconEx

Func _GUICtrlListView_SetItemImageEx($hWnd, $iIndex, ByRef $hImageList, $sFile)

    Local $Size = _GUIImageList_GetIconSize($hImageList)

    If (Not $Size[0]) Or (Not $Size[1]) Then
        Return 0
    EndIf

    Local $W, $H, $hGraphic, $hPic, $hImage, $hIcon

    _GDIPlus_Startup()
    $hPic = _GDIPlus_ImageLoadFromFile($sFile)
    $W = _GDIPlus_ImageGetWidth($hPic)
    $H = _GDIPlus_ImageGetHeight($hPic)
    If ($W < 0) Or ($H < 0) Then
        _GDIPlus_Shutdown()
        Return 0
    EndIf
    If $W < $H Then
        $W = $Size[0] * $W / $H
        $H = $Size[1]
    Else
        $H = $Size[1] * $H / $W
        $W = $Size[0]
    EndIf
    $hImage = DllCall($ghGDIPDll, 'int', 'GdipGetImageThumbnail', 'ptr', $hPic, 'int', $Size[0], 'int', $Size[1], 'ptr*', 0, 'ptr', 0, 'ptr', 0)
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage[4])
    _GDIPlus_GraphicsClear($hGraphic, 0)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hPic, ($Size[0] - $W) / 2, ($Size[1] - $H) / 2, $W, $H)
    $hIcon = DllCall($ghGDIPDll, 'int', 'GdipCreateHICONFromBitmap', 'ptr', $hImage[4], 'ptr*', 0)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage[4])
    _GDIPlus_ImageDispose($hPic)
    _GDIPlus_Shutdown()
    If Not $hIcon[2] Then
        Return 0
    EndIf
    _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon[2])
    _GUICtrlListView_SetItemImage($hWnd, $iIndex, _GUIImageList_GetImageCount($hImageList) - 1)
    _WinAPI_DestroyIcon($hIcon[2])
    Return 1
EndFunc   ;==>_GUICtrlListView_SetItemImageEx

Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam)

    Local $Pos

    Switch $hWnd
        Case $hForm
            $Pos = WinGetClientSize($hForm)
            WinMove($hListView, '', 0, 0, $Pos[0], $Pos[1])
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE
ругается на
Код:
$hImage = DllCall($ghGDIPDll, 'int', 'GdipGetImageThumbnail', 'ptr', $hPic, 'int', $Size[0], 'int', $Size[1], 'ptr*', 0, 'ptr', 0, 'ptr', 0)
- а именно на $ghGDIPDll, как это исправить? А то не могу посмотреть как работает, ничего не отображается , подскажи пожалуйста...
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
mmsgeorge сказал(а):
ругается на
Код:
$hImage = DllCall($ghGDIPDll, 'int', 'GdipGetImageThumbnail', 'ptr', $hPic, 'int', $Size[0], 'int', $Size[1], 'ptr*', 0, 'ptr', 0, 'ptr', 0)
- а именно на $ghGDIPDll, как это исправить? А то не могу посмотреть как работает, ничего не отображается , подскажи пожалуйста...
Попробуйте заменить эту переменную на эту
Код:
$__g_hGDIPDll
 
Верх