GDI+ Button Hilfe

  • Hallo,

    ich hab mal aus langeweile einen GDI+ Button gescriptet. Doch wenn ich auf diesen Button mehrmals klicke, wird es aus unerklärlichen Gründen an den Rändern dunkler. Ich hab dabei doch auch Antialiasing auf 0 gestellt...

    Hier der Code. Ist zwar noch ziemlich unordentlich, wird sich aber bald ändern ^^

    Beispielscript
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.0
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <GDI+ Button.au3>

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

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

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

    Local Const $PRESSED = 1
    Local Const $UNPRESSED = 2

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

    $Form1 = GUICreate("Form1", 625, 445)
    GUISetBkColor(0xF0F0F0)
    GUISetState(@SW_SHOW)

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

    $timer = TimerInit()
    $Btn = _GDIPlusButton_Create($Form1, "Klick" , 10, 10, 100, 25)

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

    GUICtrlCreateButton("Klick", 10, 80, 100, 25)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $Btn[0]
    _GDIPlusButton_SetState($Btn, $PRESSED)
    _BildWurdeAngeklickt($Form1, $Btn[0])
    _GDIPlusButton_SetState($Btn, $UNPRESSED)

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

    EndSwitch
    WEnd

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

    ;Überprüft, ob das Bild angeklickt und losgelassen wurde.
    Func _BildWurdeAngeklickt($xFensterHandle, $xBildHandle, $xBildBeiKlick = -1, $xBildBeiHover = -1, $xDelay = 20)
    ;Findet den Cursor-Info heraus.
    Local $xCursorInfo = GUIGetCursorInfo($xFensterHandle)
    ;Bricht die Funktion bei Fehler ab.
    If Not IsArray($xCursorInfo) Then Return 0
    ;Wartet, bis geklickt wurde.
    Do
    $xCursorInfo = GUIGetCursorInfo($xFensterHandle)
    If Not $xCursorInfo[2] Then
    ;Bricht die Funktion ab.
    Return 1
    EndIf
    ;Verlangsamt die Schleife.
    Sleep($xDelay)
    Until $xCursorInfo[4] <> $xBildHandle
    ;Gibt die 0 wieder.
    Return 0
    EndFunc ;==>_ImagePressed_Wait

    [/autoit]
    UDF
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.0
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <GDIPlus.au3>
    #include <Array.au3>

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

    OnAutoItExitRegister("_AutoItExit")

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

    _GDIPlus_Startup()

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

    #region Methoden

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

    Func _GDIPlusButton_Create($hWnd, $Text, $x, $y, $breite, $Hoehe)
    $capGraph = _GDIPlus_GraphicsCreateFromHWND($hWnd)

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

    $hBMP = _GDIPlus_BitmapCreateFromGraphics($breite, $Hoehe, $capGraph)
    _GDIPlus_GraphicsDispose($capGraph)
    $capGraph = _GDIPlus_ImageGetGraphicsContext($hBMP)

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

    _GDIPlus_GraphicsSetSmoothingMode($capGraph, 4)

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

    Local $aPoints[9][2]

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

    $aPoints[0][0] = 8

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

    $aPoints[1][0] = 1
    $aPoints[1][1] = 0

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

    $aPoints[2][0] = $breite - 2
    $aPoints[2][1] = 0

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

    $aPoints[3][0] = $breite - 1
    $aPoints[3][1] = 1

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

    $aPoints[4][0] = $breite - 1
    $aPoints[4][1] = $Hoehe - 2

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

    $aPoints[5][0] = $breite - 2
    $aPoints[5][1] = $Hoehe - 1

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

    $aPoints[6][0] = 1
    $aPoints[6][1] = $Hoehe - 1

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

    $aPoints[7][0] = 0
    $aPoints[7][1] = $Hoehe - 2

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

    $aPoints[8][0] = 0
    $aPoints[8][1] = 1

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

    _GDIPlus_GraphicsDrawPolygon ($capGraph, $aPoints, _GDIPlus_PenCreate(0xFF707070))

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

    _GDIPlus_GraphicsSetSmoothingMode($capGraph, 0)

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

    $aPoints[0][0] = 8

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

    $aPoints[1][0] = 1 + 2
    $aPoints[1][1] = 0 + 1

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

    $aPoints[2][0] = $breite - 2 - 2
    $aPoints[2][1] = 0 + 1

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

    $aPoints[3][0] = $breite - 1 - 1
    $aPoints[3][1] = 1 + 2

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

    $aPoints[4][0] = $breite - 1 - 1
    $aPoints[4][1] = $Hoehe - 2 - 2

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

    $aPoints[5][0] = $breite - 2 - 2
    $aPoints[5][1] = $Hoehe - 1 - 1

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

    $aPoints[6][0] = 1 + 2
    $aPoints[6][1] = $Hoehe - 1 - 1

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

    $aPoints[7][0] = 0 + 1
    $aPoints[7][1] = $Hoehe - 2 - 2

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

    $aPoints[8][0] = 0 + 1
    $aPoints[8][1] = 1 + 2

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

    _GDIPlus_GraphicsDrawPolygon ($capGraph, $aPoints, _GDIPlus_PenCreate(0xFFFFFFFF))

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

    Local $AnzahlLinien = ($Hoehe - 7) + 2
    Local $Array = ColorGradient(0xFCFCFC, 0xCFCFCF, $AnzahlLinien)

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

    Local $pen = _GDIPlus_PenCreate(Number("0xFF" & Hex($Array[0], 6)))

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

    _GDIPlus_GraphicsDrawLine($capGraph, 3, 2, $breite - 4, 2, $pen)

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

    For $i = 0 To $Hoehe - 7
    $pen = _GDIPlus_PenCreate(Number("0xFF" & Hex($Array[$i + 1], 6)))
    _GDIPlus_GraphicsDrawLine($capGraph, 2, 3 + $i, $breite - 3, 3 + $i, $pen)
    Next

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

    $pen = _GDIPlus_PenCreate(Number("0xFF" & Hex($Array[$AnzahlLinien - 1], 6)))
    _GDIPlus_GraphicsDrawLine($capGraph, 3, $Hoehe - 3, $breite - 4, $Hoehe - 3, $pen)

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

    ;~ _GDIPlus_GraphicsDrawString($capGraph, $Text, 25, 10, "Arial", 12)

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

    $hBitmap_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBMP)

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

    Local $ID = GUICtrlCreatePic("", $x, $y, $breite, $Hoehe)

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

    _SetBitmapToCtrl($ID, $hBitmap_GDI)
    ;~ _GDIPlus_GraphicsDispose($capGraph)
    ;~ _GDIPlus_BitmapDispose($hBMP)
    Local $ar[6] = [$ID, $capGraph, $hBMP, $breite, $Hoehe, $AnzahlLinien]
    Return $ar
    EndFunc

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

    Func _GDIPlusButton_SetState($button, $State)
    Local $capGraph = $button[1]
    Local $hBMP = $button[2]
    Local $breite = $button[3]
    Local $Hoehe = $button[4]
    Local $AnzahlLinien = $button[5]

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

    _GDIPlus_GraphicsSetSmoothingMode($capGraph, 0)

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

    Local $pen = _GDIPlus_PenCreate(0xFF000000)

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

    ;~ _GDIPlus_GraphicsDrawLine($capGraph, 1, 1, 50, 10, $pen)

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

    If $State = 1 Then
    Local $Array = ColorGradient(0xCFCFCF, 0xFCFCFC, $AnzahlLinien)
    ElseIf $State = 2 Then
    Local $Array = ColorGradient(0xFCFCFC, 0xCFCFCF, $AnzahlLinien)
    EndIf

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

    Local $pen = _GDIPlus_PenCreate(Number("0xFF" & Hex($Array[0], 6)))

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

    _GDIPlus_GraphicsDrawLine($capGraph, 3, 2, $breite - 4, 2, $pen)

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

    For $i = 0 To $Hoehe - 7
    $pen = _GDIPlus_PenCreate(Number("0xFF" & Hex($Array[$i + 1], 6)))
    _GDIPlus_GraphicsDrawLine($capGraph, 2, 3 + $i, $breite - 3, 3 + $i, $pen)
    Next

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

    $pen = _GDIPlus_PenCreate(Number("0xFF" & Hex($Array[$AnzahlLinien - 1], 6)))
    _GDIPlus_GraphicsDrawLine($capGraph, 3, $Hoehe - 3, $breite - 4, $Hoehe - 3, $pen)

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

    $hBitmap_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBMP)

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

    _SetBitmapToCtrl($button[0], $hBitmap_GDI)

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

    EndFunc

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

    Func RandomColor($hMinColor = 0x000000, $hMaxColor = 0xFFFFFF)
    $hMinColor = Hex($hMinColor, 6)
    $hMaxColor = Hex($hMaxColor, 6)

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

    Local $iRed1 = Dec(StringLeft($hMinColor, 2))
    Local $iGreen1 = Dec(StringMid($hMinColor, 3, 2))
    Local $iBlue1 = Dec(StringMid($hMinColor, 5, 2))

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

    Local $iRed2 = Dec(StringLeft($hMaxColor, 2))
    Local $iGreen2 = Dec(StringMid($hMaxColor, 3, 2))
    Local $iBlue2 = Dec(StringMid($hMaxColor, 5, 2))

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

    Local $iRndRed = Random($iRed1, $iRed2, 1)
    Local $iRndGreen = Random($iGreen1, $iGreen2, 1)
    Local $iRndBlue = Random($iBlue1, $iBlue2, 1)

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

    Return Dec(Hex($iRndRed, 2) & Hex($iRndGreen, 2) & Hex($iRndBlue, 2))
    EndFunc ;==>RandomColor

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

    Func ColorGradient($hInitialColor, $hFinalColor, $iReturnSize)
    $hInitialColor = Hex($hInitialColor, 6)
    $hFinalColor = Hex($hFinalColor, 6)

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

    Local $iRed1 = Dec(StringLeft($hInitialColor, 2))
    Local $iGreen1 = Dec(StringMid($hInitialColor, 3, 2))
    Local $iBlue1 = Dec(StringMid($hInitialColor, 5, 2))

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

    Local $iRed2 = Dec(StringLeft($hFinalColor, 2))
    Local $iGreen2 = Dec(StringMid($hFinalColor, 3, 2))
    Local $iBlue2 = Dec(StringMid($hFinalColor, 5, 2))

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

    Local $iPlusRed = ($iRed2 - $iRed1) / ($iReturnSize - 1)
    Local $iPlusBlue = ($iBlue2 - $iBlue1) / ($iReturnSize - 1)
    Local $iPlusGreen = ($iGreen2 - $iGreen1) / ($iReturnSize - 1)

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

    Dim $iColorArray[$iReturnSize]
    For $i = 0 To $iReturnSize - 1
    $iNowRed = Floor($iRed1 + ($iPlusRed * $i))
    $iNowBlue = Floor($iBlue1 + ($iPlusBlue * $i))
    $iNowGreen = Floor($iGreen1 + ($iPlusGreen * $i))
    $iColorArray[$i] = Dec(Hex($iNowRed, 2) & Hex($iNowGreen, 2) & Hex($iNowBlue, 2))
    Next
    Return ($iColorArray)
    EndFunc ;==>ColorGradient

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

    ;Setzt ein Bild in ein Control.
    Func _SetBitmapToCtrl($CtrlId, $hBitmap)
    Local Const $STM_SETIMAGE = 0x0172
    Local Const $IMAGE_BITMAP = 0
    Local Const $SS_BITMAP = 0xE
    Local Const $GWL_STYLE = -16

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

    Local $hWnd = GUICtrlGetHandle($CtrlId)
    If $hWnd = 0 Then Return SetError(1, 0, 0)

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

    Local $oldStyle = DllCall("user32.dll", "long", "GetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE)
    If @error Then Return SetError(2, 0, 0)
    DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE, "long", BitOR($oldStyle[0], $SS_BITMAP))
    If @error Then Return SetError(3, 0, 0)

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

    Local $oldBmp = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
    If @error Then Return SetError(4, 0, 0)
    If $oldBmp[0] <> 0 Then DllCall("GDI32.dll", "int", "DeleteObject", "int", $oldBmp[0])
    Return 1
    EndFunc ;==>_SetBitmapToCtrl

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

    ;Beim beenden.
    Func _AutoItExit()
    _GDIPlus_Shutdown()
    EndFunc

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

    #EndRegion Methoden

    [/autoit]
  • Also bei mir wird nix dunkler, funzt super. Meldung zurück, wird doch dunkler ;-).

    Einmal editiert, zuletzt von m-obi (9. April 2010 um 06:12)