Что нового

применить встроенную картинку к кнопке

saraconor

Новичок
Сообщения
404
Репутация
3
Код:
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>
#include <Icons.au3>
#include <WinAPIEX.au3>
#include <ButtonConstants.au3>
Global $Form1 = GUICreate("", 575, 247, -1, -1, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_LAYERED)),  $PicBack[10]
GUISetBkColor(0xFFFFFE)
$PicBack[1] = GUICtrlCreatePic('', 0, 0, 575, 247)
GUICtrlSetState(-1, $GUI_DISABLE)
_WinAPI_SetLayeredWindowAttributes($Form1, 0xFFFFFE, 255)
$Bt_U_L = GUICtrlCreateButton('',155,44,259,33,$BS_BITMAP)
GUICtrlSetImage ($Bt_U_L, $PicBack[2]) ;тут нужно чтобы картинка назначилась кнопке

GUISetState()
If Not @Compiled Then
	for $t = 1 to 4
	_SetImage($PicBack[$t], @ScriptDir & '\' & $t & ".bmp")
	next
Else
	$hInstance = _WinAPI_GetModuleHandle(0)
	_GDIPlus_Startup()
	for $t = 1 to 4
	$hImage = _LoadResourceImage($hInstance, 'bmp', $t)
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
	_GDIPlus_ImageDispose($hImage)
	_SetHImage($PicBack[$t], $hBitmap)
	_WinAPI_DeleteObject($hBitmap)
	next
	_GDIPlus_Shutdown()
EndIf

While 1 ;цикл сканирования кнопок
    $nMsg = GUIGetMsg()
	Switch $nMsg
		Case $Bt_U_L
			GUICtrlSetImage ($Bt_U_L, $PicBack[3]) ;тут нужно чтобы картинка кнопки изменилась
			sleep(500)
			exit
	 EndSwitch
wend

Func _LoadResourceImage($hInstance, $sResType, $sResName, $iResLanguage = 0)
	Local $hInfo, $hData, $pData, $iSize, $hMem, $pMem, $hStream, $hImage
	If $iResLanguage Then
		$hInfo = _WinAPI_FindResourceEx($hInstance, $sResType, $sResName, $iResLanguage)
	Else
		$hInfo = _WinAPI_FindResource($hInstance, $sResType, $sResName)
	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 = DllCall("kernel32.dll", "ptr", "GlobalAlloc", "uint", 2, "ulong_ptr", $iSize)
	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	$pMem = DllCall("kernel32.dll", "ptr", "GlobalLock", "ptr", $hMem[0])
	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	DllCall("kernel32.dll", "none", "RtlMoveMemory", "ptr", $pMem[0], "ptr", $pData, "ulong_ptr", $iSize)
	DllCall("kernel32.dll", "int", "GlobalUnlock", "ptr", $hMem[0])
	$hStream = _WinAPI_CreateStreamOnHGlobal($hMem[0])
	If @error Then
		Return SetError(1, 0, 0)
	EndIf
	_GDIPlus_Startup()
	$hImage = DllCall("gdiplus.dll", "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "ptr*", 0)
	If (@error) Or ($hImage[0]) Or (Not $hImage[2]) Then
		$hImage = 0
	EndIf
	_GDIPlus_Shutdown()
	DllCall("kernel32.dll", "ptr", "GlobalFree", "ptr", $hMem[0])
	If Not IsArray($hImage) Then
		Return SetError(1, 0, 0)
	EndIf
	Return $hImage[2]
EndFunc


Как можно назначить картинку кнопке в этом случае? А потом в ходе работы скрипта, как ее изменить можно?
 

Вложения

  • скрипт.rar
    66.6 КБ · Просмотры: 7

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Чего-то не понимаю, а почему бы не сделать проще?
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>

Global $iFlag = 0, $PicBack[4] = ['1.bmp', '2.bmp', '3.bmp', '4.bmp']
Global $Form1 = GUICreate("", 575, 247, -1, -1, $WS_POPUP, BitOR($WS_EX_COMPOSITED, $WS_EX_CONTROLPARENT))
$Bt_U_L = GUICtrlCreateButton(' ', 155, 44, 259, 33, $BS_BITMAP)
GUICtrlSetImage(-1, $PicBack[1])
GUICtrlCreatePic($PicBack[0], 0, 0, 575, 247)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $Bt_U_L
			GUICtrlSetImage($Bt_U_L, $PicBack[2])
	EndSwitch
WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
код вообще ацкий.
одни вопросы
Код:
Global $Form1 = GUICreate("", 575, 247, -1, -1, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST, $WS_EX_LAYERED)), $PicBack[4] = ['1.bmp', '2.bmp', '3.bmp', '4.bmp']
GUISetBkColor(0xFFFFFE)
$PicBack1 = GUICtrlCreatePic('', 0, 0, 575, 247)
GUICtrlSetState(-1, $GUI_DISABLE)
_WinAPI_SetLayeredWindowAttributes($Form1, 0xFFFFFE, 255)
$Bt_U_L = GUICtrlCreateButton('', 155, 44, 259, 33, $BS_BITMAP)
GUICtrlSetImage($Bt_U_L, $PicBack[1]) ;тут нужно чтобы картинка назначилась кнопке

GUISetState()
Local $pic
If Not @Compiled Then
	For $t = 0 To 3
		$pic = @ScriptDir & '\' & $PicBack[$t]
		_SetImage($PicBack1, $pic, 200, 200)
	Next
Else
	$hInstance = _WinAPI_GetModuleHandle(0)
	_GDIPlus_Startup()
	For $t = 0 To 3
		$hImage = _LoadResourceImage($hInstance, 'bmp', $t)
		$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
		_GDIPlus_ImageDispose($hImage)
		_SetHImage($PicBack1, $hBitmap)
		_WinAPI_DeleteObject($hBitmap)
	Next
	_GDIPlus_Shutdown()
EndIf

While 1 ;цикл сканирования кнопок
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $Bt_U_L
			GUICtrlSetImage($Bt_U_L, $PicBack[2]) ;тут нужно чтобы картинка кнопки изменилась
			Sleep(500)
			Exit
	EndSwitch
WEnd
зачем объекту картинка массив?
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
joiner сказал(а):
зачем объекту картинка массив?
Там несколько картинок должно быть встроено для кнопок.


Добавлено:
Сообщение автоматически объединено:

xXx сказал(а):
Чего-то не понимаю, а почему бы не сделать проще?
чтобы скрипт был в одном файле exe, без дополнительных библиотек \ распаковок в temp итп.
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
решение найдено, тему можно удалить.
 
Верх