Gui als Button in Gui + Funktion einbauen

  • Hallo,
    ich habe eine Form mit GDI+
    Jetzt will ich ein Button draufhaben den ich ebenfalls mit GDI+ mache (Eine zweite Form mit Bild).

    Schön und gut funktioniert auch alles. Aber wie kann ich jetzt auf den Button klicken?
    Die zweite Form also der Button soll mit bei GuiGetMsg angezeigt also ausgelöst werden.

    Gibt es da ein Trick oder kann ich da was kombinieren?
    mfg Freaky

  • Also es gibt 2 Möglichkeiten.
    Die erste ist mit einer Funktion und Abfrage der koordinaten zu überprüfen ob er geklickt wurde.
    Die 2te, frag die GDI+ Pros (H2112, Name22, eukalyptus, UEZ), die können dir das sagen.

    PS: Für die erste hab ich hier im Forum mal ne UDF released.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Hallo freaky,

    SEuBo hat so etwas schon einmal gelöst, hier das Skript von ihm

    Spoiler anzeigen
    [autoit]

    ;http://www.autoit.de/index.php?page…7901#post177901
    #include <GDIPlus.au3>
    InetGet("http://upload.wikimedia.org/wikipedia/commons/7/7a/Basketball.png",@ScriptDir & "\Ball.png")

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

    $hGUI = GUICreate("")
    $cBasketball = GUICtrLCreatePng($hGUI,@ScriptDir & "\Ball.png",20,20)
    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case -3
    Exit
    Case $cBasketball
    MsgBox(0,"","Du hast den Ball angeklickt!")
    EndSwitch
    WEnd

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

    Func GUICtrlCreatePng($hWnd, $sPath, $iX, $iY) ; SEuBo
    _GDIPlus_Startup()
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend, $hGUI
    Local $hImage = _GDIPlus_ImageLoadFromFile($sPath), $iWidth = _GDIPlus_ImageGetWidth($hImage), $iHeight = _GDIPlus_ImageGetHeight($hImage)
    $hGUI = GUICreate("", $iWidth, $iHeight, $iX, $iY, 0x80000000, BitOR(0x40, 0x80000), $hWnd)
    $cLabel = GUICtrlCreateLabel("", 0, 0, $iWidth, $iHeight)
    GUICtrlSetBkColor(-1, -2)
    GUISetState(@SW_SHOWNOACTIVATE, $hGUI)
    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate("int X;int Y")
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $iWidth)
    DllStructSetData($tSize, "Y", $iHeight)
    $tSource = DllStructCreate("int X;int Y")
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate("byte Op;byte Flags;byte Alpha;byte Format")
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", 255)
    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)
    GUISwitch($hWnd)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Return SetError(0,$hGUI,$cLabel)
    EndFunc ;==>GUICtrlCreatePng

    [/autoit]

    mfg autoBert

    Einmal editiert, zuletzt von autoBert (29. November 2010 um 19:03)

  • Als erstes musst du wissen wann die linke Maustaste innerhalb des Fensters gedrückt wird. Das kannst du mit GUIGetMsg und $GUI_EVENT_PRIMARYDOWN erreichen. Wenn in das Fenster geklickt wurde musst du herausfinden wo geklickt wurde. Dazu verwendest du entweder als Parameter 1 bei GUIGetMsg um die Koordinaten zu bekommen (siehe Hilfe), oder du verwendest MouseGetPos (dazu musst du allerdings einstellen, dass die Koordinaten relativ zum Client Bereich des Fensters sind. Also verwendest du Am Anfang des Scripts Opt("MouseCoordMode", 2)). Dann musst du überprüfen ob die Koordinaten des MouseClicks denn auch innerhalb des Rechtecks des Buttons liegen, und das geht z.B. mit dieser Funktion:

    [autoit]

    Func _PtIsInRect($iXPoint, $iYPoint, $iXRect, $iYRect, $iWidthRect, $iHeightRect) ;Überprüft ob ein Punkt innerhalb eine Rechtecks ist ;)
    If $iXPoint >= $iXRect And $iYPoint >= $iYRect And $iXPoint <= $iXRect + $iWidthRect And $iYPoint <= $iYRect + $iHeightRect Then Return 1
    Return 0
    EndFunc ;==>_PtIsInRect

    [/autoit]


    Wenn die Funktion 1 zurückgibt wurde der Button geklickt ;).

    Edit: *seufz* ich sollte versuchen schneller zu schreiben... :S

  • Ich würde ein Label "unter" der GDI+ Grafik erstellen.
    Damit funktioniert das Script genauso, als würdest du Buttons benutzen:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Global Const $SS_OWNERDRAW = 0x0000000D

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

    Opt("GUIOnEventMode", 1)

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

    _GDIPlus_Startup()

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

    Global $hGui = GUICreate("Test", 300, 200)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_EXIT")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics(300, 200, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)

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

    Global $hPen = _GDIPlus_PenCreate(0xFFFFFF00)
    Global $hBrush = _GDIPlus_BrushCreateSolid(0xFF0000FF)

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

    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

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

    Global $cLabel1 = GUICtrlCreateLabel("", 50, 50, 100, 30, $SS_OWNERDRAW)
    GUICtrlSetOnEvent($cLabel1, "_Button")
    _GDIPlus_GraphicsFillRect($hGfxBuffer, 50, 50, 100, 30, $hBrush)
    _GDIPlus_GraphicsDrawRect($hGfxBuffer, 50, 50, 100, 30, $hPen)

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

    Global $cLabel2 = GUICtrlCreateLabel("", 50, 100, 100, 30, $SS_OWNERDRAW)
    GUICtrlSetOnEvent($cLabel2, "_Button")
    _GDIPlus_GraphicsFillRect($hGfxBuffer, 50, 100, 100, 30, $hBrush)
    _GDIPlus_GraphicsDrawRect($hGfxBuffer, 50, 100, 100, 30, $hPen)

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _Button()
    Switch @GUI_CtrlId
    Case $cLabel1
    MsgBox(0, "", "Button 1 wurde gedrückt")
    Case $cLabel2
    MsgBox(0, "", "Button 2 wurde gedrückt")
    EndSwitch
    EndFunc ;==>_Button

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _Exit()
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Edit: Das geht natürlich auch mit der GuiGetMsg-Methode!

    E

  • Hier eine andere Variante mit einem alten GDI+ Zeug von mir ;)

    Spoiler anzeigen
    [autoit]


    ;coded by UEZ 2009
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GDIplus.au3>
    #include <WindowsConstants.au3>

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

    Local Const $width = @DesktopWidth / 2
    Local Const $height = @DesktopHeight / 2
    Opt("GUIOnEventMode", 1)

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

    Local $fps = 0, $fps_diff, $fps_maintimer, $fps_timer, $display_FPS = -15
    Local $trig = ACos(-1) / 180
    Local $max_dots = 100
    Local $max_speed = 8
    Local $iWidth = 10
    Local $iHeight = 10
    Local $hGUI = GUICreate("Border Collision with " & $max_dots & " objects! 0 FPS", $width, $height, -1, -1, Default, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW))
    Local $Button = GUICtrlCreateButton("Exit", $width / 2 - 50, $height / 2 - 15, 100, 30)
    Local $Input = GUICtrlCreateInput("Coded by UEZ", $width / 4, $height - 40, $width / 2, 20, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))

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

    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphics)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    ;~ _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)
    Local $hBrush_Clear = _GDIPlus_BrushCreateSolid(0xFF000000)

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

    Global Const $GW_CHILD = 5
    Global Const $GW_HWNDNEXT = 2
    Global $hRegion = _GDIPlus_RegionCreateFromRect(_GDIPlus_RectFCreate(0, 0, $width, $height))
    Global $hChild = _WinAPI_GetWindow($hGUI, $GW_CHILD)
    Global $aRect
    Do
    $aRect = ControlGetPos($hChild, "", 0)
    _GDIPlus_RegionCombineRect($hRegion, _GDIPlus_RectFCreate($aRect[0], $aRect[1], $aRect[2], $aRect[3]), 3)
    $hChild = _WinAPI_GetWindow($hChild, $GW_HWNDNEXT)
    Until Not $hChild
    _GDIPlus_GraphicsSetClipRegion($hGraphics, $hRegion)
    _GDIPlus_RegionDispose($hRegion)

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

    GUISetState()

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

    GUICtrlSetOnEvent($Button, "Close")
    GUISetOnEvent($GUI_EVENT_CLOSE, "close")

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

    Dim $coordinates[$max_dots][5], $angle
    Dim $hBrush[$max_dots]
    Initialize()

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

    $fps_maintimer = TimerInit()
    Do
    For $x = -0x7FFFFFFF To 0x7FFFFFFF
    $fps_timer = TimerInit()
    Draw_Dots()
    Calculate_New_Position()
    Sleep(30)
    $fps_diff = TimerDiff($fps_timer)
    If TimerDiff($fps_maintimer) >= 1000 Then ;calculate FPS
    $fps = Round(1000 / $fps_diff)
    $fps_maintimer = TimerInit()
    EndIf
    WinSetTitle($hGUI, "", "Border Collision with " & $max_dots & " objects! " & $fps & " FPS")
    Next
    Until False

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

    Func Initialize()
    For $k = 0 To $max_dots - 1
    $hBrush[$k] = _GDIPlus_BrushCreateSolid(Random(0xD0808080, 0xD0FFFFFF, 1))
    New_Coordinates($k)
    Next
    EndFunc ;==>Initialize

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

    Func Draw_Dots()
    Local $i, $temp_x, $temp_y
    _GDIPlus_GraphicsFillRect($hBackbuffer, 0, 0, $width, $height, $hBrush_Clear)
    For $i = 0 To $max_dots - 1
    _GDIPlus_GraphicsFillEllipse($hBackbuffer, $coordinates[$i][0], $coordinates[$i][1], $iWidth, $iHeight, $hBrush[$i])
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $width, $height)
    EndFunc ;==>Draw_Dots

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

    Func New_Coordinates($k)
    $coordinates[$k][0] = $width / 2 ;Random($width / 20, $width - $width / 20, 1);start x position
    $coordinates[$k][1] = $height / 2 ;Random($height / 20, $height - $height / 20, 1) ;start y position
    $coordinates[$k][2] = Random(1, $max_speed, 1) ;speed of pixel
    $angle = Random(0, 359, 1)
    ;~ ConsoleWrite("Angle: " & $angle & "°" & @CRLF)
    $coordinates[$k][3] = $coordinates[$k][2] * Cos($angle * $trig)
    $coordinates[$k][4] = $coordinates[$k][2] * Sin($angle * $trig)
    EndFunc ;==>New_Coordinates

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

    Func Calculate_New_Position()
    Local $k
    For $k = 0 To $max_dots - 1
    $coordinates[$k][0] += $coordinates[$k][3] ;increase x coordinate with appropriate slope
    $coordinates[$k][1] += $coordinates[$k][4] ;increase y coordinate with appropriate slope
    If $coordinates[$k][0] <= 0 Then ;border collision x left
    $coordinates[$k][0] = 1
    $coordinates[$k][3] *= -1
    ElseIf $coordinates[$k][0] >= $width - $iWidth Then ;border collision x right
    $coordinates[$k][0] = $width - ($iWidth + 1)
    $coordinates[$k][3] *= -1
    EndIf
    If $coordinates[$k][1] <= 0 Then ;border collision y top
    $coordinates[$k][1] = 1
    $coordinates[$k][4] *= -1
    ElseIf $coordinates[$k][1] >= $height - $iHeight Then ;border collision y bottom
    $coordinates[$k][1] = $height - ($iHeight + 1)
    $coordinates[$k][4] *= -1
    EndIf
    Next
    EndFunc ;==>Calculate_New_Position

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

    Func close()
    For $k = 0 To $max_dots - 1
    _GDIPlus_BrushDispose($hBrush[$k])
    Next
    _GDIPlus_BrushDispose($hBrush_Clear)
    _GDIPlus_GraphicsDispose($hBackbuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>close

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

    Func _GDIPlus_GraphicsSetClipRegion($hGraphics, $hRegion, $iCombineMode = 0)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetClipRegion", "hwnd", $hGraphics, "hwnd", $hRegion, "int", $iCombineMode)

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

    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0] = 0
    EndFunc

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

    Func _GDIPlus_RegionCreateFromRect($tRectF)
    Local $pRectF, $aResult

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

    $pRectF = DllStructGetPtr($tRectF)
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateRegionRect", "ptr", $pRectF, "int*", 0)

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

    If @error Then Return SetError(@error, @extended, 0)
    Return $aResult[2]
    EndFunc

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

    Func _GDIPlus_RegionCombineRect($hRegion, $tRectF, $iCombineMode = 2)
    Local $pRectF, $aResult

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

    $pRectF = DllStructGetPtr($tRectF)
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCombineRegionRect", "hwnd", $hRegion, "ptr", $pRectF, "int", $iCombineMode)

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

    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0] = 0
    EndFunc

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

    Func _GDIPlus_RegionDispose($hRegion)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipDeleteRegion", "hwnd", $hRegion)

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

    If @error Then Return SetError(@error, @extended, False)
    Return $aResult[0] = 0
    EndFunc

    [/autoit]

    Nachtrag: du wolltest ja ein GDI+ Button. Nun ja, hier die Version mit den Build-In Button. Habe es wohl überlesen... :whistling:

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    2 Mal editiert, zuletzt von UEZ (29. November 2010 um 21:10)