1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Peri Petie

Beiträge von Peri Petie

  • Matrix-Funktionen auf PNG-Bild in einem "WS_EX_LAYERED"-Fenster anwenden

    • Peri Petie
    • 11. Juli 2009 um 22:19

    Vielen Dank, UEZ.
    Hab' zwar zwischenzeitlich bezüglich des Handlings mit freibeweglichen transparenten PNG-Bildern nur mit GDI+ ohne Matrix-Funktionen gearbeitet, aber werde mir Deinen Tipp mal ansehen. Wäre schön, wenn ich sie doch anwenden könnte. Die Matrix-Funktionen find' ich nämlich geil.

  • Matrix-Funktionen auf PNG-Bild in einem "WS_EX_LAYERED"-Fenster anwenden

    • Peri Petie
    • 4. Juli 2009 um 15:22

    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>
    #include <GuiEdit.au3>
    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Opt("MustDeclareVars", 0)

    [/autoit][autoit][/autoit][autoit]

    Global Const $AC_SRC_ALPHA = 1
    Global $hGUI1, $hMatrix, $x, $y, $hGraphic, $hImage2, $ImageWidth, $ImageHeight, $iWidth, $iHeight

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; !!!!!!!!!! Hier bitte noch Pfade eingeben
    _Wasserzeichen("Pfad zum Originalbild .png","Pfad zur Bildkopie .png", "Das ist ein Test" )

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    func _Wasserzeichen($input,$ouput,$text)

    [/autoit][autoit][/autoit][autoit]

    $hGUI2 = GUICreate("GDI+", 400, 300, 900, 50)
    GUICtrlSetState(0,$GUI_FOCUS)
    GUISetState()

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _GDIPlus_Startup() ;<=======Startup
    $hImage2=_GDIPlus_BitmapCreateFromFile($input) ;<======Das Bild wird geöffnet
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage2)

    [/autoit][autoit][/autoit][autoit]

    $Brush1 = _GDIPlus_BrushCreateSolid (0xFFECE9D8)
    _GDIPlus_GraphicsFillRect($hGraphic, 60, 20, 100, 50, $Brush1)

    [/autoit][autoit][/autoit][autoit]

    $hBrush = _GDIPlus_BrushCreateSolid (0xFF7B97E0)
    $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

    [/autoit][autoit][/autoit][autoit]

    ;_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;
    ;$hGUI1 = GUICreate("BILD", 700, 700, -1, -1, -1) ; !!!!!!!!!! Bild wird mittels Matrix-Funktionen rotierend dargestellt
    GUISetState()

    [/autoit][autoit][/autoit][autoit]

    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage2)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI1)

    [/autoit][autoit][/autoit][autoit]

    SetBitMap($hGUI1, $hImage2, 255)
    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
    GUISetState()

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; Matrix-Code Anfang ------------------------------------------------------------------------
    $iWidth = _GDIPlus_ImageGetWidth($hImage2) * 96 / _GDIPlus_ImageGetVerticalResolution($hImage2)
    $iHeight = _GDIPlus_ImageGetHeight($hImage2) * 96 / _GDIPlus_ImageGetHorizontalResolution($hImage2)

    [/autoit][autoit][/autoit][autoit]

    $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, 370, 370)

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 To 360
    _GDIPlus_MatrixRotate($hMatrix, 1, "False")
    _GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage2, -$iWidth / 2, -$iHeight)
    Sleep(1)
    Next
    ; Matrix-Code Ende --------------------------------------------------------------------------

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
    GUISetState()

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;<======Es wird aufgeräumt ;)
    _GDIPlus_Brushdispose($Brush1)
    _GDIPlus_Brushdispose($hBrush)
    _GDIPlus_FontDispose($hFont)
    _GDIPlus_StringFormatDispose($hStringFormat)

    [/autoit][autoit][/autoit][autoit]

    _WinAPI_DeleteObject($hImage2)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown() ;<======GDIplus wird beendet

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ; zusätzliche Funktionen Anfang --------------------------------------------------------------------------

    [/autoit][autoit][/autoit][autoit]

    Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    if ($hWnd = $hGUI1) and ($iMsg = $WM_NCHITTEST) then Return $HTCAPTION
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

    $hScrDC = _WinAPI_GetDC(0)
    $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

    [/autoit][autoit][/autoit][autoit]

    ; zusätzliche Funktionen Ende --------------------------------------------------------------------------

    [/autoit]

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™