Что нового

[Элементы GUI] Иконка на кнопке

The_Immortal

Новичок
Сообщения
84
Репутация
4
Всех приветствую!

Друзья, подскажите, пожалуйста, по следующим вопросам:

1. Каким образом встроить иконку, помещенную на кнопку, в скрипт?
Код:
$Button1 = GUICtrlCreateButton("На печать", 99, 112, 83, 49, $BS_ICON)
GUICtrlSetImage(-1, "C:\icons\printer.ico", -1)
- таким образом, файл printer.ico лежит отдельно, а мне бы хотелось его встроить в скрипт.

2. Возможно ли на кнопке отобразить Caption, если там уже расположена иконка?
11.25.2015-18.16.png
- на представленной кнопке хотелось бы отобразить ещё и надпись, но она не отображается, даже если увеличить размер кнопки. Понятное дело, что можно самой иконке подрисовать желаемую надпись, но может быть есть другой вариант?


Спасибо!
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Тема к прочтению обязательна.
http://autoit-script.ru/index.php?topic=2849.msg20795#msg20795
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Чтобы отображался текст и иконка, нужен примерно что то типа такого. Спасибо Yashied'у за код :smile:
Код:
#include <WinAPIEx.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <Memory.au3>
#include <GDIPlus.au3>

Global $hHdr[][2] = [['PRINTER', 0]]
Global $hLibrary = _WinAPI_GetModuleHandle('')

_Initialize()

$hMain_GUI = GUICreate("Print", 300, 300, -1, 5)
$hSave_Button = GUICtrlCreateButton("    Сохранить", 50, 100, 200, 30)
GUICtrlSendMsg($hSave_Button, $BM_SETIMAGE, $IMAGE_BITMAP, $hHdr[0][1])

GUISetState(@SW_SHOW)


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

Func _Initialize()
	_GDIPlus_Startup("gdiplus.dll")

	;Создаем массив изображений загруженных из ресурсов

	For $i = 0 To UBound($hHdr) - 1
		$hImage = _LoadResImage($hLibrary, 'PNG', $hHdr[$i][0])
		$hHdr[$i][1] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
		If $hImage Then _GDIPlus_ImageDispose($hImage)
	Next

	_GDIPlus_Shutdown()
EndFunc   ;==>_Initialize

Func _LoadResImage($hInstance, $sResType, $sResName)
	Local $hInfo, $hData, $pData, $iSize, $hMem, $pMem, $hStream, $hImage

	$hInfo = _WinAPI_FindResource($hInstance, $sResType, $sResName)
	$hData = _WinAPI_LoadResource($hInstance, $hInfo)
	$iSize = _WinAPI_SizeOfResource($hInstance, $hInfo)
	$pData = _WinAPI_LockResource($hData)
	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	$hMem = _MemGlobalAlloc($iSize, $GMEM_MOVEABLE)
	$pMem = _MemGlobalLock($hMem)
	_MemMoveMemory($pData, $pMem, $iSize)
	_MemGlobalUnlock($hMem)
	$hStream = _WinAPI_CreateStreamOnHGlobal($hMem)
	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	_GDIPlus_Startup()
	$hImage = _GDIPlus_BitmapCreateFromStream($hStream)
	_GDIPlus_Shutdown()
	_WinAPI_ReleaseStream($hStream)

	Return $hImage
EndFunc   ;==>_LoadResImage


EXE-файл соответственно должен содержать PNG ресурс PRINTER. Очень удобно работать используя SciTe Yashied Edition
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
Medic84, пока пытаюсь понять основы, указанные Вами во втором посту.

Беру пример из Фака:

Код:
#Region
#AutoIt3Wrapper_Icon=MyProg.ico
#AutoIt3Wrapper_Res_Icon_Add=CPU.ico
#EndRegion

#Include <Icons.au3>

GUICreate("MyProg", 256, 256)
$Icon = GUICtrlCreateIcon("", 0, 64, 64, 128, 128)
GUICtrlSetImage($Icon, @ScriptFullPath, 201)
GUISetState()

Do
Until GUIGetMsg() = -3


MyProg.ico и CPU.ico находятся в одном каталоге вместе со скриптом. Компилирую скрипт в SciTE-Lite. На выходе получаю:
11.25.2015-19.04.png

вместо
post_img_017.png


Проверил полученный exe также Res-хакером - там пусто...

Где я дурак?

[?]
Очень удобно работать используя SciTe Yashied Edition
А где бы это взять? ??? Загуглил по названию - не нашлось...
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
The_Immortal [?]
А где бы это взять?
http://autoit-script.ru/index.php?topic=18986.0

Беру пример из Фака
К сожалению, действия описаны на старой версии, сейчас же есть директивы #pragma. И сейчас нужно создавать .res файлы что бы что то добавить в EXE автоматически.
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
InnI, :friends:

Только всё равно не удалось. Через полную версию SciTE не удалось скопмилить вышеуказанный код, проблемы в Icons.au3:

11.25.2015-19.34.png
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
The_Immortal
В той же теме ответы #4 и #6.
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
InnI, огромнейшее спасибо, всё получилось!

P.S. Неплохо было бы всю эту информацию отдельным примечанием поместить в тот FAQ.



UPD:
Medic84, со встроенной иконкой получилось, а вот "текст + иконка" пока реализовать не удалось.
[?]
EXE-файл соответственно должен содержать PNG ресурс PRINTER.
В начале указал:
Код:
Global $hLibrary = _WinAPI_GetModuleHandle("C:\test1.exe")


test1.exe содержит PNG ресурс PRINTER:
11.25.2015-22.21.png


Однако, изображение на кнопки всё равно не появляется...

Что я делаю не так? :-\
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
У меня все работает. Ничего не менял.
 

Вложения

  • Screenshot_6.png
    Screenshot_6.png
    85 КБ · Просмотры: 40
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
Medic84, бррр... Я не могу понять откуда берется само изображение-то? Из какого конкретно файла? Resources.res? Вы не могли бы его приложить?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
The_Immortal, _GUICtrlButton_SetImageList(), это все, что вам нужно. Посмотрите в справке пример к этой функции, там все просто.
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
Yashied, а можно как-то использовать данную функцию с уже вшитой иконкой? Там в примерах в список добавляются изображения из dll. У меня же изображение уже сидит внутри самого исполняемого exe:

Код:
#Region
#AutoIt3Wrapper_Res_Icon_Add=printer.ico
#EndRegion

; ...

$hImage = _GUIImageList_Create(32, 32, 0)
_GUIImageList_AddIcon($hImage, 201, 0) ; "201" - нужная иконка.
$Button1 = GUICtrlCreateButton("На печать", 99, 112, 163, 89)
_GUICtrlButton_SetImageList($Button1,$hImage)
- но так не получается...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
_GUIImageList_AddIcon($hImageList, @ScriptFullPath, -201)


Если нужно использовать иконку с размерами отличными от 16х16 или 32х32, то делайте так (да и вообще, лучше всегда использовать этот метод):

Код:
$hIcon = _WinAPI_ShellExtractIcon(@ScriptFullPath, -201, 48, 48)
_GUIImageList_ReplaceIcon($hImageList, -1, $hIcon)
_WinAPI_DestroyIcon($hIcon)
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
Yashied,

1.
Код:
$Button1 = GUICtrlCreateButton("На печать", 51, 48, 131, 97)
$hImageList = _GUIImageList_Create(32, 32, 5)
_GUIImageList_AddIcon($hImageList, @ScriptFullPath, -201)
_GUICtrlButton_SetImageList($Button1,$hImageList,4,Default,50)


11.26.2015-17.31.png



2.
Код:
$Button1 = GUICtrlCreateButton("На печать", 51, 48, 131, 97)
$hImageList = _GUIImageList_Create(32, 32, 5)
$hIcon = _WinAPI_ShellExtractIcon(@ScriptFullPath, -201, 32, 32)
_GUIImageList_ReplaceIcon($hImageList, -1, $hIcon)
_WinAPI_DestroyIcon($hIcon)
_GUICtrlButton_SetImageList($Button1,$hImageList,4,Default,50)


11.26.2015-17.34.png



Вот такие вот странные результаты... В первом случае иконка странная, хотя я указываю в функции "_GUIImageList_Create" параметр "5 - Use a 32 bit DIB section". Во втором у текста почему-то убегает жирность :scratch: Не знаете, с чем это может быть связано? Да и, кстати, можно ли как-то подвинуть текст вверх или вниз? А то получается некрасивое пространство сверху... Хотелось бы в итоге получить что-то типа такого - под цифрой 1.
 

Yashied

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

Код:
_GUIImageList_AddIcon($hImageList, @ScriptFullPath, -201, 1)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Выложите полный код создания GUI (кнопки). По умолчанию текст не должен быть жирным.
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
Yashied, да это я запутался... С "жирностью" всё в порядке.

[?]
можно ли как-то подвинуть текст вверх или вниз? А то получается некрасивое пространство сверху... Хотелось бы в итоге получить что-то типа такого [nofollow] - под цифрой 1.
Полагаю, что для этого надо убирать название кнопки вообще и использовать Строки для отображения надписи?
 
Верх