Ungewollte Transparenz bei GUICtrlSetImage

  • Hallo,

    ich arbeite in einer Gui mit einem GUICtrlCreatePic (als Vorschaubild).
    [Blockierte Grafik: http://img3.imagebanana.com/img/bhesktvl/w7shot64.jpg
    Wenn ich nun das blaue Bild durch ein neues ersetze,
    sieht man an manchen Stellen trotzdem noch das blaue:

    [Blockierte Grafik: http://img3.imagebanana.com/img/i06lshjc/w7shot64.jpg]

    Und zwar meiner Meinung nach genau an den Stellen,
    wo die Farbe dem Standart-Hintergrund-Grau entspricht.

    Kann man das irgendwie vermeiden?

    Grüße aus Hessen, Andy

    Einmal editiert, zuletzt von andygo (19. August 2010 um 19:06)

  • Hallo andygo,

    ich habe es in einem Beispiel sp gelöst:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <GuiListBox.au3>
    #include <File.au3>
    #include <array.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global $msg, $message, $var, $aFiles, $idfrmMain, $sSourcePath, $sItem
    Global $szDrive, $szDir, $szFName, $szExt

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

    $idfrmMain = GUICreate("JPG-Viewer", 512, 460)
    Local $idfilemenu = GUICtrlCreateMenu("&Datei")
    Local $idfileitem = GUICtrlCreateMenuItem("Öffnen", $idfilemenu)
    GUICtrlSetState(-1, $GUI_DEFBUTTON)
    Local $idexititem = GUICtrlCreateMenuItem("Beenden", $idfilemenu)
    Local $idLB_Files = GUICtrlCreateList("", 5, 5, 502, 140)
    Local $idbtnShow = GUICtrlCreateButton("&Zeige Bild", 5, 150, 150, 25)
    Local $idPic = GUICtrlCreatePic("", 5, 180, 256, 256)
    GUISetState()
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $idfileitem

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

    $message = "Um mehrere Dateien auszuwählen, ist die Strg-Taste oder die Shift-Taste zu drücken."

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

    $var = FileOpenDialog($message, @MyDocumentsDir & "", "Bilder (*.jpg;*.bmp)", 1 + 4)
    If @error Then
    MsgBox(4096, "", "Keine Datei(en) ausgewählt")
    Else
    $aFiles = StringSplit($var, "|")
    If $aFiles[0] > 1 Then ;trifft nur bei Mehrfachauwal zu
    ;$aFiles[0] enthält Anzahl der Strings
    ;$aFiles[1] enthält den Pfad für alle ausgewählten Bilder
    ;$aFiles[2] enthält 1. Bild
    ;$aFiles[n+1] enthält n. Bild
    ;Rückgabe des Fileopenialogs in einzzenlne Strings für Array splitten
    ;_ArrayDisplay($aFiles) ;Array anzeigen nur zu Verständnisuwecken evtl. aktivieren
    For $i = 2 To $aFiles[0]
    _GUICtrlListBox_AddString($idLB_Files, $aFiles[1] & "\" & $aFiles[$i])
    Next
    Else
    ConsoleWrite($aFiles[1] & @CRLF)
    _GUICtrlListBox_AddString($idLB_Files, $aFiles[1])
    EndIf
    EndIf
    Case $idbtnShow
    $sItem = _GUICtrlListBox_GetText($idLB_Files, _GUICtrlListBox_GetCurSel($idLB_Files))
    If $sItem <> "" Then
    If $idPic <> 0 Then GUICtrlDelete($idPic) ;<================ löschen
    $idPic = GUICtrlCreatePic($sItem, 5, 180, 256, 256) ;<========= neu erzeugen
    EndIf
    Case $GUI_EVENT_CLOSE, $idexititem
    Exit
    EndSwitch
    WEnd

    [/autoit]

    mfg (Auto)Bert

  • hallo autobert,

    mit löschen und neu erstellen hatte ich es auch schon mal versucht aber irgendwie nicht hinbekommen. nun klappt es aber, war wohl irgendwo der fehlerteufel drin.

    danke dir trotzdem :thumbup:

  • Hallo!
    Entschuldigt, dass ich diesen Thread wieder ausgrabe, aber ich habe ein ähnliches Problem.
    Ich zeige auf der GUI kurz nacheinander mehrere transparente Bilder.
    Das klappt auch wunderbar. Aber bei manchen Bildern sieht man im Hintergrund an gewissen Stellen das letzte und ggfs vorletzte Bild!!

    Bisher habe ich es immer so gemacht, dass ich VOR dem eigentlichen Bild kurz ein vollständig schwarzes Bild setze. Das ist zwar schneller, als wenn man das Bild löscht und neu erstellt, aber am liebsten hätte ich es noch schneller, damit es weniger "blinkt"!

    Habe ich da was übersehen?
    Grüße Veronesi

  • Hallo!
    Entschuldigt, dass ich diesen Thread wieder ausgrabe, aber ich habe ein ähnliches Problem.
    Ich zeige auf der GUI kurz nacheinander mehrere transparente Bilder.
    Das klappt auch wunderbar. Aber bei manchen Bildern sieht man im Hintergrund an gewissen Stellen das letzte und ggfs vorletzte Bild!!

    Bisher habe ich es immer so gemacht, dass ich VOR dem eigentlichen Bild kurz ein vollständig schwarzes Bild setze. Das ist zwar schneller, als wenn man das Bild löscht und neu erstellt, aber am liebsten hätte ich es noch schneller, damit es weniger "blinkt"!

    Habe ich da was übersehen?
    Grüße Veronesi

    hallo veronesi, ich habe mittlerweile eine ganz andere technik das betreffende bild darzustellen. mit nem eingebetteten ie. geht wunderbar.

    alternativ dazu (und auch flicker-frei ist gdi+. kleines gdi+ beispiel (bildwechsel iphoneslider):

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>
    $hGUI = GUICreate("GDI+", 200, 150)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Quit")
    GUISetbkColor(0xe0e0e0)
    GUISetState()
    Opt("GuiOnEventMode", 1)
    local $s1, $state = 0, $slide0 = 1, $slide1 = 1
    _slider(0, 0)

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

    func _slider($slide0 = 1, $slide1 = 1)
    if $slide0 = 1 or $slide0 = 2 then GUICtrlDelete($s1)
    _GDIPlus_Startup ()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hgui)
    $hBitmap = _GDIPlus_BitmapCreateFromFile ( @ScriptDir & "\slid2.bmp")
    if $state = 0 then
    $hClone = _GDIPlus_BitmapCloneArea ($hbitmap, 36, 0, 63, 18)
    else
    $hClone = _GDIPlus_BitmapCloneArea ($hbitmap, 0, 0, 63, 18)
    endif
    $i = 0
    if $slide0 = 1 then
    Do
    _GDIPlus_ImageDispose ($hClone)
    if $state = 0 then
    $hClone = _GDIPlus_BitmapCloneArea ($hbitmap, 36-$i, 0, 63, 18)
    Else
    $hClone = _GDIPlus_BitmapCloneArea ($hbitmap, $i, 0, 63, 18)
    endif
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hclone, 50, 50, 63, 18 )
    sleep($slide1)
    $i += 2
    Until $i >= 37
    endif
    _GDIPlus_ImageSaveToFile($hclone, @ScriptDir & "\sb.bmp")
    $s1 = GUICtrlCreatePic(@ScriptDir & "\sb.bmp", 50, 50, 63, 18 )
    GUICtrlSetOnEvent($s1, "_slider"); only for guioneventmode 1
    if $slide0 = 1 and $state = 0 then
    $state = 1
    Elseif $slide0 = 1 and $state = 1 then
    $state = 0
    endif
    _GDIPlus_GraphicsDispose ($hGraphic)
    _GDIPlus_ImageDispose ($hClone)
    _WinAPI_DeleteObject ($hBitmap)
    _GDIPlus_Shutdown ()
    endfunc

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

    func _quit()
    Exit
    EndFunc

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

    While 1
    sleep(20)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Eingebetteter IE? Tönt interessant.
    Ich habe nur mal was mit einem eingebetteten IE und Texten gemacht, weil man dann HTML Tags und somit ein ansprechendes Design gestalten konnte!

    Du hast nicht zufällig ein Beispiel mit einem Bild?
    Mit GDI+ kenne ich mich (noch) nicht aus. Hätte das viele Vorteile?
    Oder wäre ich (da ich GDI+ nicht kenne) mit dem IE besser bedient?

    Edit: für mich muss es vor allem schnell sein und die Transparenz muss funktionieren. Kriege ich das mit dem IE hin?

  • Eingebetteter IE? Tönt interessant.
    Ich habe nur mal was mit einem eingebetteten IE und Texten gemacht, weil man dann HTML Tags und somit ein ansprechendes Design gestalten konnte!

    Du hast nicht zufällig ein Beispiel mit einem Bild?
    Mit GDI+ kenne ich mich (noch) nicht aus. Hätte das viele Vorteile?
    Oder wäre ich (da ich GDI+ nicht kenne) mit dem IE besser bedient?

    Edit: für mich muss es vor allem schnell sein und die Transparenz muss funktionieren. Kriege ich das mit dem IE hin?

    ich versuch mal ein stand-alone-beispiel zu scripten. melde mich gleich nochmal

  • so hier bitteschön, beispiel mit ie:

    Spoiler anzeigen
    [autoit]


    $bild1 = @ScriptDir & "\smile1.png"; komplette pfadangabe wie z.b. @ScriptDir & "\bild1.bmp"
    $bild2 = @ScriptDir & "\smile2.png"
    $bild3 = @ScriptDir & "\smile3.png"
    $bild4 = @ScriptDir & "\smile4.png"
    #include <GUIConstantsEx.au3>
    #include <ComboConstants.au3>
    #include <WindowsConstants.au3>
    #include <IE.au3>
    #include <GDIPlus.au3>
    Opt("GuiOnEventMode", 1)
    $gui = GuiCreate("test", 305, 176, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_quit")
    $oIEp = _IECreateEmbedded ()
    $c21 = GUICtrlCreateObj($oIEp, 81, 5, 143, 80)
    $oIEp.navigate("about:blank")
    $actsel = GUICtrlCreatecombo(" ", 70, 152, 165, 20, $CBS_DROPDOWNLIST+$WS_VSCROLL)
    GUICtrlSetData(-1, $bild1&"|"&$bild2&"|"&$bild3&"|"&$bild4, " ")
    GUISetState()
    $temp = ""

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

    func repic($rp, $rp1, $rp2)
    $temp = $rp
    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile($rp)
    $Width = _GDIPlus_ImageGetWidth($hImage)
    $Height = _GDIPlus_ImageGetHeight($hImage)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    $i = $rp1
    $xa = $Width / $rp1
    while $Height / $xa > $rp2
    $i -= 1
    $xa = $Width / $i
    wend
    $Width2 = $Width
    $Height2 = $Height
    if $Width > $rp1 or $Height > $rp2 then
    $Width2 = int($Width / $xa)
    $Height2 = int($Height / $xa)
    endif
    $Width3 = 0
    $Height3 = 0
    if int(($rp1 - $Width2) / 2) > 1 then $Width3 = int(($rp1 - $Width2) / 2)
    if int(($rp2 - $Height2) / 2) > 1 then $Height3 = int(($rp2 - $Height2) / 2)
    $oIEp.document.write("<body oncontextmenu='return false' scroll='no' style='border:0;margin-top:"&$Height3&"px; margin-left:"&$Width3&"px'><img src =" & $rp & " width="&$Width2&" height="&$Height2&" alt=''></body>")
    $oIEp.refresh
    endfunc

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

    While 1
    sleep(20)
    if GUICtrlRead($actsel) <> $temp then repic(GUICtrlRead($actsel), 144, 81)
    wend

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

    func _quit()
    Exit
    endfunc

    [/autoit]