Что нового

_GUICreateAlfa + AutoIt3Wrapper

saraconor

Новичок
Сообщения
416
Репутация
3
Помогите пожалуйста, как можно использовать png файл через _GUICreateAlfa, включенный в скрипт с помощью Wrapper?
Код:
#include <WindowsConstants.au3>
#include "_GUICreateAlfa.au3"

#AutoIt3Wrapper_Res_File_Add=1.png, png, IMG    ; ?

$prov = _GUICreateAlfa("",@ScriptDir&"\1.png")
sleep(1000)
exit
 

Вложения

  • png + resourse.rar
    38.3 КБ · Просмотры: 7
Последнее редактирование:

joiner

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

#AutoIt3Wrapper_Res_File_Add=1.png, png, IMG    
_GDIPlus_Startup()
_WinExFF()
_GDIPlus_Shutdown()

Func _WinExFF()
    Local $hInstance = _WinAPI_GetModuleHandle(0)
    Local $hImage = _LoadResourceImage($hInstance, 'png', "img")
    If @error Then Return
    Local $XW = _GDIPlus_ImageGetWidth($hImage)
    Local $YH = _GDIPlus_ImageGetHeight($hImage)
    Local $hGui = GUICreate('', $XW, $YH, -1, -1, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_LAYERED, $WS_EX_TOPMOST))
    GUISetState(@SW_SHOW, $hGui)
    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(30)
    Next
    Sleep(1000)
    For $i = 255 To 0 Step -5
        DllStructSetData($tBlend, 'Alpha', $i)
        _WinAPI_UpdateLayeredWindow($hGui, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
        Sleep(30)
    Next
    GUIDelete($hGui)
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_ReleaseDC($hGui, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>_WinExFF

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
    $hImage = DllCall("gdiplus.dll", "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "ptr*", 0)
    If (@error) Or ($hImage[0]) Or (Not $hImage[2]) Then
        $hImage = 0
    EndIf
    DllCall("kernel32.dll", "ptr", "GlobalFree", "ptr", $hMem[0])
    If Not IsArray($hImage) Then
        Return SetError(1, 0, 0)
    EndIf
    Return $hImage[2]
EndFunc   ;==>_LoadResourceImage
 
Автор
S

saraconor

Новичок
Сообщения
416
Репутация
3
Подскажите, а как исползовать картинку в качестве ресурса, при компиляции?
Код:
#include <GDIPlus.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>

#AutoIt3Wrapper_Res_File_Add=ribbon.png, png, IMG1

; выход по Shift+ESC
HotKeySet("+{esc}", "Quit")

; ширина кадра
$Width = 150

; загрузка ленты
_GDIPlus_Startup()
if @Compiled then
?????????
Else
$Image = _GDIPlus_ImageLoadFromFile("ribbon.png")
endif
If @error Then Exit _GDIPlus_Shutdown()

; расчёты
$Count = _GDIPlus_ImageGetWidth($Image) / $Width
$Height = _GDIPlus_ImageGetHeight($Image)

; разбиение на кадры
Global $aImg[$Count]
For $i = 0 To $Count - 1
  $Img = _GDIPlus_BitmapCloneArea($Image, $i * $Width, 0, $Width, $Height, $GDIP_PXF32ARGB)
  $aImg[$i] = _GDIPlus_BitmapCreateHBITMAPFromBitmap($Img)
  _GDIPlus_ImageDispose($Img)
Next
_GDIPlus_ImageDispose($Image)
_GDIPlus_Shutdown()

; создание окна и анимация
$GUI = GUICreate("", $Width, $Height, -1, -1, $WS_POPUPWINDOW, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))
GUISetState()

  For $i = 0 To $Count - 1
    Sleep(25)
    _WinAPI_UpdateLayeredWindowEx($GUI, -1, -1, $aImg[$i])
;~     WinMove($GUI, "", MouseGetPos(0) + 30, MouseGetPos(1) + 30)  ;двинуть окно к курсору
  Next

; удаление ресурсов
For $i = 0 To $Count - 1
  _WinAPI_DeleteObject($aImg[$i])
Next

; выход
Func Quit()
  Exit
EndFunc


Раньше работало через "resources.au3", но в новой версии там ошибки выскакивают к сожалению.
 
Последнее редактирование:

Prog

Продвинутый
Сообщения
591
Репутация
72
как использовать картинку в качестве ресурса, при компиляции?
joiner показал пример как это сделать.

Немного не по теме, но почему не использовать gif вместо png? У гифок есть параметр "время отображения кадра" что позволит уменьшить число кадров если время отображения различно.
 
Автор
S

saraconor

Новичок
Сообщения
416
Репутация
3
joiner показал пример как это сделать.

Немного не по теме, но почему не использовать gif вместо png? У гифок есть параметр "время отображения кадра" что позволит уменьшить число кадров если время отображения различно.
у гифок плохое разрешение, плохое отображение прозрачности, сильно ограниченная палитра, их надо отдельно готовить, а тут уже есть отличный инструмент для компоновки кадров.
 

Prog

Продвинутый
Сообщения
591
Репутация
72
Во втором сообщении этой темы есть код от joiner.
Продублирую если по какой-то причине не видите его.
Код:
#include <WindowsConstants.au3>
#include <WinAPIEx.au3>
#include <GDIPlus.au3>

#AutoIt3Wrapper_Res_File_Add=1.png, png, IMG 
_GDIPlus_Startup()
_WinExFF()
_GDIPlus_Shutdown()

Func _WinExFF()
    Local $hInstance = _WinAPI_GetModuleHandle(0)
    Local $hImage = _LoadResourceImage($hInstance, 'png', "img")
    If @error Then Return
    Local $XW = _GDIPlus_ImageGetWidth($hImage)
    Local $YH = _GDIPlus_ImageGetHeight($hImage)
    Local $hGui = GUICreate('', $XW, $YH, -1, -1, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_LAYERED, $WS_EX_TOPMOST))
    GUISetState(@SW_SHOW, $hGui)
    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(30)
    Next
    Sleep(1000)
    For $i = 255 To 0 Step -5
        DllStructSetData($tBlend, 'Alpha', $i)
        _WinAPI_UpdateLayeredWindow($hGui, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
        Sleep(30)
    Next
    GUIDelete($hGui)
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_ReleaseDC($hGui, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>_WinExFF

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
    $hImage = DllCall("gdiplus.dll", "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "ptr*", 0)
    If (@error) Or ($hImage[0]) Or (Not $hImage[2]) Then
        $hImage = 0
    EndIf
    DllCall("kernel32.dll", "ptr", "GlobalFree", "ptr", $hMem[0])
    If Not IsArray($hImage) Then
        Return SetError(1, 0, 0)
    EndIf
    Return $hImage[2]
EndFunc   ;==>_LoadResourceImage
 
Автор
S

saraconor

Новичок
Сообщения
416
Репутация
3
Во втором сообщении этой темы есть код от joiner.
Продублирую если по какой-то причине не видите его.
Код:
#include <WindowsConstants.au3>
#include <WinAPIEx.au3>
#include <GDIPlus.au3>

#AutoIt3Wrapper_Res_File_Add=1.png, png, IMG
_GDIPlus_Startup()
_WinExFF()
_GDIPlus_Shutdown()

Func _WinExFF()
    Local $hInstance = _WinAPI_GetModuleHandle(0)
    Local $hImage = _LoadResourceImage($hInstance, 'png', "img")
    If @error Then Return
    Local $XW = _GDIPlus_ImageGetWidth($hImage)
    Local $YH = _GDIPlus_ImageGetHeight($hImage)
    Local $hGui = GUICreate('', $XW, $YH, -1, -1, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_LAYERED, $WS_EX_TOPMOST))
    GUISetState(@SW_SHOW, $hGui)
    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(30)
    Next
    Sleep(1000)
    For $i = 255 To 0 Step -5
        DllStructSetData($tBlend, 'Alpha', $i)
        _WinAPI_UpdateLayeredWindow($hGui, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
        Sleep(30)
    Next
    GUIDelete($hGui)
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_ReleaseDC($hGui, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>_WinExFF

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
    $hImage = DllCall("gdiplus.dll", "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "ptr*", 0)
    If (@error) Or ($hImage[0]) Or (Not $hImage[2]) Then
        $hImage = 0
    EndIf
    DllCall("kernel32.dll", "ptr", "GlobalFree", "ptr", $hMem[0])
    If Not IsArray($hImage) Then
        Return SetError(1, 0, 0)
    EndIf
    Return $hImage[2]
EndFunc   ;==>_LoadResourceImage
Не работает, просто не срабатывает сейчас.
 
Автор
S

saraconor

Новичок
Сообщения
416
Репутация
3
Вопрос: А можно "повернуть" получившуюся анимацию на какой-то градус?
 
Верх