Что нового

картинка PNG должна быть между двумя другими PNG

shyra1976

Новичок
Сообщения
71
Репутация
0
Код:
#include <GDIPlus.au3>
#include <GuiComboBox.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>

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

Global $iExitLoop = False
$pngSrc = @ScriptDir & "\1.PNG"

Local $iOpacity = 255, $EnableFade = True
Local $hImage, $width, $height, $BtnExit
;~ 	If $iOpacity < 0 Then $iOpacity = 0
;~ 	If $iOpacity > 255 Then $iOpacity = 255

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

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

; Create layered window

$GUI1 = GUICreate("", $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
;~ 	WinSetOnTop($GUI1, "", 1)
GUISetState(@SW_SHOW)

$GUI2 = GUICreate("", $width, $height - 500, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
;~ 	WinSetOnTop($GUI2, "", 1)
GUISetState(@SW_SHOW)

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

$GUI3 = GUICreate("", $width - 1000, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
;~ 	WinSetOnTop($GUI3, "", 1)
GUISetState(@SW_SHOW)

GUISetState()

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

If $EnableFade Then
	;fade in png background
	For $i = 0 To $iOpacity Step 1
		SetBitmap($GUI1, $hImage, $i)
		SetBitmap($GUI2, $hImage, $i)
		SetBitmap($GUI3, $hImage, $i)
	Next
Else
	SetBitmap($GUI1, $hImage, $iOpacity)
	SetBitmap($GUI2, $hImage, $iOpacity)
	SetBitmap($GUI3, $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_PRIMARYDOWN

			$1Pos = WinGetPos($Gui1)
			$2Pos = WinGetPos($Gui2)
			ConsoleWrite("$1Pos[0] = " & $1Pos[0] & @LF)
			ConsoleWrite("$2Pos[0] = " & $2Pos[0] & @LF)
			ConsoleWrite("$1Pos[1] = " & $1Pos[1] & @LF)
			ConsoleWrite("$2Pos[1] = " & $2Pos[1] & @LF)
			WinMove($Gui3, "", ($1Pos[0] + $2Pos[0]) / 2, ($1Pos[1] + $2Pos[1]) / 2, 30, 30)

	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($GUI1, $hImage, $i)
		SetBitmap($GUI2, $hImage, $i)
		SetBitmap($GUI3, $hImage, $i)
	Next
Else
	SetBitmap($GUI1, $hImage, 0)
	SetBitmap($GUI2, $hImage, 0)
	SetBitmap($GUI3, $hImage, 0)
EndIf

; 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


Почему у меня картинка которая должна быть посередине исчезает?
Спасибо
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
shyra1976
картинка которая должна быть посередине исчезает
Вообще-то она не исчезает, а становится размером 30х30 пикселей
Код:
WinMove($Gui3, "", ($1Pos[0] + $2Pos[0]) / 2, ($1Pos[1] + $2Pos[1]) / 2, 30, 30)
и "прячется" под $GUI1.
 
Верх