Beiträge von Peri Petie
-
-
Hallo, liebe AutoIt-Gemeinde, ich habe eine grundsätzliche Frage:
Ist es möglich, auf ein mit "WS_EX_LAYERED" definiertes Fenster, bzw. auf ein in diesem Fenster gezeigten Bild zuzugreifen mit den diversen "Matrix"-Funktionen wie zum Beispiel "Function _GDIPLUS_Matrix_Scale"?
Ich versuche seit Tagen, mittels der Matrix-Funktionen auf ein transparentes Bild (PNG-Format) zuzugreifen. Es funktioniert immer nur, wenn ich die "WS_EX_LAYERED"-Definition herausnehme.
Falls es möglich sein sollte, mit "Matrix"-Funktionen auf PNG-Bilder in einem WS_EX_LAYERED-Fenster zuzugreifen, wäre ich euch allerdings sehr dankbar, wenn ihr mir dies an einem Code-Schnipsel aufzeigen könntet. Vielen Dank schon mal im voraus.Poste nachstehend ein Beispiel (es ist das "Wasserzeichen"-Beispiel aus dem Forum). Aus den Zeilen 49 und 50 wird das Problem vielleicht besser ersichtlich:
Aktiviere ich die Zeile 49, wird das Bild zwar als Layer dargestellt, aber die Matrix-Funktionen zeigen keine Wirkung, die Schleife läuft aber durch (Bild lässt sich nicht sofort wieder schließen, dauert einige Sekunden).Bei Aktivierung der Zeile 50 funktioniert zwar der Matrix-Code, jedoch ist das Bild nicht mehr frei zu bewegen.
Vielleicht kann mir ja doch jemand helfen.
PS: Im Funktionsaufruf muss noch ein Pfad zu einem PNG-Bild, sowie ein Pfad zu einer Kopie eingetragen werden.
Das Original wird nicht geändert; die Kopie wird nicht gespeichert, da es hier nicht notwendig ist.Ich arbeite mit AutoIt 3.3 und SCITE Ver. 1.78
[autoit][/autoit][autoit][/autoit][autoit]#include <GUIConstants.au3>
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]
#include <GuiEdit.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <GDIPlusConstants.au3>Opt("MustDeclareVars", 0)
[/autoit][autoit][/autoit][autoit]Global Const $AC_SRC_ALPHA = 1
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Global $hGUI1, $hMatrix, $x, $y, $hGraphic, $hImage2, $ImageWidth, $ImageHeight, $iWidth, $iHeight; !!!!!!!!!! Hier bitte noch Pfade eingeben
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]
_Wasserzeichen("Pfad zum Originalbild .png","Pfad zur Bildkopie .png", "Das ist ein Test" )func _Wasserzeichen($input,$ouput,$text)
[/autoit][autoit][/autoit][autoit]$hGUI2 = GUICreate("GDI+", 400, 300, 900, 50)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
GUICtrlSetState(0,$GUI_FOCUS)
GUISetState()_GDIPlus_Startup() ;<=======Startup
[/autoit][autoit][/autoit][autoit]
$hImage2=_GDIPlus_BitmapCreateFromFile($input) ;<======Das Bild wird geöffnet
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage2)$Brush1 = _GDIPlus_BrushCreateSolid (0xFFECE9D8)
[/autoit][autoit][/autoit][autoit]
_GDIPlus_GraphicsFillRect($hGraphic, 60, 20, 100, 50, $Brush1)$hBrush = _GDIPlus_BrushCreateSolid (0xFF7B97E0)
[/autoit][autoit][/autoit][autoit]
$hFamily = _GDIPlus_FontFamilyCreate("Arial") ;<======Schriftart
$hFont = _GDIPlus_FontCreate($hFamily, 16) ;<======Schriftgröße
$hLayout = _GDIPlus_RectFCreate(70, 20, 100, 100) ;<======position der Schrift
$hStringFormat = _GDIPlus_StringFormatCreate()
_GDIPlus_GraphicsDrawStringEx($hGraphic, $text, $hFont, $hLayout, $hStringFormat, $hBrush) ;<======Die schrift wird drauf gemalt;_GDIPlus_ImageSaveToFile($hImage2,$ouput); <======Das neue Bild wird gespeichert
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]$hGUI1 = GUICreate("BILD", 222, 361, -1, -1, -1, $WS_EX_LAYERED, $hGUI2) ; !!!!!!!!!! Bild wird als Layer dargestellt;
[/autoit][autoit][/autoit][autoit]
;$hGUI1 = GUICreate("BILD", 700, 700, -1, -1, -1) ; !!!!!!!!!! Bild wird mittels Matrix-Funktionen rotierend dargestellt
GUISetState()$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage2)
[/autoit][autoit][/autoit][autoit]
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI1)SetBitMap($hGUI1, $hImage2, 255)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
GUISetState(); Matrix-Code Anfang ------------------------------------------------------------------------
[/autoit][autoit][/autoit][autoit]
$iWidth = _GDIPlus_ImageGetWidth($hImage2) * 96 / _GDIPlus_ImageGetVerticalResolution($hImage2)
$iHeight = _GDIPlus_ImageGetHeight($hImage2) * 96 / _GDIPlus_ImageGetHorizontalResolution($hImage2)$hMatrix = _GDIPlus_MatrixCreate()
[/autoit][autoit][/autoit][autoit]
_GDIPlus_MatrixTranslate($hMatrix, 370, 370)For $i = 1 To 360
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
_GDIPlus_MatrixRotate($hMatrix, 1, "False")
_GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage2, -$iWidth / 2, -$iHeight)
Sleep(1)
Next
; Matrix-Code Ende --------------------------------------------------------------------------GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
GUISetState();<======Es wird aufgeräumt
[/autoit][autoit][/autoit][autoit]
_GDIPlus_Brushdispose($Brush1)
_GDIPlus_Brushdispose($hBrush)
_GDIPlus_FontDispose($hFont)
_GDIPlus_StringFormatDispose($hStringFormat)_WinAPI_DeleteObject($hImage2)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown() ;<======GDIplus wird beendetDo
[/autoit][autoit][/autoit][autoit]
Until GUIGetMsg() = $GUI_EVENT_CLOSEEndFunc
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]; zusätzliche Funktionen Anfang --------------------------------------------------------------------------
[/autoit][autoit][/autoit][autoit]Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
if ($hWnd = $hGUI1) and ($iMsg = $WM_NCHITTEST) then Return $HTCAPTION
EndFuncFunc SetBitmap($hGUI, $hImage, $iOpacity)
[/autoit][autoit][/autoit][autoit]
Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend$hScrDC = _WinAPI_GetDC(0)
[/autoit][autoit][/autoit][autoit]
$hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
$tSize = DllStructCreate($tagSIZE)
$pSize = DllStructGetPtr($tSize )
;MsgBox(0, "$tSize / $pSize", $tSize & " / " & $pSize)
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; zusätzliche Funktionen Ende --------------------------------------------------------------------------
[/autoit]