[Beispiel] HoveredPNG-Buttons

  • Hallo Com,

    hier einmal ein Beispiel das zeigt wie man aus den guten Vorlagen der Meister:

    • Großvater GuiCtrlPic
    • BugFix _AnimButton (ist ins Skript etwas abgeändert integriert)

    auf einfache Art und Weise nützliches macht:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include "GUICtrlPic.au3"

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

    Global $aHoverBtn[5][5]
    $aHoverBtn[0][1] = @ScriptDir & "\Pictures\Up.png" ;D:\Programme\AutoIt3\MyDemos\Pictures\up.png
    $aHoverBtn[0][2] = @ScriptDir & "\Pictures\UpHover.png"
    $aHoverBtn[0][3] = @ScriptDir & "\Pictures\UpPress.png"
    $aHoverBtn[0][4] = False

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

    $aHoverBtn[1][1] = @ScriptDir & "\Pictures\Down.png"
    $aHoverBtn[1][2] = @ScriptDir & "\Pictures\DownHover.png"
    $aHoverBtn[1][3] = @ScriptDir & "\Pictures\DownPress.png"
    $aHoverBtn[1][4] = False

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

    $aHoverBtn[2][1] = @ScriptDir & "\Pictures\Left.png"
    $aHoverBtn[2][2] = @ScriptDir & "\Pictures\LeftHover.png"
    $aHoverBtn[2][3] = @ScriptDir & "\Pictures\LeftPress.png"
    $aHoverBtn[2][4] = False

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

    $aHoverBtn[3][1] = @ScriptDir & "\Pictures\Right.png"
    $aHoverBtn[3][2] = @ScriptDir & "\Pictures\RightHover.png"
    $aHoverBtn[3][3] = @ScriptDir & "\Pictures\RightPress.png"
    $aHoverBtn[3][4] = False

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

    $aHoverBtn[4][1] = @ScriptDir & "\Pictures\Exit.png"
    $aHoverBtn[4][2] = @ScriptDir & "\Pictures\ExitHover.png"
    $aHoverBtn[4][3] = @ScriptDir & "\Pictures\ExitPress.png"
    $aHoverBtn[4][4] = False

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

    Global $hGui = GUICreate("Hovered Ping-Buttons", 612, 369, 271, 235)
    Local $sAutoItPath = StringReplace(@AutoItExe, "autoit3.exe", "")
    ConsoleWrite($sAutoItPath & "Examples\GUI\msoobe.jpg" & @CRLF)
    Local $Background = _GUICtrlPic_Create($sAutoItPath & "Examples\GUI\msoobe.jpg", 0, 0, 612, 369, $SS_CENTERIMAGE, Default)
    GUICtrlSetState(-1, $Gui_DISABLE)
    Local $idTorus = _GUICtrlPic_Create($sAutoItPath & "Examples\GUI\Torus.png", 8, 8, 68, 71, $SS_CENTERIMAGE, Default)
    GUICtrlSetState(-1, $Gui_DISABLE)

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

    $aHoverBtn[0][0] = _GUICtrlPic_Create($aHoverBtn[0][1], 460, 8, 48, 48, BitOR($SS_CENTERIMAGE, $SS_NOTIFY), Default) ;Up
    $aHoverBtn[1][0] = _GUICtrlPic_Create($aHoverBtn[1][1], 460, 138, 48, 48, BitOR($SS_CENTERIMAGE, $SS_NOTIFY), Default) ;Down
    $aHoverBtn[2][0] = _GUICtrlPic_Create($aHoverBtn[2][1], 400, 73, 48, 48, BitOR($SS_CENTERIMAGE, $SS_NOTIFY), Default) ;Left
    $aHoverBtn[3][0] = _GUICtrlPic_Create($aHoverBtn[3][1], 520, 73, 48, 48, BitOR($SS_CENTERIMAGE, $SS_NOTIFY), Default) ;Right
    $aHoverBtn[4][0] = _GUICtrlPic_Create($aHoverBtn[4][1], 540, 266, 48, 48, BitOR($SS_CENTERIMAGE, $SS_NOTIFY), Default) ;Exit
    GUISetState()

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

    While 1
    #Region ;Hover Or Not?
    $Info = GUIGetCursorInfo($hGui)
    For $i = 0 To UBound($aHoverBtn) - 1
    If $Info[4] = $aHoverBtn[$i][0] Then
    If $aHoverBtn[$i][4] Then _GUICtrlPic_SetImage($aHoverBtn[$i][0], $aHoverBtn[$i][2], True)
    $aHoverBtn[$i][4] = False
    Else
    If Not $aHoverBtn[$i][4] Then _GUICtrlPic_SetImage($aHoverBtn[$i][0], $aHoverBtn[$i][1], True)
    $aHoverBtn[$i][4] = True
    EndIf
    Next
    #EndRegion
    $nMsg = GUIGetMsg()
    $aPos = ControlGetPos($hGui, "", $idTorus)
    Switch $nMsg
    Case $Gui_EVENT_CLOSE
    Exit
    Case $aHoverBtn[0][0]
    If _AnimButton($hGui, $aHoverBtn[0][0], $aHoverBtn[0][1], $aHoverBtn[0][3]) Then $aPos[1] -= 5 ;nach oben
    Case $aHoverBtn[1][0]
    If _AnimButton($hGui, $aHoverBtn[1][0], $aHoverBtn[1][1], $aHoverBtn[1][3]) Then $aPos[1] += 5 ;nach unten
    Case $aHoverBtn[2][0]
    If _AnimButton($hGui, $aHoverBtn[2][0], $aHoverBtn[2][1], $aHoverBtn[2][3]) Then $aPos[0] -= 5 ;nach links
    Case $aHoverBtn[3][0]
    If _AnimButton($hGui, $aHoverBtn[3][0], $aHoverBtn[3][1], $aHoverBtn[3][3]) Then $aPos[0] += 5 ;nach rechts
    Case $aHoverBtn[4][0]
    If _AnimButton($hGui, $aHoverBtn[4][0], $aHoverBtn[4][1], $aHoverBtn[4][3]) Then Exit
    EndSwitch
    ControlMove($hGui, "", $idTorus, $aPos[0], $aPos[1])
    WEnd

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

    ;==================================================================================================
    ; Function Name: _AnimButton($IDgui, $IDbtn [, $delay=150])
    ; Description: animiert ein Pic, wie einen geklickten Button
    ; Parameter(s): $IDgui ID der GUI
    ; $IDbtn ID des Picture als Button
    ; $sNormal Pfad zum angezeigten Bild des Buttons im nrmalen Zustand
    ; $sPress Pfad zum angezeigten Bild des Buttons im gedrückten Zustand
    ; Author: BugFix
    ; modified: autoBert
    ;==================================================================================================
    Func _AnimButton($IDgui, $IDbtn, $sNormal = "", $sPress = "")
    ;ConsoleWrite($IDbtn & @TAB & $sNormal & @TAB & $sPress & @CRLF)
    If $IDbtn = 0 Then Return
    Local $pos = ControlGetPos($IDgui, '', $IDbtn)
    Local $pWin = WinGetPos(GUICtrlGetHandle($IDbtn))
    If $sPress <> "" And FileExists($sPress) Then _GUICtrlPic_SetImage($IDbtn, $sPress)
    ControlMove($IDgui, '', $IDbtn, $pos[0], $pos[1] + 1, $pos[2] - 1, $pos[3] - 1)
    $return = 1
    Do
    $x = GUIGetCursorInfo($IDgui)
    If $x[4] <> $IDbtn Then $return = 0
    Sleep(10)
    Until $x[2] = 0
    If $sNormal <> "" And FileExists($sNormal) Then _GUICtrlPic_SetImage($IDbtn, $sNormal, True)
    ControlMove($IDgui, '', $IDbtn, $pos[0], $pos[1], $pos[2], $pos[3])
    Return $return
    EndFunc ;==>_AnimButton

    [/autoit]

    dazu benötigt wird die GUICtrlPic.au3 von Grossvater und noch die Bilder im Anhang. Hier solltet ihr aber besser eigene nehmen, aber für dasFunktionsdemo reichen sie,

    mfg autoBert

  • Hallo autoBert,

    ich wollte gerne deine Funktion nutzen, aber ich hab ein Problem mit der Darstellung.
    Sobald ich das Pic anzeigen lasse, wird mein Hintergrund nicht angezeigt (siehe Anhang).
    Woran kann das liegen?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <TabConstants.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>
    #include <Constants.au3>
    #include <WinAPI.au3>
    #include "GUICtrlPic.au3"

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

    Opt("GUIOnEventMode", 1)

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

    Global $iOffset = 0
    Global $aHoverBtn[5][5]
    $aHoverBtn[0][1] = @ScriptDir & "\exit_normal.png"
    $aHoverBtn[0][2] = @ScriptDir & "\exit_hover.png"
    $aHoverBtn[0][3] = @ScriptDir & "\exit_pressed.png"
    $aHoverBtn[0][4] = False

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

    #Region
    $hGuiBorder = GUICreate("Visu", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    GUISetBkColor(0x000000)
    #EndRegion

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

    #Region
    If @DesktopWidth = 1280 And @DesktopHeight = 800 Then $iOffset = 3
    $hGuiBG = GUICreate("", 1280, 800, ((@DesktopWidth - 1280) / 2) + $iOffset, ((@DesktopHeight - 800) / 2) + $iOffset, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hGuiBorder)
    _GDIPlus_Startup()
    $pngSrcSettingsBK = "bg.png"
    Global $hImageSettingsBK = _GDIPlus_ImageLoadFromFile($pngSrcSettingsBK)
    _SetBitmap($hGuiBG, $hImageSettingsBK, 255)

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

    #EndRegion

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

    #Region
    $hGuiCtrl = GUICreate("", 1280, 800, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hGuiBG)
    GUISetBkColor(0x585858)
    _WinAPI_SetLayeredWindowAttributes($hGuiCtrl, 0x585858)
    GUICtrlCreateButton("Beenden", 20, 20, 100, 30)
    GUICtrlSetOnEvent(-1, "_Exit")
    $aHoverBtn[0][0] = _GUICtrlPic_Create($aHoverBtn[0][1], 1100, 20, 48, 43, BitOR($SS_CENTERIMAGE, $SS_NOTIFY), Default)
    GUICtrlSetOnEvent(-1, "_Exit")
    #EndRegion

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

    WinSetState("[Class:Shell_TrayWnd]","",@SW_HIDE)
    WinSetState("Start","",@SW_HIDE)
    GUISetState(@SW_SHOW, $hGuiBorder)
    GUISetState(@SW_SHOW, $hGuiBG)
    GUISetState(@SW_SHOW, $hGuiCtrl)

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

    While 1
    $Info = GUIGetCursorInfo($hGuiCtrl)
    For $i = 0 To UBound($aHoverBtn) - 1
    If $Info[4] = $aHoverBtn[$i][0] Then
    If $aHoverBtn[$i][4] Then _GUICtrlPic_SetImage($aHoverBtn[$i][0], $aHoverBtn[$i][2], True)
    $aHoverBtn[$i][4] = False
    Else
    If Not $aHoverBtn[$i][4] Then _GUICtrlPic_SetImage($aHoverBtn[$i][0], $aHoverBtn[$i][1], True)
    $aHoverBtn[$i][4] = True
    EndIf
    Next
    Sleep(100)
    WEnd

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

    Func _Exit()
    If _AnimButton($hGuiCtrl, $aHoverBtn[0][0], $aHoverBtn[0][1], $aHoverBtn[0][3]) Then
    GUIDelete($hGuiCtrl)
    GUIDelete($hGuiBG)
    GUIDelete($hGuiBorder)
    WinSetState("[Class:Shell_TrayWnd]","",@SW_SHOW)
    WinSetState("Start","",@SW_SHOW)
    Exit
    EndIf
    EndFunc

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

    Func _SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
    Local Const $AC_SRC_ALPHA = 1
    $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

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

    ;==================================================================================================
    ; Function Name: _AnimButton($IDgui, $IDbtn [, $delay=150])
    ; Description: animiert ein Pic, wie einen geklickten Button
    ; Parameter(s): $IDgui ID der GUI
    ; $IDbtn ID des Picture als Button
    ; $sNormal Pfad zum angezeigten Bild des Buttons im nrmalen Zustand
    ; $sPress Pfad zum angezeigten Bild des Buttons im gedrückten Zustand
    ; Author: BugFix
    ; modified: autoBert
    ;==================================================================================================
    Func _AnimButton($IDgui, $IDbtn, $sNormal = "", $sPress = "")
    ;ConsoleWrite($IDbtn & @TAB & $sNormal & @TAB & $sPress & @CRLF)
    If $IDbtn = 0 Then Return
    Local $pos = ControlGetPos($IDgui, '', $IDbtn)
    Local $pWin = WinGetPos(GUICtrlGetHandle($IDbtn))
    If $sPress <> "" And FileExists($sPress) Then _GUICtrlPic_SetImage($IDbtn, $sPress)
    ;~ ControlMove($IDgui, '', $IDbtn, $pos[0], $pos[1] + 1, $pos[2] - 1, $pos[3] - 1)
    $return = 1
    Do
    $x = GUIGetCursorInfo($IDgui)
    If $x[4] <> $IDbtn Then $return = 0
    Sleep(10)
    Until $x[2] = 0
    If $sNormal <> "" And FileExists($sNormal) Then _GUICtrlPic_SetImage($IDbtn, $sNormal, True)
    ;~ ControlMove($IDgui, '', $IDbtn, $pos[0], $pos[1], $pos[2], $pos[3])
    Return $return
    EndFunc ;==>_AnimButton

    [/autoit]