Что нового

Прикрепление прозрачного PNG к кнопке

Makrut

Новичок
Сообщения
44
Репутация
2
Здравствуйте. У меня возникла необходимость в том, чтобы GUICtrlCreateButton выглядел, как заданное мной png изображение с прозрачным фоном (прикрепил пример изображения, если вдруг как-то криво объяснил). Прошу совета, как это можно реализовать и можно ли вообще.

Заранее благодарю.

p.s поиск по сайту у меня не работает, а при поиске вручную я наткнулся только на GUICtrlCreatePic.
 

Вложения

  • 1460393134_computer.png
    1460393134_computer.png
    2.1 КБ · Просмотры: 111

shyra1976

Новичок
Сообщения
71
Репутация
0
Код:
#include "transparency.au3"

;~ $temp = "Path\mm.PNG"

Transp_PNG($temp,255)



эта функция


Код:
;~ -------------------------------------------------------
; Description	:
; Written by	:  Creat0R
; Date			: 24/09/2008
;
;
; --------------------------------------------------------


#include-once

; Transp_PNG( $temp , x , y),$temp = "E:\VBA\AutoIt\GUI\2.png"
; $temp- Doroga k file
; x - prozrachnost
; y- Plavnost poiavleniia


#NoTrayIcon
#include <GDIPlus.au3>
;~ #include <GuiComboBox.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>


;~ Global Const $WM_LBUTTONDOWN = 0x0201
;~ Global Const $WM_LBUTTONUP = 0x0202
;~ Global Const $ULW_ALPHA = 2

Global Const $AC_SRC_ALPHA = 1
Global $launchDir = @DesktopDir, $GUI

Global $iExitLoop = False


Func Transp_PNG($pngSrc, $iOpacity = 100, $EnableFade = False)
	Local $hImage,$width,$height,$BtnExit
;~ 	ConsoleWrite( $temp & @LF)
	If $iOpacity < 0 Then $iOpacity = 0
	If $iOpacity > 255 Then $iOpacity = 255

	; Load PNG file as GDI bitmap
	_GDIPlus_Startup()
;~ 	$pngSrc = $temp
	$hImage = _GDIPlus_ImageLoadFromFile($pngSrc)

	; Extract image width and height from PNG
	$width = _GDIPlus_ImageGetWidth($hImage)
	$height = _GDIPlus_ImageGetHeight($hImage)

	; Create layered window

	$GUI = GUICreate("", $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
	WinSetOnTop($GUI, "", 1)

	GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN")
	GUIRegisterMsg($WM_LBUTTONUP, "WM_LBUTTONUP")
	GUIRegisterMsg($WM_WINDOWPOSCHANGED, "WM_WINDOWPOSCHANGED")

	GUISetState()

	If $EnableFade Then
		;fade in png background
		For $i = 0 To $iOpacity Step 1
			SetBitmap($GUI, $hImage, $i)
		Next
	Else
		SetBitmap($GUI, $hImage, $iOpacity)
	EndIf

	; set default button for Enter key activation - renders outside GUI window
	$BtnExit = GUICtrlCreateButton("Exit", $width, $height, 10, 10, $BS_DEFPUSHBUTTON)

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE, $BtnExit
				ExitLoop
		EndSwitch

		If $iExitLoop Then ExitLoop
	WEnd

	If $EnableFade Then
		;fade out png background
		For $i = $iOpacity To 0 Step -1
			SetBitmap($GUI, $hImage, $i)
		Next
	Else
		SetBitmap($GUI, $hImage, 0)
	EndIf
EndFunc   ;==>Transp_PNG

; Handle the WM_LBUTTONDOWN for the layered window so it can be dragged by clicking anywhere on the image.
Func WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
	If BitAND(WinGetState($hWnd), 32) Then Return $GUI_RUNDEFMSG
	DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", $WM_SYSCOMMAND, "int", 0xF009, "int", 0)
EndFunc   ;==>WM_LBUTTONDOWN

Func WM_LBUTTONUP($hWnd, $iMsg, $wParam, $lParam)
	$iExitLoop = True
EndFunc   ;==>WM_LBUTTONUP

Func WM_WINDOWPOSCHANGED($hWnd, $iMsg, $wParam, $lParam)
	$iExitLoop = False
EndFunc   ;==>WM_WINDOWPOSCHANGED

; SetBitMap
Func SetBitmap($hGUI, $hImage, $iOpacity)
	Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

	$hScrDC = _WinAPI_GetDC(0)
	$hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
	$hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
	$tSize = DllStructCreate($tagSIZE)
	$pSize = DllStructGetPtr($tSize)
	DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
	DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
	$tSource = DllStructCreate($tagPOINT)
	$pSource = DllStructGetPtr($tSource)
	$tBlend = DllStructCreate($tagBLENDFUNCTION)
	$pBlend = DllStructGetPtr($tBlend)
	DllStructSetData($tBlend, "Alpha", $iOpacity)
	DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
	_WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
	_WinAPI_ReleaseDC(0, $hScrDC)
	_WinAPI_SelectObject($hMemDC, $hOld)
	_WinAPI_DeleteObject($hBitmap)
	_WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>SetBitmap
 
Автор
Makrut

Makrut

Новичок
Сообщения
44
Репутация
2

спасибо, но я уже нашел решение. если оно вас интересует - пишите в лс
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
На форуме не принято помогать через лс.
Не нужно нагнетать "секретность" :smile:
 
Автор
Makrut

Makrut

Новичок
Сообщения
44
Репутация
2
учту при дальнейшем общении с форумчанами. я просто думал, что это был бы оффтоп - вот и сказал про лс
 
Верх