Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Открытие dll библиотеки иконок (http://forum.oszone.net/showthread.php?t=269825)

eus_deus 12-10-2013 21:38 2233382

Открытие dll библиотеки иконок
 
Привет! Нужно открывать библиотеку, выбирать иконку, и писать в переменные имя и номер иконки.
Пробовал DllCall - количество иконок ограничено 500, не хватает.
Смотрел на IconChoser.au3 - открыть файл получилось нормально, но выбора настроить не смог и не нашел правильного. Хотя этот вариант открыл все иконки с библиотеки.
Кто что может предложить?

Creat0R 13-10-2013 07:56 2233516

Цитата:

Цитата eus_deus
Нужно открывать библиотеку, выбирать иконку, и писать в переменные имя и номер иконки. »

Для чего?

eus_deus 13-10-2013 15:05 2233663

для выбора иконки с файла и получения строки вида - имя файла, иконка. Для использования потом в коде

Creat0R 14-10-2013 02:39 2233993

Цитата:

Цитата eus_deus
для выбора иконки с файла и получения строки вида - имя файла, иконка. Для использования потом в коде »

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <WinAPI.au3>

$hGUI = GUICreate('Icons', 150, 150, -1, -1, BitOR($WS_POPUP, $WS_BORDER))
GUISetState(@SW_SHOW, $hGUI)

$iLoading_Lbl = GUICtrlCreateLabel('Loading...', 10, 10)

$aIcons = _LoadIcons('shell32.dll')
$iRandom = Random(1, $aIcons[0][0], 1)
$iCenter = (150  / 2) - (32 / 2)

GUICtrlDelete($iLoading_Lbl)
GUICtrlCreateIcon($aIcons[$iRandom][0], $aIcons[$iRandom][1], $iCenter, $iCenter, 32, 32)

While 1
    $iMsg = GUIGetMsg()

    Switch $iMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _LoadIcons($sFile)
    Local $iIcons = _WinAPI_ExtractIconEx($sFile, -1, 0, 0, -1)
    Local $aIcons[$iIcons + 1][2] = [[$iIcons]]

    For $i = 1 To $iIcons
        $aIcons[$i][0] = $sFile
        $aIcons[$i][1] = -$i
    Next

    Return $aIcons
EndFunc


eus_deus 14-10-2013 16:12 2234291

Creat0R, ладно, понял - фигню. сморозил, фигню и получил.
Код нужен вот такого назначения, чтобы
Цитата:

Цитата Creat0R
выбора иконки с файла и получения строки вида - имя файла, иконка »

Код:

Func _iconselect()
    $stIcon = DllStructCreate('int') ;Структура для номера иконки
    ;преобразование строки имени файла в Unicode
    $nBuffersize = DllCall('KERNEL32.DLL', _
            'int', 'MultiByteToWideChar', _
            'int', 0, _
            'int', 0x00000001, _
            'str', $sFileName, _
            'int', -1, _
            'ptr', 0, _
            'int', 0)
    $stString = DLLStructCreate("byte[" & 2 * $nBuffersize[0] & "]")
    DllCall('KERNEL32.DLL', _
            'int', 'MultiByteToWideChar', _
            'int', 0, _
            'int', 0x00000001, _
            'str', $sFileName, _
            'int', -1, _
            'ptr', DllStructGetPtr($stString), _
            'int', $nBuffersize[0])
    ;Вызов функции диалога выбора значков
    DllCall('shell32.dll', _
            'none', 62, _
            'hwnd', 0, _
            'ptr', DllStructGetPtr($stString), _
            'int', DllStructGetSize($stString), _
            'ptr', DllStructGetPtr($stIcon))
    ;обратное преобразование строки имени файла в однобайтную кодировку
    $nBuffersize = DllCall('KERNEL32.DLL', _
            'int', 'WideCharToMultiByte', _
            'int', 0, _
            'int', 0x00000200, _
            'ptr', DllStructGetPtr($stString), _
            'int', -1, _
            'ptr', 0, _
            'int', 0, _
            'ptr', 0, _
            'ptr', 0)
    $stFile = DLLStructCreate('char[' & $nBuffersize[0] & ']')
    DllCall('KERNEL32.DLL', _
            'int', 'WideCharToMultiByte', _
            'int', 0, _
            'int', 0x00000200, _
            'ptr', DllStructGetPtr($stString), _
            'int', -1, _
            'ptr', DllStructGetPtr($stFile), _
            'int', $nBuffersize[0], _
            'ptr', 0, _
            'ptr', 0)
    $sFileName = DllStructGetData($stFile, 1)
    $nIconIndex = DllStructGetData($stIcon, 1) ;Получение номера иконки
    ;Контрольное сообщение
    ; Msgbox(262192, 'Info', _
    ;        'Выбран файл: ' & $sFileName & @CR & _
    ;        'Иконка: ' & $nIconIndex)
    GUICtrlSetData($sInput4, $nIconIndex)
    $stBuffer = 0
    $stFile = 0
    $stIcon = 0
EndFunc

Но этот открывает только не более 500 иконок с библиотеки

Creat0R 14-10-2013 21:00 2234431

Цитата:

Цитата eus_deus
Код нужен вот такого назначения »

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

А так:

Код:

$aRet = _PickIconDlg('shell32.dll', 2, WinGetHandle(''))

If Not @error Then
    ConsoleWrite('Icon: ' & $aRet[0] & @LF)
    ConsoleWrite('ID: ' & $aRet[1] & @LF)
EndIf

;Open Dialog to pick an icon of certain file.
Func _PickIconDlg($sFileName, $nIconIndex = 0, $hWnd = 0)
    Local $nRet, $aRetArr[2]

    $nRet = DllCall("shell32.dll", "int", "PickIconDlg", "hwnd", $hWnd, "wstr", $sFileName, "int", 1000, "int*", $nIconIndex)
    If @error Or Not $nRet[0] Then Return SetError(1, 0, -1)

    $aRetArr[0] = $nRet[2]
    $aRetArr[1] = $nRet[4]

    Return $aRetArr
EndFunc


eus_deus 14-10-2013 21:27 2234447

Цитата:

Цитата Creat0R
Т.е нужно просто вывести на экран диалог выбора иконки, и получить выбранную в нём иконку? »

да, вот только
Цитата:

Цитата eus_deus
открывает только не более 500 иконок с библиотеки »

а нужна вся библиотека

AZJIO 15-10-2013 23:33 2235162

eus_deus,
1. Известно что иконку можно вытащить по номеру
2. Известно что ListView может отобразить иконки в соотвествующем стиле
От вас требуется запустить цикл запроса иконок и тупо вставить их в ListView. Когда цикл перестанет возвращать иконки, значит они закончились и сделать выход из цикла.

eus_deus 16-10-2013 15:11 2235541

AZJIO, все так просто? Вечером обязательно попробую))

eus_deus 16-10-2013 20:45 2235721

не все просто)) ладно, фиг с ним, другим займусь

AZJIO 17-10-2013 03:41 2235865

Есть ещё "C:\Program Files\AutoIt3\Examples\GUI\Advanced\enumicons.au3"

Маленькие иконки 16х16
Код:

#include <WindowsConstants.au3>
#include <GuiImageList.au3>
#include <GuiListView.au3>

_Main()

Func _Main()
    Local $hImgLst, $hGui, $hLV, $n, $sPath

    ; Создаёт GUI и элементы
    $hGui = GUICreate("Иконки", 200, 560, -1, -1, $WS_OVERLAPPEDWINDOW + $WS_POPUP)
    $hLV = GUICtrlCreateListView('Иконки', 3, 3, 200 - 10, 560 - 10)

    $sPath = @SystemDir & '\shell32.dll'
    ; $sPath = @SystemDir & '\wmploc.dll'
    ; Загружает изображения

    $hImgLst = _GUIImageList_Create(16, 16, 5, 1 + 4, 0, 1)
    $n = 0
    Do
        _GUIImageList_AddIcon($hImgLst, $sPath, $n)
        $n += 1
    Until @error
    _GUICtrlListView_SetImageList($hLV, $hImgLst, 1)

    $n -= 2
    WinSetTitle($hGui, '', $n + 1 & ' иконок')
    For $i = 0 To $n
        _GUICtrlListView_AddItem($hLV, $i, $i)
    Next
    GUISetState()

    While 1
        Switch GUIGetMsg()
            Case -3
                Exit
        EndSwitch
    WEnd
EndFunc
  ;==>_Main

Большие иконки 32х32
Код:

#include <WindowsConstants.au3>
#include <GuiImageList.au3>
#include <GuiListView.au3>

_Main()

Func _Main()
    Local $hImgLst, $hGui, $hLV, $n, $sPath

    ; Создаёт GUI и элементы
    $hGui = GUICreate("Иконки", 700, 560, -1, -1, $WS_OVERLAPPEDWINDOW + $WS_POPUP)
    $hLV = GUICtrlCreateListView('Иконки', 3, 3, 700 - 10, 560 - 10, $LVS_LIST + $LVS_ICON)

    $sPath = @SystemDir & '\shell32.dll'
    ; $sPath = @SystemDir & '\wmploc.dll'
    ; Загружает изображения

    $hImgLst = _GUIImageList_Create(32, 32, 5, 1 + 4, 0, 1)
    $n = 0
    Do
        _GUIImageList_AddIcon($hImgLst, $sPath, $n, True)
        $n += 1
    Until @error
    _GUICtrlListView_SetImageList($hLV, $hImgLst, 1)

    $n -= 2
    WinSetTitle($hGui, '', $n + 1 & ' иконок')
    For $i = 0 To $n
        _GUICtrlListView_AddItem($hLV, $i, $i)
    Next
    ; _GUICtrlListView_SetView($hLV, 3)
    GUISetState()

    While 1
        Switch GUIGetMsg()
            Case -3
                Exit
        EndSwitch
    WEnd
EndFunc
  ;==>_Main


eus_deus 20-10-2013 17:00 2237852

спасибо, буду пробовать подстроить под себя


Время: 00:03.

Время: 00:03.
© OSzone.net 2001-