Что нового

Skin UDF - Создание элементов Button из подготовленных изображений

Yashied

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

Категория: Элементы GUI

Описание: Skin UDF позволяет создавать элементы Button из заранее поготовленных изображений (файлы, ресурсы и т.д.). Я переписал библиотеку с помощью GDI+ (первая версия использовала GDI). Это позволило добавить много дополнительных возможностей и избавиться от проблем, связанных с прозрачностью. Тем не менее, библиотека имеет статус бета-версии, поэтому нет подробного описания функций. Но я уверен, что представленный ниже пример дает полное представление о возможностях этой библиотеки. Я надеюсь, что многие пользователи найдут для себя это полезным. Если возникнут какие-либо вопросы касательно UDF, то пожалуйста спрашивайте в этой теме.

Список функций:
_Skin_AddButton
_Skin_AddButtonEx
_Skin_DeleteButton
_Skin_Destroy
_Skin_DisableButton
_Skin_EnableFocus
_Skin_EnableKBInput
_Skin_Helper
_Skin_SetButton
_Skin_SetButtonEx
_Skin_SetFocusRect

Файл(ы): Skin.zip

Пример:
Код:
#Include <GUIConstantsEx.au3>
#Include <Skin.au3>

Global $Button[3]

$hForm = GUICreate('MyGUI', 278, 106)

GUICtrlCreatePic('background.bmp', 0, 0, 278, 106)
GUICtrlSetState(-1, $GUI_DISABLE)

; Create buttons from PNG images (images should be located in the same folder as the script)
$Button[0] = _Skin_AddButton(20 , 20, 66, 66, 'red_normal.png', 'red_hover.png', 'red_click.png', 'disable.png', 'alpha.png', 1)
$Button[1] = _Skin_AddButton(106, 20, 66, 66, 'yellow_normal.png', 'yellow_hover.png', 'yellow_click.png', 'disable.png', 'alpha.png', 1)
$Button[2] = _Skin_AddButton(192, 20, 66, 66, 'green_normal.png', 'green_hover.png', 'green_click.png', 'disable.png', 'alpha.png', 1)

#cs

; Create buttons from GDI+ HBITMAP handles
$Button[0] = _Skin_AddButtonEx(20 , 20, 64, 64, _GDIPlus_BitmapCreateFromFile('red_normal.png'), ..., 1, 1)
$Button[1] = _Skin_AddButtonEx(104, 20, 64, 64, _GDIPlus_BitmapCreateFromFile('yellow_normal.png'), ..., 1, 1)
$Button[2] = _Skin_AddButtonEx(188, 20, 64, 64, _GDIPlus_BitmapCreateFromFile('green_normal.png'), ..., 1, 1)

#ce

; Disable "Yellow" button (Optional)
_Skin_DisableButton($Button[1], 1)

; Enable keyboard input (Optional)
_Skin_EnableKBInput(1)

; Set margins for dotted focus rectangle (Optional)
For $i = 0 To 2
	_Skin_SetFocusRect($Button[$i], 5, 5, 56, 56)
Next

; Enable dotted focus rectangle (Optional)
_Skin_EnableFocus(1)

GUISetState()

; _Skin_Helper() must be called continuously in the main loop
While 1
	_Skin_Helper($hForm)
	$ID = GUIGetMsg()
	Switch $ID
		Case 0
			ContinueLoop
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $Button[0]
			ConsoleWrite('Red' & @CR)
		Case $Button[1]
			ConsoleWrite('Yellow' & @CR)
		Case $Button[2]
			ConsoleWrite('Green' & @CR)
		Case Else

	EndSwitch
WEnd

; You must delete all created buttons before destroying the appropriate window
;~For $i = 0 To 2
;~	_Skin_DeleteButton($Button[$i])
;~Next

Скриншот:

Skin.png

Источник: Skin UDF (официальный форум)
Автор: Yashied
 
Автор
Yashied

Yashied

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

Код:
#Region Resources
#AutoIt3Wrapper_Res_File_Add=background.bmp, 2, 200
#AutoIt3Wrapper_Res_File_Add=red_normal.png, PNG, RED_NORMAL
#AutoIt3Wrapper_Res_File_Add=red_hover.png, PNG, RED_HOVER
#AutoIt3Wrapper_Res_File_Add=red_click.png, PNG, RED_CLICK
#AutoIt3Wrapper_Res_File_Add=yellow_normal.png, PNG, YELLOW_NORMAL
#AutoIt3Wrapper_Res_File_Add=yellow_hover.png, PNG, YELLOW_HOVER
#AutoIt3Wrapper_Res_File_Add=yellow_click.png, PNG, YELLOW_CLICK
#AutoIt3Wrapper_Res_File_Add=green_normal.png, PNG, GREEN_NORMAL
#AutoIt3Wrapper_Res_File_Add=green_hover.png, PNG, GREEN_HOVER
#AutoIt3Wrapper_Res_File_Add=green_click.png, PNG, GREEN_CLICK
#AutoIt3Wrapper_Res_File_Add=alpha.png, PNG, ALPHA
#EndRegion Resources

#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <Memory.au3>
#Include <Skin.au3>
#Include <WinAPIEx.au3>

Global $hInstance = _WinAPI_GetModuleHandle('')
Global $hBitmap[10] = ['RED_NORMAL', 'RED_HOVER', 'RED_CLICK', 'YELLOW_NORMAL', 'YELLOW_HOVER', 'YELLOW_CLICK', 'GREEN_NORMAL', 'GREEN_HOVER', 'GREEN_CLICK', 'ALPHA']
Global $Button[3]

_GDIPlus_Startup()
For $i = 0 To 9
	$hBitmap[$i] = _LoadResourceImage($hInstance, 'PNG', $hBitmap[$i])
Next
_GDIPlus_Shutdown()

$hForm = GUICreate('MyGUI', 278, 106)
GUICtrlCreatePic('', 0, 0, 278, 106)
GUICtrlSendMsg(-1, 0x0172, 0, _WinAPI_LoadBitmap($hInstance, 200))
GUICtrlSetState(-1, $GUI_DISABLE)
$Button[0] = _Skin_AddButtonEx(20 , 20, 66, 66, $hBitmap[0], $hBitmap[1], $hBitmap[2], 0, $hBitmap[9], 1)
$Button[1] = _Skin_AddButtonEx(106, 20, 66, 66, $hBitmap[3], $hBitmap[4], $hBitmap[5], 0, $hBitmap[9], 1)
$Button[2] = _Skin_AddButtonEx(192, 20, 66, 66, $hBitmap[6], $hBitmap[7], $hBitmap[8], 0, $hBitmap[9], 1)
_Skin_EnableKBInput(1)
For $i = 0 To 2
	_Skin_SetFocusRect($Button[$i], 5, 5, 56, 56)
Next
_Skin_EnableFocus(1)
GUISetState()

While 1
	_Skin_Helper($hForm)
	$ID = GUIGetMsg()
	Switch $ID
		Case 0
			ContinueLoop
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $Button[0]
			ConsoleWrite('Red' & @CR)
		Case $Button[1]
			ConsoleWrite('Yellow' & @CR)
		Case $Button[2]
			ConsoleWrite('Green' & @CR)
		Case Else

	EndSwitch
WEnd

Func _LoadResourceImage($hInstance, $sType, $sName, $iLanguage = 0)

	Local $hInfo, $hData, $pData, $iSize, $hMem, $pMem, $pStream, $hBitmap

	If Not $hInstance Then
		$hInstance = _WinAPI_GetModuleHandle('')
	EndIf
	If $iLanguage Then
		$hInfo = _WinAPI_FindResourceEx($hInstance, $sType, $sName, $iLanguage)
	Else
		$hInfo = _WinAPI_FindResource($hInstance, $sType, $sName)
	EndIf
	$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)
	_WinAPI_MoveMemory($pMem, $pData, $iSize)
	_MemGlobalUnlock($hMem)
	$pStream = _WinAPI_CreateStreamOnHGlobal($hMem)
	_GDIPlus_Startup()
	$hBitmap = _GDIPlus_BitmapCreateFromStream($pStream)
	_GDIPlus_Shutdown()
	_WinAPI_ReleaseStream($pStream)
	If Not $hBitmap Then
		Return SetError(2, 0, 0)
	EndIf
	Return $hBitmap
EndFunc   ;==>_LoadResourceImage

#cs

Func _GDIPlus_BitmapCreateFromStream($pStream)

	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipCreateBitmapFromStream', 'ptr', $pStream, 'handle*', 0)

	If (@Error) Or ($Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Return $Ret[2]
EndFunc   ;==>_GDIPlus_BitmapCreateFromStream

#ce
 

saraconor

Новичок
Сообщения
418
Репутация
3
Пожалуйста, вы можете привести пример функции _Skin_SetButton ?
 

Kasper

Знающий
Сообщения
70
Репутация
8
Можешь перезалить а то не возможно скачать
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
https://www.autoitscript.com/forum/topic/166535-skin-udf/
 
Верх