Что нового

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

The_Immortal

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

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

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

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


Спасибо!
 

Medic84

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

Medic84

Омега
Команда форума
Администратор
Сообщения
1 569
Репутация
333
Чтобы отображался текст и иконка, нужен примерно что то типа такого. Спасибо 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

Новичок
Сообщения
83
Репутация
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. На выходе получаю:

вместо


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

Где я дурак?

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

Medic84

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

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

The_Immortal

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

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

 

InnI

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

The_Immortal

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

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



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


test1.exe содержит PNG ресурс PRINTER:


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

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

Medic84

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

Вложения

Автор
T

The_Immortal

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

Yashied

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

The_Immortal

Новичок
Сообщения
83
Репутация
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 711
Код:
_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

Новичок
Сообщения
83
Репутация
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)





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)





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

Yashied

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

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

Yashied

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

The_Immortal

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

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