Guten Tag zusammen,
ich bin dabei über eine Checkbox eine Bitmap zulegen, mit dem Befehl: _GUICtrlButton_SetImageList. Das klappt auch so weit.
Ich habe nur folgendes Problem:
Wenn die Checkbox den Status : "Unchecked" hat, und ich sie mit dem Befehl: _GUICtrlButton_Enable($gSwitch, False) deaktiviere, dann verschwindet meine Bitmap kurz, bevor die nächste erscheint.
Bei allen anderen Änderungen passiert das nicht.
Hier ist ein Beispiel Code:
C
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Add_Constants=n
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;Funktionen
#include <GDIPlus.au3>
#include <GuiImageList.au3>
#include <GuiButton.au3>
;Constanten
#include <AutoItConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <GDIPlusConstants.au3>
;----------------------------------------------------------------------------
;Create Main-GUI
;----------------------------------------------------------------------------
Global $hGUI = GUICreate(@ScriptName, 300, 330, -1, -1, $WS_POPUP+$WS_BORDER)
;Fenstergröße bestimmen
Local $aWinPos = WinGetPos($hGUI)
Global $GUI_Width = $aWinPos[2]
Global $GUI_Height = $aWinPos[3] - 30 ;Wegen der Titelbar 30 abziehen
GUISetBkColor(0x13161F, $hGUI)
GUISetState(@SW_SHOW, $hGUI)
Local $gButton = GUICtrlCreateButton("x", $aWinPos[2]-50,0, 50,30) ;Close Button
Local $gButton2 = GUICtrlCreateButton("Disable", 120,50, 100,30) ;
Local $gSwitch = CreateSwitch("Allgemein", 50,50, 60,30, 0xFF13161F, 0xFF00A000, 0xFFFFFFFF)
;----------------------------------------------------------------------------
;Design GUI
;----------------------------------------------------------------------------
While 1 ;Endlosschleife
Switch GUIGetMsg() ;Empfängt alle klicks auf Buttons und verarbeitet diese
Case $GUI_EVENT_CLOSE, $gButton ;Kreuz oben rechts
GUIDelete($hGUI)
Exit 0 ;beendet das Skript
;--------------------------------------------------------------------
;Buttons
;--------------------------------------------------------------------
Case $gButton2
GUICtrlSetData($gButton2, "Enable")
If Not ControlCommand($hGUI, "", $gSwitch, "IsEnabled") Then
_GUICtrlButton_Enable($gSwitch, True)
Else
_GUICtrlButton_Enable($gSwitch, False)
EndIf
EndSwitch
WEnd
Func CreateSwitch($sText, $iLeft,$iTop, $iWidth=90,$iHeight=40, $iBKColor = 0xFFFFFFFF, $iColorAkzent = 0xFF00A000, $iTxtColor = 0xFF000000, $iState = 15, $iFontSize = 8.5, $sFont = "Arial", $iAlign = 1, $iFontStyle = 0)
Local $gButton = GUICtrlCreateCheckbox("", $iLeft, $iTop, $iWidth, $iHeight, $BS_BITMAP) ;Erstellt einen Button mit den Parametern des Nutzers
GUICtrlSetBkColor(-1, "0x" & StringRight(Hex($iBKColor), 6))
Local $hBitmapWithText[8]
_GDIPlus_Startup()
;Bitmaps erstellen
If IsArray($iBKColor) Then
For $i = 0 To UBound($hBitmapWithText)-1
If IsPtr($iBKColor[$i]) Then
$hBitmapWithText[$i] = $iBKColor[$i]
Else
$hBitmapWithText[$i] = _GDIPlus_CreateSwitchBmp($iWidth, $iHeight, $iBKColor[$i], $sText, $iTxtColor, $iState, 0xFFFFFFFF, $iFontSize,$sFont,$iAlign,$iFontStyle) ;Standart-Farbe
EndIf
Next
Else
$hBitmapWithText[0] = _GDIPlus_CreateSwitchBmp($iWidth, $iHeight, $iBkColor, $iColorAkzent, $sText, $iTxtColor, 128, 0xFFFFFFFF, $iFontSize,$sFont,$iAlign,$iFontStyle) ;Standart-Farbe (unchecked)
$hBitmapWithText[1] = _GDIPlus_CreateSwitchBmp($iWidth, $iHeight, $iBkColor, $iColorAkzent, $sText, $iTxtColor, 129, 0xFFFFFFFF, $iFontSize,$sFont,$iAlign,$iFontStyle) ;Hover-Over (unchecked)
$hBitmapWithText[2] = _GDIPlus_CreateSwitchBmp($iWidth, $iHeight, $iBkColor, $iColorAkzent, $sText, $iTxtColor, 130, 0xFFFFFFFF, $iFontSize,$sFont,$iAlign,$iFontStyle) ;Pressed (State bevor: unchecked)
$hBitmapWithText[3] = _GDIPlus_CreateSwitchBmp($iWidth, $iHeight, $iBkColor, $iColorAkzent, $sText, $iTxtColor, 192, 0xFFFFFFFF, $iFontSize,$sFont,$iAlign,$iFontStyle) ;Disabled
$hBitmapWithText[4] = _GDIPlus_CreateSwitchBmp($iWidth, $iHeight, $iBkColor, $iColorAkzent, $sText, $iTxtColor, 260, 0xFFFFFFFF, $iFontSize,$sFont,$iAlign,$iFontStyle) ;Standart-Farbe (checked)
$hBitmapWithText[5] = _GDIPlus_CreateSwitchBmp($iWidth, $iHeight, $iBkColor, $iColorAkzent, $sText, $iTxtColor, 264, 0xFFFFFFFF, $iFontSize,$sFont,$iAlign,$iFontStyle) ;Hover-Over (checked)
$hBitmapWithText[6] = _GDIPlus_CreateSwitchBmp($iWidth, $iHeight, $iBkColor, $iColorAkzent, $sText, $iTxtColor, 272, 0xFFFFFFFF, $iFontSize,$sFont,$iAlign,$iFontStyle) ;Pressed (State bevor: checked)
$hBitmapWithText[7] = _GDIPlus_CreateSwitchBmp($iWidth, $iHeight, $iBkColor, $iColorAkzent, $sText, $iTxtColor, 352, 0xFFFFFFFF, $iFontSize,$sFont,$iAlign,$iFontStyle) ;Disabled
EndIf
;ImageList erstellen
Local $gImageList = _GUIImageList_Create($iWidth, $iHeight, 5, 3, UBound($hBitmapWithText)-1) ;Erstellt eine Imagelist und scaliert dann alle Bilder auf die Maße des Buttons
For $i = 0 To UBound($hBitmapWithText)-1 ;Befüllt die Imagelist mit den gewählten Icons aus der zuvor erstellten ".dll"
Local $test = _GUIImageList_Add($gImageList, $hBitmapWithText[$i])
Next
;Button erstellen abschliesen
_GUICtrlButton_SetImageList($gButton, $gImageList, 1, 0,0,0,0) ;weißt die Imagelist dem Button zu
_GDIPlus_Shutdown()
Return $gButton ;gibt den Handel zum Button zurück
EndFunc
Func _GDIPlus_CreateSwitchBmp($iW, $iH, $iBkColor = 0xFFFFFFFF, $iColorAkzent = 0xFF00A000, $sTXT = "", $iTxtColor = 0xFF000000, $iState = 0, $iStateColor = 0xFFFFFFFF, $iFontSize = 8.5, $sFont = "Arial", $iAlign = 1, $iFontStyle = 0)
Local $hBitmap = DllCall($__g_hGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW, "int", $iH, "int", 0, "int", $GDIP_PXF32ARGB, "ptr", 0, "int*", 0) ;Erstellt irgendwie eine Bitmap und gibt dazu eineige Infos mit aus
$hBitmap = $hBitmap[6] ;Nimmt nur das was gebraucht wird.
Local $hBmpCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) ;erstellt ein Handel zu einem Graphic object basierend auf der erstellten Bitmap
_GDIPlus_GraphicsSetSmoothingMode($hBmpCtxt, 2)
;Erstellt die benötigten Objekt-Tools
;Brusches
Local $hBrushBackground = _GDIPlus_BrushCreateSolid($iBkColor) ;Pinsel Hintergrund
Local $hBrushAkzent = _GDIPlus_BrushCreateSolid(0xFF606060) ;Pinsel Aktzent Farbe
Local $hBrushWhite = _GDIPlus_BrushCreateSolid(0xFFFFFFFF) ;Pinsel White
;Pens
Local $hPenBoarder = _GDIPlus_PenCreate($iStateColor, 1) ;Erstellt einen Stift, er wird später ggf. dicker gemacht
Local $hPen = _GDIPlus_PenCreate($iStateColor, 1) ;Erstellt einen Stift
;Fonts for Text
Local $hFormat = _GDIPlus_StringFormatCreate() ;Format
Local $hFamily = _GDIPlus_FontFamilyCreate($sFont) ;Font Family
Local $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize, $iFontStyle) ;Font
Local $tLayout = _GDIPlus_RectFCreate($iH, $iH / 2 - ($iFontSize / 1.3), $iW-$iH, $iH) ;Rechteck in dem der String kommt
_GDIPlus_StringFormatSetAlign($hFormat, $iAlign) ;Ausrichtung
;zeichnen der Bitmap
;Hintergrund
_GDIPlus_GraphicsFillRect($hBmpCtxt, -1,-1, $iW+1,$iH+1, $hBrushBackground)
;State dependig modifications
If BitAND($iState, 1) = 1 Then _GDIPlus_BrushSetSolidColor($hBrushAkzent, 0xFF808080) ;setzt die Akzent farbe etwas Heller als Grau
If BitAND($iState, 2) = 2 Then _GDIPlus_BrushSetSolidColor($hBrushAkzent, 0xFF707070) ;setzt die Akzent farbe auf die angegebene Akzentfarbe
If BitAND($iState, 4) = 4 Then _GDIPlus_BrushSetSolidColor($hBrushAkzent, $iColorAkzent) ;setzt die Akzent farbe auf die angegebene Akzentfarbe
If BitAND($iState, 8) = 8 Then _GDIPlus_BrushSetSolidColor($hBrushAkzent, GetChangeColor($iColorAkzent, 0x00202020, False)) ;setzt die Akzent farbe auf die angegebene Akzentfarbe
If BitAND($iState, 16) = 16 Then _GDIPlus_BrushSetSolidColor($hBrushAkzent, GetChangeColor($iColorAkzent, 0x00101010, False)) ;setzt die Akzent farbe auf die angegebene Akzentfarbe
If BitAND($iState, 32) = 32 Then _GDIPlus_BrushSetSolidColor($hBrushAkzent, GetChangeColor($iColorAkzent, 0x00404040, True)) ;setzt die Akzent farbe auf die angegebene Akzentfarbe
$iW -=2
$iH -=2
_GDIPlus_GraphicsFillEllipse($hBmpCtxt, 0,0, $iH,$iH, $hBrushAkzent)
_GDIPlus_GraphicsFillRect($hBmpCtxt, ($iH/2),0, $iW-$iH,$iH, $hBrushAkzent)
_GDIPlus_GraphicsFillEllipse($hBmpCtxt, $iW-$iH,0, $iH,$iH, $hBrushAkzent)
If BitAND($iState, 64) = 64 Then _GDIPlus_BrushSetSolidColor($hBrushWhite, 0xFFA0A0A0) ;setzt die Punkt Farbe Grauer
If BitAND($iState, 128) = 128 Then _GDIPlus_GraphicsFillEllipse($hBmpCtxt, $iW/20,$iH/10, $iH-$iH/5,$iH-$iH/5, $hBrushWhite) ;Zeichnet den linken Punkt
If BitAND($iState, 256) = 256 Then _GDIPlus_GraphicsFillEllipse($hBmpCtxt, $iW-$iW/20-($iH-$iH/5),$iH/10, $iH-$iH/5,$iH-$iH/5, $hBrushWhite) ;Zeichnet den Rechten Punkt
;Erstellt das Handle zu dem Objekt
Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
;löscht alle nicht mehr benötigten Objekte
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_BrushDispose($hBrushAkzent)
_GDIPlus_BrushDispose($hBrushWhite)
_GDIPlus_GraphicsDispose($hBmpCtxt)
_GDIPlus_BitmapDispose($hBitmap)
;rückgabe des handels
Return $hHBitmap
EndFunc
Func GetChangeColor($hexColor, $hexOffset, $bDarker = True)
Local $iColorLen = StringLen(Hex($hexColor))
Local $iOffsetLen = StringLen(Hex($hexOffset))
;Color
Local $iRed = Dec(StringMid(Hex($hexColor), $iColorLen-5, 2))
Local $iGrn = Dec(StringMid(Hex($hexColor), $iColorLen-3, 2))
Local $iBlu = Dec(StringMid(Hex($hexColor), $iColorLen-1, 2))
Local $iAlpha = -1
If $iColorLen = 8 Then Local $iAlpha = Dec(StringMid(Hex($hexColor), $iColorLen-7, 2))
;Offset
Local $iRedOffset = Dec(StringMid(Hex($hexOffset), $iOffsetLen-5, 2))
Local $iGrnOffset = Dec(StringMid(Hex($hexOffset), $iOffsetLen-3, 2))
Local $iBluOffset = Dec(StringMid(Hex($hexOffset), $iOffsetLen-1, 2))
Local $iAlphaOffset = -1
If $iOffsetLen = 8 Then Local $iAlphaOffset = Dec(StringMid(Hex($hexOffset), $iOffsetLen-7, 2))
If $bDarker Then
;Darker Color
$iRed -= $iRedOffset
$iGrn -= $iGrnOffset
$iBlu -= $iBluOffset
If $iAlpha <> -1 And $iAlphaOffset <> -1 Then $iAlpha -= $iAlphaOffset
Else
;Brighter Color
$iRed += $iRedOffset
$iGrn += $iGrnOffset
$iBlu += $iBluOffset
If $iAlpha <> -1 And $iAlphaOffset <> -1 Then $iAlpha += $iAlphaOffset
Endif
Local $hexResult
If $iAlpha <> -1 Then
$hexResult = "0x" & Hex(ColorBorder($iAlpha), 2) & Hex(ColorBorder($iRed), 2) & Hex(ColorBorder($iGrn), 2) & Hex(ColorBorder($iBlu), 2)
Else
$hexResult = "0x" & ColorBorder($iRed) & ColorBorder($iGrn) & ColorBorder($iBlu)
EndIf
Return $hexResult
EndFunc
Func ColorBorder($iColor)
If $iColor > 255 Then $iColor = 255
If $iColor < 0 Then $iColor = 0
Local $sResult = ""
If $sResult < 10 Then $sResult = "0"
$sResult &= String($iColor)
Return $sResult
EndFunc
Alles anzeigen