Transparenz bei mehreren Bildern

  • Hallo zusammen,

    ich habe die Forumssuche benutzt und auch etliche hilfreiche Threads gefunden. Jedoch keinen, der mir bei meinem Problem zur Lösung geholfen hätte.
    Im Anhang habe ich drei Bilder, und einen Beispiel Quellcode.
    Es geht im Moment bloss ums Prinzip!

    Das eine Bild musste ich aus Lizenzgründen etwas "übermalen", damit man nicht alles sieht.

    Folgendes möchte ich:
    Das Bild (24852.gif) soll auf der anderen GUI dargestellt werden. Und zwar transparent!
    Aber das kriege ich nicht hin. Ich weiss, dass vom letzten Bild das oberste linke Pixel die transparente Farbe angibt.
    Deshalb extra die GUI2.gif, welche vollflächig aus "Transparenz" besteht, damit diese "Farbe" unsichtbar ist.

    Am besten ihr führt das Script einfach mal aus, dann seht ihr, was ich meine.
    Wie kriege ich die Transparenz hin?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    ;~ FileInstall("GUI.gif", "GUI.gif", 1)

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

    ;Create fullscreen background
    GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    GUISetBkColor(0x000000)
    GUISetState()

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

    ;Create Layered GUI
    GUICreate("",989,768,-1,-1,$WS_POPUP,$WS_EX_LAYERED) ;Layered GUI
    GUICtrlCreatePic("GUI.gif",0,0,989,768)
    ;~ GUICtrlSetState(-1,$GUI_DISABLE) ;Disable GUI when you want to have the possibility to drag it by the "WS_EX_PARENTDRAG" used in a Label or picture!

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

    ;Create "Progress bar". Use Label with special character to show a pleasing progress bar
    $Label = GUICtrlCreateLabel(ChrW(9608),225,112,715,8)
    GUICtrlSetBkColor($Label,$GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont($Label, 1, 400, 0, "Fixedsys")
    GUICtrlSetColor($Label, 0xFF0000)

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

    ;Create picture
    GUICtrlCreatePic("24852.gif", 150, 230, 800, 515, -1, $WS_EX_TRANSPARENT)
    GUICtrlSetBkColor(-1,$GUI_BKCOLOR_TRANSPARENT)

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

    ;Create empty picture for setting the transparent color. Because the last picture defines the transparent pixel (top-left pixel = transparent color)
    GUICtrlCreatePic("GUI2.gif", 0, 0, 989, 768)
    GUISetState (@SW_SHOW) ; will display an empty dialog box

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

    While 1
    $Progress = GUICtrlRead($Label)
    GUICtrlSetData($Label, $Progress & ChrW(9608))
    If StringLen($Progress) > 87 Then
    Sleep(2000)
    ExitLoop
    EndIf
    Sleep(100)
    WEnd

    [/autoit]

    Grüsse
    Veronesi

  • Ergänzend muss ich vielleicht noch sagen, dass die weisse Fläche des Bildes (24852.gif) transparent sein soll. Und zwar so, dass der orange/weisser Farbverlauf sichtbar ist (nicht der schwarze Hintergrund!)
    Hat jemand eine Idee?
    Bei dem Bild sieht man, dass auf der rechten Seite (grau/weisser Stecker) dort ein bisschen transparenz vorhanden ist! Es leuchtet nämlich ein bisschen orange hervor!

    Das Bild ist natürlich nur ein Beispiel!

  • Ein kleines Stückchen bin ich nun weiter.
    Das Bild hatte eine zu schlechte Qualität und beim nachträglichen bearbeiten konnte damit die Transparenz nicht genügend genau gesetzt werden.

    Hier ein besseres Bild.
    Nun ist aber das Problem, dass alles, was transparent sein soll, schwarz ist!

    Hat jemand eine zündende Idee?

  • Probiere es mal damit:

    [autoit]


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

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

    $hGUI = GUICreate("Test", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    GUISetBkColor(0x000000)
    GUICtrlCreatePic("GUI.gif",0,0,989,768)

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

    $Label = GUICtrlCreateLabel(ChrW(9608),225,112,715,8)
    GUICtrlSetBkColor($Label, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont($Label, 1, 400, 0, "Fixedsys")
    GUICtrlSetColor($Label, 0xFF0000)

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

    $hGUI2 = GUICreate("", 599, 386, 150, 230, $WS_POPUP, $WS_EX_TOPMOST + $WS_EX_LAYERED, $hGUI)
    GUICtrlCreatePic("24852.gif", 0, 0, 599, 386)

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

    GUISetState (@SW_SHOW, $hGUI)
    GUISetState (@SW_SHOW, $hGUI2)

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

    While 1
    $Progress = GUICtrlRead($Label)
    GUICtrlSetData($Label, $Progress & ChrW(9608))
    If StringLen($Progress) > 87 Then
    Sleep(2000)
    ExitLoop
    EndIf
    Sleep(100)
    WEnd

    [/autoit]

    Der Balken sieht unter Win7 anders aus (keine Striche) und flimmert. Unter WinXP flimmert nichts.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    2 Mal editiert, zuletzt von UEZ (9. März 2011 um 11:50)

  • Hallo UEZ,

    vielen Dank! Genau das wollte ich!
    Es funktioniert super!

    Aber was meintest Du mit dem Balken?
    Ich habe Win7, es sieht in etwa wie ein progress bar aus. Klar, er flimmert etwas, warum weiss ich allerdings nicht!

    Gruss + Danke!
    Veronesi

  • So, nun konnte ich das auch noch auf einem XP-Rechner anschauen.

    UEZ:
    Du hast recht! Alles funktioniert, ausser dem "Progress-Bar". Dieser hat unter XP "unschöne" Abstände dazwischen. Sind also quasi einzelne Blöcke. Und es flackert wie die S..!
    Aber unter Windows 7 sieht es gut aus, nur ein leichtes flackern ist bei mir sichtbar.

    Wie könnte man einen schönen, ansprechenden Fortschrittsbalken gestalten, der nicht flimmert und bei welchem man die Farbe definieren kann?
    Natürlich müsste er auch transparent sein! Das war der Hauptgrund, weshalb ich überhaupt das Label verwendet habe!

    Danke für Eure Inputs!
    Veronesi

    • Offizieller Beitrag

    Mit einer klassischen Progressbar und entsprechend angepasster Hintergrundfarbe sieht das doch ganz gut aus:

    Spoiler anzeigen
    [autoit]


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

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

    $hGUI = GUICreate("Test", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    GUISetBkColor(0x000000)
    GUICtrlCreatePic("GUI.gif",0,0,989,768)

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

    DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 0)
    $hProgress = GUICtrlCreateProgress(225, 115, 700, 6)
    GUICtrlSetBkColor(-1, 0x009640)
    GUICtrlSetColor(-1, 0xFF0000)
    DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 7)

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

    $hGUI2 = GUICreate("", 599, 386, 150, 230, $WS_POPUP, $WS_EX_TOPMOST + $WS_EX_LAYERED, $hGUI)
    GUICtrlCreatePic("24852.gif", 0, 0, 599, 386)

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

    GUISetState (@SW_SHOW, $hGUI)
    GUISetState (@SW_SHOW, $hGUI2)
    $Progress = 0
    Do
    $Progress += 1
    GUICtrlSetData($hProgress, $Progress)
    Sleep(50)
    Until $Progress > 99

    [/autoit]
  • Hallo Oscar

    vielen Dank. Diesen DLL Call habe ich auch schon mal angeschaut.
    Ich hoffe nur, dass in zukünftigen Windows Versionen (Windows 8) diese Befehle nicht mehr laufen....
    Deshalb wäre mir der "normale" Progress-Bar lieber.

    Lieber wäre mir auch, wenn die Hintergrundfarbe Transparent wäre. Hier funktioniert es ja noch, weil der Rand einfarbig und ohne Farbverlauf ist.....
    Gibt es Alternativen?

    Trotzdem: Vielen herzlichen Dank!!!!!!!! Ich kann das sehr gut gebrauchen!
    Veronesi

    Edit:
    Das etwas störende ist auch, dass der Hintergrund immer ca. 2 Pixel grösser ist, als der Progressbar selber...
    Gibt's da auch einen DLLCall dafür, um den Style noch etwas zu ändern :)

    Einmal editiert, zuletzt von veronesi (9. März 2011 um 13:44)

  • Was meinst Du genau mit "der einfarbigen" Progressbar?
    Also, genau die, die Du mir gemacht hast?? (Jeweils Vordergrund und Hintergrund einfarbig...)

    Ja, auf das läuft es vermutlich hinaus.
    Siehe auch mein Edit im letzten Post.

  • Hallo an alle.

    Vielen Dank für Eure Mitarbeit. Es klappt nun alles wie gewünscht.
    Damit ihr seht, wie das Ergebnis wirkt, hier mein Code und die aktuellsten Bilder.

    Leider ist das Hintergrund-GUI maskiert und ohne Logo etc. Ich darf das nicht zeigen.
    Mit unserem farbigen Logo und den restlichen ausgeblendeten Dingen sieht das Ganze wirklich super aus!

    Natürlich ist das nur das Prinzip! In der Mitte welchseln dann dauernd die Bilder und oben die Texte (je nachdem, was gerade installiert wird)!

    Vielen Dank nochmals!

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StaticConstants.au3>
    FileInstall("GUI.gif", @TempDir & "\GUI.gif", 1)
    FileInstall("24852.gif", @TempDir & "\24852.gif", 1)

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

    ;Create dimmed fullscreen background
    $hBackground = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP)
    GUISetBkColor(0x000000)
    WinSetTrans($hBackground, "", 180)
    GUISetState(@SW_SHOW, $hBackground)

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

    ;Create centered GUI
    $hGUI = GUICreate("", 989, 768, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
    GUICtrlCreatePic(@TempDir & "\GUI.gif", 0, 0, 989, 768)
    GUISetState(@SW_SHOW, $hGUI)

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

    ;Create Progressbar
    DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 0)
    $hProgress = GUICtrlCreateProgress(225, 115, 715, 6)
    GUICtrlSetBkColor(-1, 0x009640)
    GUICtrlSetColor(-1, 0xFFFF00)
    DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 7)

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

    ;Create Text
    $TextLabel = GUICtrlCreateLabel("Install XYZabc XYZabc - V3.9", 225, 125, 715, 50, $SS_CENTER)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont(-1, 28, 800, 0, "Arial")
    GUICtrlSetColor(-1, 0x0000FF)

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

    ;Create picture
    $hGUI_Picture = GUICreate("", 800, 515, @DesktopWidth / 2 - 345, @DesktopHeight / 2 - 170, $WS_POPUP, $WS_EX_TOPMOST + $WS_EX_LAYERED, $hGUI) ;Layered GUI
    $Picture = GUICtrlCreatePic(@TempDir & "\24852.gif", 0, 0, 800, 515, -1, $WS_EX_TRANSPARENT)
    GUISetState(@SW_SHOW, $hGUI_Picture)

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

    For $i = 0 To 100
    GUICtrlSetData($hProgress, $i)
    Sleep(100)
    Next
    Sleep(1000)

    [/autoit]

    Gruss Veronesi

  • Hallo!
    Der Vollständigkeit halber hier ein Nachtrag:
    Ich habe eine verblüffend einfache Lösung für das Problem mit dem Progressbar gefunden.

    Folgendes sind die Vorteile:
    - Kein Flackern
    - Farbverläufe im Hintergrund möglich, weil der "Progressbar" quasi transparent ist
    - Farbe frei definierbar
    - Der Progressbar ist gleich groß, wie der "Hintergrund" - also keine störenden Flächen!

    Man muss bloß einfach ein Label ohne Text erstellen. Die Breite soll z.B. 1 Pixel sein.
    Danach kann man mit ControlMove das Label nicht verschieben, sondern VERBREITERN!

    [autoit]


    $ProgressLabel = GUICtrlCreateLabel("", 225, 115, 1, 5)
    GUICtrlSetBkColor(-1, 0x0000FF)

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

    ControlMove($hGUI, "", $ProgressLabel, 225, 115, 5 * 7.11)

    [/autoit]