Rand um PNG wird schwarz

  • Hallo,

    ich hab mal ein Beispielscript, wo nach einer Zeit der Rand um die PNG's schwarz wird.
    Weiß jemand woran das liegt?

    Spoiler anzeigen
    [autoit]

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

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

    Global $hImage, $hBitmap, $hBmpOn, $hBmpOff
    Global $acPic[10]

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

    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile(@DesktopDir & "\on.png")
    $hBitmap = _GDIPlus_BitmapCloneArea($hImage, 0, 0, 16, 16, $GDIP_PXF32ARGB)
    $hBmpOn = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    $hImage = _GDIPlus_ImageLoadFromFile(@DesktopDir & "\off.png")
    $hBitmap = _GDIPlus_BitmapCloneArea($hImage, 0, 0, 16, 16, $GDIP_PXF32ARGB)
    $hBmpOff = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)

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

    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()

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

    GUICreate("Test")
    For $i = 0 To 9
    $acPic[$i] = GUICtrlCreatePic("", 50 + (30 * $i), 50, 16, 16)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSendMsg($acPic[$i], 0x0172, 0, $hBmpOff)
    Next
    GUISetState()

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

    While 1
    For $i = 0 To 9
    If Random(0, 1, 1) = 1 Then
    GUICtrlSendMsg($acPic[$i], 0x0172, 0, $hBmpOn)
    Else
    GUICtrlSendMsg($acPic[$i], 0x0172, 0, $hBmpOff)
    EndIf
    Next

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

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _WinAPI_DeleteObject($hBmpOn)
    _WinAPI_DeleteObject($hBmpOff)
    Exit
    EndSwitch
    WEnd

    [/autoit]
  • Probiere es mal so:

    [autoit]


    For $i = 0 To 9
    _WinAPI_DeleteObject(GUICtrlSendMsg($acPic[$i], 0x0172, 0, 0)) ; löschen des Controls. _WinAPI_DeleteObject(), damit kein Memory Leak entsteht
    If Random(0, 1, 1) = 1 Then
    _WinAPI_DeleteObject(GUICtrlSendMsg($acPic[$i], 0x0172, 0, $hBmpOn))
    Else
    _WinAPI_DeleteObject(GUICtrlSendMsg($acPic[$i], 0x0172, 0, $hBmpOff))
    EndIf
    Next

    [/autoit]

    Nach deiner Methode produzierst du auch ein Memory Leak!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (3. September 2012 um 20:50)

  • Wenn man das aktualisiert flackert es zwar, aber der Rand ist weg.
    Man kann aber auch einfach den Bereich begrenzen der aktualisiert wird, dann sieht es schon wesentlich besser aus und flackert nur bei sehr hohen aktualisierungsraten (20ms Intervall).

    Bitteschön ;) :

    Spoiler anzeigen
    [autoit]

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

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

    Global $hImage, $hBitmap, $hBmpOn, $hBmpOff
    Global $acPic[10][2]

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

    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile(@DesktopDir & "\on.png")
    $hBitmap = _GDIPlus_BitmapCloneArea($hImage, 0, 0, 16, 16, $GDIP_PXF32ARGB)
    $hBmpOn = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    $hImage = _GDIPlus_ImageLoadFromFile(@DesktopDir & "\off.png")
    $hBitmap = _GDIPlus_BitmapCloneArea($hImage, 0, 0, 16, 16, $GDIP_PXF32ARGB)
    $hBmpOff = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)

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

    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()

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

    $hGUI = GUICreate("Test")
    For $i = 0 To 9
    $iX = 50 + (30 * $i)
    $iY = 50
    $iWidth = 16
    $iHeight = 16
    $acPic[$i][0] = GUICtrlCreatePic("", $iX, $iY, $iWidth, $iHeight)
    $acPic[$i][1] = _Create_tagRECT($iX, $iY, $iWidth + $iX, $iHeight + $iY)
    GUICtrlSetState(-1, $GUI_DISABLE)
    _SetImage($acPic[$i][0], $hBmpOff, $acPic[$i][1])
    Next
    GUISetState()

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

    AdlibRegister("_Update", 500)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _WinAPI_DeleteObject($hBmpOn)
    _WinAPI_DeleteObject($hBmpOff)
    Exit
    EndSwitch
    WEnd

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

    Func _Update()
    For $i = 0 To 9
    If Random(0, 1, 1) = 1 Then
    _SetImage($acPic[$i][0], $hBmpOn, $acPic[$i][1])
    Else
    _SetImage($acPic[$i][0], $hBmpOff, $acPic[$i][1])
    EndIf
    Next
    EndFunc

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

    Func _SetImage($cID, $hImage, $tRectArea)
    _WinAPI_DeleteObject(GUICtrlSendMsg($cID, 0x0172, 0, $hImage))
    _WinAPI_RedrawWindow($hGUI, $tRectArea)
    EndFunc

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

    Func _Create_tagRECT($iLeft, $iTop, $iRight, $iBottom)
    Local $tReturn = DllStructCreate($tagRECT)
    DllStructSetData($tReturn, "Left", $iLeft)
    DllStructSetData($tReturn, "Top", $iTop)
    DllStructSetData($tReturn, "Right", $iRight)
    DllStructSetData($tReturn, "Bottom", $iBottom)
    Return $tReturn
    EndFunc

    [/autoit]

    Edit: UEZ Das wusste ich ja gar nicht... Aber wenn man sich den Taskmanager anschaut sieht man es schon deutlich. :S Ich hab es mal hier auch hinzugefügt, aber eigentlich braucht man die Aktualisierung des Fensters ja dann auch gar nicht mehr.

  • Das von UEZ funktioniert schonmal super.
    Wie kann ich die jetzt am besten auch noch auf Tabs anzeigen?
    Dies sieht seltsam aus.

    Spoiler anzeigen
    [autoit]

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

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

    Global $hImage, $hBitmap, $hBmpOn, $hBmpOff
    Global $acPic[10]

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

    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile(@DesktopDir & "\on.png")
    $hBitmap = _GDIPlus_BitmapCloneArea($hImage, 0, 0, 16, 16, $GDIP_PXF32ARGB)
    $hBmpOn = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    $hImage = _GDIPlus_ImageLoadFromFile(@DesktopDir & "\off.png")
    $hBitmap = _GDIPlus_BitmapCloneArea($hImage, 0, 0, 16, 16, $GDIP_PXF32ARGB)
    $hBmpOff = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)

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

    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()

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

    Global $hGUI = GUICreate("Test")
    Global $cTab = GUICtrlCreateTab(5, 5, 380, 200)
    GUICtrlCreateTabItem("Test1")
    GUICtrlCreateButton("Test", 80, 80, 80, 25)
    GUICtrlCreateTabItem("Test2")
    For $i = 0 To 9
    $acPic[$i] = GUICtrlCreatePic("", 50 + (30 * $i), 50, 16, 16)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSendMsg($acPic[$i], 0x0172, 0, $hBmpOff)
    Next
    GUICtrlCreateTabItem("")
    GUISetState()

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

    While 1
    For $i = 0 To 9
    _WinAPI_DeleteObject(GUICtrlSendMsg($acPic[$i], 0x0172, 0, 0))
    If Random(0, 1, 1) = 1 Then
    _WinAPI_DeleteObject(GUICtrlSendMsg($acPic[$i], 0x0172, 0, $hBmpOn))
    Else
    _WinAPI_DeleteObject(GUICtrlSendMsg($acPic[$i], 0x0172, 0, $hBmpOff))
    EndIf
    Next

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

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _WinAPI_DeleteObject($hBmpOn)
    _WinAPI_DeleteObject($hBmpOff)
    Exit
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Keine Ahnung, warum das Löschen bei Tabs nicht funzt, aber als Alternative kannst du noch eine Hintergrund Bitmap zum Löschen erstellen.

    Spoiler anzeigen
    [autoit]


    #include <GuiTab.au3>
    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>
    ;~ #include <WindowsConstants.au3>;~~~
    ;~ #include <WinAPI.au3>;~~~

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

    Global $hImage, $hBitmap, $hBmpOn, $hBmpOff
    Global $acPic[10]

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

    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\on.png")
    $hBitmap = _GDIPlus_BitmapCloneArea($hImage, 0, 0, 16, 16, $GDIP_PXF32ARGB)
    $hBmpOn = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_ImageDispose($hImage)

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

    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\off.png")
    $hBitmap = _GDIPlus_BitmapCloneArea($hImage, 0, 0, 16, 16, $GDIP_PXF32ARGB)
    $hBmpOff = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)

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

    $hBitmap = _GDIPlus_BitmapCloneArea($hImage, 0, 0, 16, 16, $GDIP_PXF32ARGB)
    $hCtx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsClear($hCtx, 0xFFFFFFFF)
    _GDIPlus_GraphicsDispose($hCtx)
    $hBmpClear = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()

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

    Global $hGUI = GUICreate("Test")
    Global $cTab = GUICtrlCreateTab(5, 5, 380, 200)
    Global $hTab = GUICtrlGetHandle($cTab)
    GUICtrlCreateTabItem("Test1")
    GUICtrlCreateButton("Test", 80, 80, 80, 25)
    GUICtrlCreateTabItem("Test2")
    For $i = 0 To 9
    $acPic[$i] = GUICtrlCreatePic("", 50 + (30 * $i), 50, 16, 16)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSendMsg($acPic[$i], 0x0172, 0, $hBmpOff)
    Next
    GUICtrlCreateTabItem("")
    GUISetState()

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

    While 1
    For $i = 0 To 9
    _WinAPI_DeleteObject(GUICtrlSendMsg($acPic[$i], 0x0172, 0, $hBmpClear))
    If Random(0, 1, 1) = 1 Then
    _WinAPI_DeleteObject(GUICtrlSendMsg($acPic[$i], 0x0172, 0, $hBmpOn))
    Else
    _WinAPI_DeleteObject(GUICtrlSendMsg($acPic[$i], 0x0172, 0, $hBmpOff))
    EndIf
    Next

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

    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _WinAPI_DeleteObject($hBmpClear)
    _WinAPI_DeleteObject($hBmpOn)
    _WinAPI_DeleteObject($hBmpOff)
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯