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
#cs ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]AutoIt Version: 3.3.6.0
Author: myName
Script Function:
Template AutoIt script.
#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>
Local Const $PRESSED = 1
Local Const $UNPRESSED = 2
$Form1 = GUICreate("Form1", 625, 445)
GUISetBkColor(0xF0F0F0)
GUISetState(@SW_SHOW)
$timer = TimerInit()
$Btn = _GDIPlusButton_Create($Form1, "Klick" , 10, 10, 100, 25)
GUICtrlCreateButton("Klick", 10, 80, 100, 25)
[/autoit] [autoit][/autoit] [autoit]While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Btn[0]
_GDIPlusButton_SetState($Btn, $PRESSED)
_BildWurdeAngeklickt($Form1, $Btn[0])
_GDIPlusButton_SetState($Btn, $UNPRESSED)
EndSwitch
WEnd
;Ü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
UDF
#cs ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]AutoIt Version: 3.3.6.0
Author: myName
Script Function:
Template AutoIt script.
#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]; Script Start - Add your code below here
[/autoit] [autoit][/autoit] [autoit]#include <GDIPlus.au3>
#include <Array.au3>
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)
$hBMP = _GDIPlus_BitmapCreateFromGraphics($breite, $Hoehe, $capGraph)
_GDIPlus_GraphicsDispose($capGraph)
$capGraph = _GDIPlus_ImageGetGraphicsContext($hBMP)
_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
$aPoints[2][0] = $breite - 2
$aPoints[2][1] = 0
$aPoints[3][0] = $breite - 1
$aPoints[3][1] = 1
$aPoints[4][0] = $breite - 1
$aPoints[4][1] = $Hoehe - 2
$aPoints[5][0] = $breite - 2
$aPoints[5][1] = $Hoehe - 1
$aPoints[6][0] = 1
$aPoints[6][1] = $Hoehe - 1
$aPoints[7][0] = 0
$aPoints[7][1] = $Hoehe - 2
$aPoints[8][0] = 0
$aPoints[8][1] = 1
_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
$aPoints[2][0] = $breite - 2 - 2
$aPoints[2][1] = 0 + 1
$aPoints[3][0] = $breite - 1 - 1
$aPoints[3][1] = 1 + 2
$aPoints[4][0] = $breite - 1 - 1
$aPoints[4][1] = $Hoehe - 2 - 2
$aPoints[5][0] = $breite - 2 - 2
$aPoints[5][1] = $Hoehe - 1 - 1
$aPoints[6][0] = 1 + 2
$aPoints[6][1] = $Hoehe - 1 - 1
$aPoints[7][0] = 0 + 1
$aPoints[7][1] = $Hoehe - 2 - 2
$aPoints[8][0] = 0 + 1
$aPoints[8][1] = 1 + 2
_GDIPlus_GraphicsDrawPolygon ($capGraph, $aPoints, _GDIPlus_PenCreate(0xFFFFFFFF))
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Local $AnzahlLinien = ($Hoehe - 7) + 2
Local $Array = ColorGradient(0xFCFCFC, 0xCFCFCF, $AnzahlLinien)
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
$pen = _GDIPlus_PenCreate(Number("0xFF" & Hex($Array[$AnzahlLinien - 1], 6)))
_GDIPlus_GraphicsDrawLine($capGraph, 3, $Hoehe - 3, $breite - 4, $Hoehe - 3, $pen)
;~ _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
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]
_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
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
$pen = _GDIPlus_PenCreate(Number("0xFF" & Hex($Array[$AnzahlLinien - 1], 6)))
_GDIPlus_GraphicsDrawLine($capGraph, 3, $Hoehe - 3, $breite - 4, $Hoehe - 3, $pen)
$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)
Local $iRed1 = Dec(StringLeft($hMinColor, 2))
Local $iGreen1 = Dec(StringMid($hMinColor, 3, 2))
Local $iBlue1 = Dec(StringMid($hMinColor, 5, 2))
Local $iRed2 = Dec(StringLeft($hMaxColor, 2))
Local $iGreen2 = Dec(StringMid($hMaxColor, 3, 2))
Local $iBlue2 = Dec(StringMid($hMaxColor, 5, 2))
Local $iRndRed = Random($iRed1, $iRed2, 1)
Local $iRndGreen = Random($iGreen1, $iGreen2, 1)
Local $iRndBlue = Random($iBlue1, $iBlue2, 1)
Return Dec(Hex($iRndRed, 2) & Hex($iRndGreen, 2) & Hex($iRndBlue, 2))
EndFunc ;==>RandomColor
Func ColorGradient($hInitialColor, $hFinalColor, $iReturnSize)
$hInitialColor = Hex($hInitialColor, 6)
$hFinalColor = Hex($hFinalColor, 6)
Local $iRed1 = Dec(StringLeft($hInitialColor, 2))
Local $iGreen1 = Dec(StringMid($hInitialColor, 3, 2))
Local $iBlue1 = Dec(StringMid($hInitialColor, 5, 2))
Local $iRed2 = Dec(StringLeft($hFinalColor, 2))
Local $iGreen2 = Dec(StringMid($hFinalColor, 3, 2))
Local $iBlue2 = Dec(StringMid($hFinalColor, 5, 2))
Local $iPlusRed = ($iRed2 - $iRed1) / ($iReturnSize - 1)
Local $iPlusBlue = ($iBlue2 - $iBlue1) / ($iReturnSize - 1)
Local $iPlusGreen = ($iGreen2 - $iGreen1) / ($iReturnSize - 1)
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
;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
Local $hWnd = GUICtrlGetHandle($CtrlId)
If $hWnd = 0 Then Return SetError(1, 0, 0)
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)
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
;Beim beenden.
Func _AutoItExit()
_GDIPlus_Shutdown()
EndFunc
#EndRegion Methoden
[/autoit]