Что нового

GUICtrlSetImage для кнопки $BS_ICON если iconname строка. Баг?

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
GUICtrlSetImage($Icon1, 'gui_set_ico.exe', $index, 0)
GUICtrlSetImage($Button1, 'gui_set_ico.exe', $index, 0)

Вот простой код, для кнопки и для иконки, я задаю одинаковое изображение.
Если индекс будет число, то иконки установятся правильно, а если строка, например ICO_RESET,
то для кнопки иконка не установиться, точнее установится, но не та, а самая первая из ресурса.

Вот у меня на изображении 2 ехе, в первом(modem.exe) именные иконки, вот их я и не могу ставить на кнопку, всегда ставиться CONFIRM.
 

Вложения

  • 2015-08-17_121523.png
    2015-08-17_121523.png
    7.2 КБ · Просмотры: 21

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Так в чем вопрос? Можете использовать порядковые номера (со знаком "-") или же переименовать именные иконки. Следующий вызов должен загрузить ICO_RESET (порядковый номер 1).

Код:
GUICtrlSetImage($Button1, 'gui_set_ico.exe', -1, 0)
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
AutoIt не умеет вытаскивать иконки по именам, это умеет только редактор ресурсов.
Для того, чтобы посмотреть "имя" иконки в экзешнике (не индекс, а имя, каким его видит AutoIt), запустите пример \AutoIt3\Examples\GUI\Advanced\enumicons.au3 из штатной установки.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Я хочу имена использовать. Для GUICtrlCreateIcon вытаскивается и устанавливаются правильно, а для кнопок уже нет.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
veretragna сказал(а):
AutoIt не умеет вытаскивать иконки по именам, это умеет только редактор ресурсов.
Первый раз про это слышу. По именам умеют вытаскивать как нативные функции AutoIt, например GUICtrlCreateIcon() или GUICtrlSetImage(), так и _WinAPI_*.
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Yashied сказал(а):
veretragna сказал(а):
AutoIt не умеет вытаскивать иконки по именам, это умеет только редактор ресурсов.
Первый раз про это слышу. По именам умеют вытаскивать как нативные функции AutoIt, например GUICtrlCreateIcon() или GUICtrlSetImage(), так и _WinAPI_*.

Возможно, мои сведения уже устарели. Несколько лет назад я пробовал сделать GUI и использовал GUICtrlCreateIcon() для извлечения иконки по имени, но иконка создавалась пустой. Получилось сделать только по индексу.
Спасибо за замечание, пойду курить мануалы.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
inververs, можете кратенький пример с кнопкой набросать, ну и файл с иконкой приложить?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Если не компилировать, то circle_blue.ico и circle_blue.ico установятся.

Если скомпилировать, то circle_blue и circle_green установяться правильно только в ICO, у кнопки же будет всегда иконка с первым ресурсом.
А 101 и 102 установятся правильно и туда и туда.
 

Вложения

  • test.zip
    2.3 КБ · Просмотры: 4
  • 2015-08-17_140829.png
    2015-08-17_140829.png
    27.3 КБ · Просмотры: 13
  • 2015-08-17_140933.png
    2015-08-17_140933.png
    26 КБ · Просмотры: 14

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Просто тут два варианта. Если вы очень хотите использовать имена и функцию GUICtrlSetImage(), то, возможно, это действительно баг. Тогда пишите репорт и ждите обновлений. Если больше важна функциональность скрипта, то тут есть несколько вариантов исправления ситуации.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Не очень хочу, я уже переписал с индексами, но все же.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Похоже, что это действительно баг в функции GUICtrlSetImage(). Поправить это дело можно, но, IMHO, проще перейти на индексы. Для кнопки примерный код будет выглядеть так (все проверки я опустил). Вытаскиваем необходимую иконку:

Код:
If Not @Compiled Then
;	$hInstance = _WinAPI_LoadLibraryEx(..., $LOAD_LIBRARY_AS_DATAFILE)
Else
	$hInstance = _WinAPI_GetModuleHandle('')
EndIf
$hResource = _WinAPI_FindResource($hInstance, $RT_GROUP_ICON, $iconname) ; Здесь важен тип переменной $iconname!!!
$hData = _WinAPI_LoadResource($hInstance, $hResource)
$pData = _WinAPI_LockResource($hData)
$iIcon = _WinAPI_LookupIconIdFromDirectoryEx($pData, 1, 16, 16)
$hResource = _WinAPI_FindResource($hInstance, $RT_ICON, $iIcon)
$iSize = _WinAPI_SizeOfResource($hInstance, $hResource)
$hData = _WinAPI_LoadResource($hInstance, $hResource)
$pData = _WinAPI_LockResource($hData)
$hIcon = _WinAPI_CreateIconFromResourceEx($pData, $iSize)
If Not @Compiled Then
;	_WinAPI_FreeLibrary($hInstance)
EndIf


Устанавливаем иконку на кнопку:

Код:
$hPrev = GUICtrlSendMsg($ButtonWithIco, $BM_SETIMAGE, 1, $hIcon)
If $hPrev Then
	_WinAPI_DestroyIcon($hPrev)
EndIf


P.S

Данный код проверил на вашем примере, зеленая иконка устанавливается. 101 и 102 не устанавливаются, т.к. имеют строковый тип (менять не стал).
 
Верх