Что нового

Png в прозрачном gui окне (splash image)

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Модифицированный пример из недр Autoit, он отображает png изображение с прозрачностью в безрамочном окне. Суть вопроса, изображение отображается а как его убрать не закрывая скрипт (программу)? Не убирается никак, GuiDelete() не работает... Как только не пробовал..

Только сейчас придумал, нужно наверно освободить dll структуру, компа нет уже под рукой, да и не знаю как точно это делается...
Код:
#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>


_SplashImageOn(@ScriptDir & "\45250112.png")
Sleep(3000)
_SplashImageOff()

Func _SplashImageOn($sImage)

Global $g_hGUI = GUICreate("", 512, 512, -1, -1, -1, $WS_EX_LAYERED)
_GDIPlus_Startup()
Global $g_hImage = _GDIPlus_ImageLoadFromFile($sImage)
setbitmap($g_hGUI, $g_hImage, 190)
GUISetState()

EndFunc

Func _SplashImageOff()
_GDIPlus_ImageDispose($g_hImage)
_GDIPlus_Shutdown()
EndFunc


Func setbitmap($hGUI, $hImage, $iOpacity)
    Global $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)

    _WinAPI_DeleteObject ($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", 1)
    _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
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
можно так
Код:
#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>


Local $hDellGui = _SplashImageOn(@ScriptDir & "\45250112.png", 255)
Sleep(3000)
GUIDelete($hDellGui)
Local $Form1 = GUICreate("Form1", 465, 178, 580, 232)
Local $Button1 = GUICtrlCreateButton("Button1", 176, 72, 75, 25)
GUISetState()


While 1
    Switch GUIGetMsg()
        Case -3
            Exit
;~         Case $Button1
;~             GUIDelete($hDellGui);или так
    EndSwitch
WEnd


Func _SplashImageOn($sImage, $iOpacity)
    Local $hGUI = GUICreate("", 512, 512, -1, -1, -1, $WS_EX_LAYERED)
    GUISetState()
    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sImage)
    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)
    _WinAPI_DeleteObject($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", 1)
    _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)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Return $hGUI
;~     Sleep(3000)
;~     GUIDelete($hGUI); или так
EndFunc   ;==>_SplashImageOn
 
Последнее редактирование:
Автор
F

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Суть проблемы в области видимости переменных что ли...? Объявлять глобальную переменную в функции не здоровая тема?
 

joiner

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

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Итог _SplashImageOn() ...

Код:
#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Global $sSplashImage = @ProgramFilesDir & "\AutoIt3\Examples\GUI\Torus.png"
Global $iH_SplashImage = 193, $iWSplashImage = 184 ; Размер изображения
Global $iTransparent = 250 ; Прозрачность, максимально 255

$hSplashGui = _SplashImageOn($sSplashImage, $iTransparent, $iH_SplashImage, $iWSplashImage)
Sleep(5000)
GUIDelete($hSplashGui)


; какой-то код ...
$Form1 = GUICreate("test", 465, 178, -1, -1)
$Button1 = GUICtrlCreateButton("Button", 176, 72, 75, 25)
GUISetState()
do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
; какой-то код

Func _SplashImageOn($sImage, $iOpacity, $iX, $iY)

    if $iOpacity > 255 then $iOpacity = 255
    Local $hGUI = GUICreate("", $iX, $iY, @DesktopWidth / 2 - ( $iX / 2 ), @DesktopHeight / 2 - ( $iY / 2 ), -1, $WS_EX_LAYERED)
    GUISetState(@SW_SHOW, $hGUI)
    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sImage)
    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)
    _WinAPI_DeleteObject($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", 1)
    _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)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Return $hGUI

EndFunc   ;==>_SplashImageOn
 
Последнее редактирование модератором:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
как вариант ))
Код:
#include <GDIPlus.au3>
#include <GuiConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Local $sSplashImage = @ProgramFilesDir & "\AutoIt3\Examples\GUI\Torus.png"
Local $iX = -1, $iY = -1
Local $width = @DesktopWidth / 2 - ($iX / 2), $height = @DesktopHeight / 2 - ($iY / 2)

$hSplashGui = _SplashImageOn($sSplashImage, $width, $height, $iX, $iY)

; какой-то код ...
$Form1 = GUICreate("test", 465, 178, -1, -1)
$Button1 = GUICtrlCreateButton("Button", 176, 72, 75, 25)
GUISetState()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
; какой-то код
Func _SplashImageOn($sImage, $iW, $iH, $iX, $iY)
    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sImage)
    If @error Then Return SetError(1)
    Local $XW = _GDIPlus_ImageGetWidth($hImage)
    Local $YH = _GDIPlus_ImageGetHeight($hImage)
    Local $hGui = GUICreate('', $iW, $iH, $iX, $iY, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_LAYERED, $WS_EX_TOPMOST))
    GUISetState()
    Local $hScrDC = _WinAPI_GetDC($hGui)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    Local $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    Local $tSize = DllStructCreate($tagSIZE)
    Local $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, 'X', $XW)
    DllStructSetData($tSize, 'Y', $YH)
    Local $tSource = DllStructCreate($tagPOINT)
    Local $pSource = DllStructGetPtr($tSource)
    Local $tBlend = DllStructCreate($tagBLENDFUNCTION)
    Local $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, 'Format', 1)
    For $i = 0 To 255 Step 5
        DllStructSetData($tBlend, 'Alpha', $i)
        _WinAPI_UpdateLayeredWindow($hGui, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
        Sleep(10)
    Next
    Sleep(3000)
    For $i = 255 To 0 Step -5
        DllStructSetData($tBlend, 'Alpha', $i)
        _WinAPI_UpdateLayeredWindow($hGui, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
        Sleep(10)
    Next
    GUIDelete($hGui)
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_ReleaseDC($hGui, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
    _GDIPlus_Shutdown()
EndFunc   ;==>_SplashImageOn
 
Автор
F

FlatX007

Tattoo!
Сообщения
197
Репутация
35
В моем примере картинка появляется с полной не прозрачностью, а потом устанавливается нужный уровень прозрачности если указать число иное от 255 ... Картинка перемигивает, плавное появление у меня не получилось сделать
 
Верх