GUI - Hintergrundbild

  • Hey Hey Leute :D

    Ich habe das Forum (und noch einige andere) auf den Kopf gestellt und zwar auf der Suche nach Hintergrundbildern in GUI's
    An sich:

    [autoit]


    GUICreate("GUI_Name", 350, 250)
    GUICtrlCreatePic(@TempDir & "lux_bg_5.jpg", 0, 0, 350, 250, 0x04000000)
    GUICtrlSetState(-1, 128)

    [/autoit]

    Ist ja alles schön und gut, allerdings funktionieren bei mir keine progressbars mehr (werden nur angezeigt wenn sie den state 0 haben) und auch labels mit Funktionen etc nicht.
    Also villt gibt es eine Möglichkeit das Bild per z-index (wie in Html/Css) nach hinten zu verlegen. Oder ne Hintergrund Funktion?
    Das Hintergrundbild geht über die komplette GUI und das möchte ich eigentlich auch ungern' ändern.

    Hoffe das mir noch jemand ein paar tipps geben kann. Wenn noch was benötigt wird, Quellcode etc, bitte bescheid geben :D

    - Vîathan

    Einmal editiert, zuletzt von Vîathan (24. Januar 2014 um 11:14)

  • Sry, bin am Handy.
    Habs so gelöst, dass du zuerst ein leeres Bild erstellst ('') und nach Guisetstate das Bild setzt. Schau mal in Hilfe nach, wie das funktioniert, sry dass ich dir jetzt nicht komplett helfen kann :(

    [Blockierte Grafik: http://stefan.blagojevic.at/loading.gif]

    Design, Modellbau, CAD <3
    AutoCAD, ArchiCAD, REVIT (ist ein Scheiss, habe aber das Zertifikat)

    Cinema 4D, RuckZuck Statik Programm

    Michael Bay als Architekt


    Da eine Glasfassade! Booom Sichtbeton! Laminiertes Bild auf Mosaiksteinchen! Granit! Granit! Granit! Sichtbetonwand mit 50° Neigung!
    Holzverkleidung erscheint da! Boooooom!

  • Sry, bin am Handy.
    Habs so gelöst, dass du zuerst ein leeres Bild erstellst ('') und nach Guisetstate das Bild setzt. Schau mal in Hilfe nach, wie das funktioniert, sry dass ich dir jetzt nicht komplett helfen kann :(

    Hi, kein Problem.
    Interessante Idee, allerdings sieht das bei mir total "ungut" aus ^^
    Das witzige ist, dass ja die Buttons, Input-Felder etc funktionieren. Aber ich wollte eine Funktion auf ein Label legen und das geht leider nicht.
    Das Hintergrundbild habe ich so angepasst, dass es auch Hervorhebungen hat, wie z.b. kleine schwarze Kästchen in denen dann im fertigen Programm die Texte stehen, hier mal ein Screenshot:
    (Heißt LightHack, ich kenne die Forenregeln! Allerdings ist das nur der Name, ein Freund hat ein Spiel geschrieben und mich gefragt ob ich im erweiterungen schreiben kann, mit praktischem bsp. Also es ist kein Hack / Bot etc der illegal wäre, er verändert nur über die memory eine value für das Licht :thumbup: )
    Ist nicht das neueste Interface, aber so in der Richtung :)

    Spoiler anzeigen
  • Ok, so was ähnliches hab ich am Pc oben, kanns dir nachher schreiben ^^

    Aber glaub bis dahin antwortet dir schon wer :D

    [Blockierte Grafik: http://stefan.blagojevic.at/loading.gif]

    Design, Modellbau, CAD <3
    AutoCAD, ArchiCAD, REVIT (ist ein Scheiss, habe aber das Zertifikat)

    Cinema 4D, RuckZuck Statik Programm

    Michael Bay als Architekt


    Da eine Glasfassade! Booom Sichtbeton! Laminiertes Bild auf Mosaiksteinchen! Granit! Granit! Granit! Sichtbetonwand mit 50° Neigung!
    Holzverkleidung erscheint da! Boooooom!

  • Hallo, habs so gelöst:

    [autoit]

    ;~ GUI
    $hGUI = GUICreate("Saunch "&$ver, 645, 278, -1,-1,$ws_popupwindow, $ws_ex_controlparent)
    $name = IniRead(@AppDataDir & "\Saunch\config-erp", "General", "name","ERROR")

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

    ;~ Hintergund definieren
    $Back = @AppDataDir & "\Saunch"&$sn&"\bg.jpg"
    If $debug = 1 Then $Back = "bgs\scrg\5.jpg"
    GUICtrlCreatePic($Back,0,0,645,278,0x08000000 + BitOR($SS_NOTIFY,$WS_GROUP))
    GUISetState(@SW_SHOW)

    [/autoit]

    $ws_popupwindows deaktiviert die Windows "Leiste" oben.

    Steve

    [Blockierte Grafik: http://stefan.blagojevic.at/loading.gif]

    Design, Modellbau, CAD <3
    AutoCAD, ArchiCAD, REVIT (ist ein Scheiss, habe aber das Zertifikat)

    Cinema 4D, RuckZuck Statik Programm

    Michael Bay als Architekt


    Da eine Glasfassade! Booom Sichtbeton! Laminiertes Bild auf Mosaiksteinchen! Granit! Granit! Granit! Sichtbetonwand mit 50° Neigung!
    Holzverkleidung erscheint da! Boooooom!

  • Die (meiner Meinung nach) elegantere Variante ist das Hooken von der WndProc des Fensters, um das WM_PAINT abzufangen, und vor dem eigentlichen WM_PAINT eben das Hintergrundbild zu malen. Ich habe das ganze mal in einer kleinen UDF zusammengefasst:

    GUIBkImage.au3
    [autoit]


    #include-once
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>

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

    Global Enum $GBKI_IDX_GFX, $GBKI_IDX_IMG, $GBKI_IDX_DEFPROC
    Global $__intern_GBKI_ohWnds = ObjCreate("Scripting.Dictionary")
    Global $__intern_GBKI_hWndProc = DllCallbackRegister("__intern_GBKI_WndProc", "ptr" , "hwnd;uint;long;long;")
    Global $__intern_GBKI_pWndProc = DllCallbackGetPtr($__intern_GBKI_hWndProc)
    Global Const $SC_CLOSE = 0xf060

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GUISetBkImage
    ; Description ...: Sets an image as background for a window by hooking it's WndProc
    ; Syntax ........: _GUISetBkImage($hWnd, $sIMG)
    ; Parameters ....: $hWnd - GUI Handle, returned from GUICreate().
    ; $sIMG - Path to the image.
    ; Return values .: None
    ; Author ........: chesstiger (autoit.de)
    ; Modified ......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: GUIBkImage Example.au3
    ; ===============================================================================================================================
    Func _GUISetBkImage($hWnd, $sIMG)
    _GDIPlus_Startup()
    Local $aData[3]
    $aData[$GBKI_IDX_GFX] = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $aData[$GBKI_IDX_IMG] = _GDIPlus_ImageLoadFromFile($sIMG)
    $aData[$GBKI_IDX_DEFPROC] = _WinAPI_SetWindowLong($hWnd, $GWL_WNDPROC, $__intern_GBKI_pWndProc)
    $__intern_GBKI_ohWnds(String($hWnd)) = $aData
    EndFunc

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

    Func __intern_GBKI_WndProc($hWnd, $iMsg, $iwParam, $ilParam)
    Local $aData, $tPaint
    $aData = $__intern_GBKI_ohWnds(String($hWnd))

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

    If $iMsg = $WM_PAINT Then ;draw
    _WinAPI_BeginPaint($hWnd, $tPaint)
    _GDIPlus_GraphicsDrawImageRect($aData[$GBKI_IDX_GFX], $aData[$GBKI_IDX_IMG], 0, 0, _WinAPI_GetWindowWidth($hWnd), _WinAPI_GetWindowHeight($hWnd))
    _WinAPI_EndPaint($hWnd, $tPaint)
    Return 0
    EndIf

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

    If $iMsg = $WM_SYSCOMMAND Then ;dispose
    If _WinAPI_LoWord($iwParam) = $SC_CLOSE Then
    _GDIPlus_ImageDispose($aData[$GBKI_IDX_IMG])
    _GDIPlus_GraphicsDispose($aData[$GBKI_IDX_GFX])
    _GDIPlus_Shutdown()
    _WinAPI_SetWindowLong($hWnd, $GWL_WNDPROC, $aData[$GBKI_IDX_DEFPROC])
    EndIf
    EndIf

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

    Return _WinAPI_CallWindowProc($aData[$GBKI_IDX_DEFPROC], $hWnd, $iMsg, $iwParam, $ilParam)
    EndFunc

    [/autoit]
    GUIBkImage Example.au3
    [autoit]


    #include "GUIBkImage.au3"

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

    $hWindow = GUICreate("myGUI", 600, 400)
    _GUISetBkImage($hWindow, "back.jpg")
    $cButton = GUICtrlCreateButton("MyButton", 10, 10)
    $cProgress = GUICtrlCreateProgress(100, 100, 100, 20)
    GUICtrlSetData($cProgress, 50)

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

    GUISetState()

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

    While True
    Switch GUIGetMsg()
    Case -3
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Im Anhang nochmal als ZIP wegen dem Bild. ^^

    Gruß

  • Wow, danke ihr 2 :)
    Allerdings bin ich nicht der fan von UDF's.
    Das es dafür noch keine "richtige" Funktion von AutoIT gibt ist schon ein bisschen blöd..

    Gibt's da nicht eine einfache/simple/logische/gute Lösung für? :D
    Ich nutze ungern und eigentlich nie Code in meinen Programmen / Tools den ich nicht verstehe, bzw nicht "kann".

    Was mich wundert ist, die Buttons und co funktionieren alle so wie sie sollen. Aber das Label nicht. Warum? :wacko:

    Aber trz noch mal danke für die Hilfe. Ich werde mir das alles (auch deine UDF) noch mal anschauen und falls ich ne andere Lösung finde mich melden. :thumbup:

  • Zitat

    Ich nutze ungern und eigentlich nie Code in meinen Programmen / Tools den ich nicht verstehe, bzw nicht "kann".


    Es kommt aber auf das selbe raus wenn du eine interne "richtige" Funktion verwendest. Den tatsächlichen Code dahinter würdest du auch nicht verstehen und du kannst es noch nicht mal versuchen, weil AutoIt mittlerweile ein closed-source Projekt ist. ;)

    Das definieren von eigenen Funktionen um Arbeitsvorgänge zu abstrahieren und diese in UDFs zusammenfassen um sie mit anderen zu teilen ist eine Stärke von AutoIt. Ich kann nachvollziehen, dass du gerne den Code verstehen möchtest, aber dann setze doch da an und frag nicht nach einer weiteren Lösung... Eine bessere Lösung als die von chesstiger wirst du kaum finden und ich vermute, dass so auch eine "offizielle" Funktion von AutoIt vorgehen würde.


  • Es kommt aber auf das selbe raus wenn du eine interne "richtige" Funktion verwendest. Den tatsächlichen Code dahinter würdest du auch nicht verstehen und du kannst es noch nicht mal versuchen, weil AutoIt mittlerweile ein closed-source Projekt ist. ;)

    Das definieren von eigenen Funktionen um Arbeitsvorgänge zu abstrahieren und diese in UDFs zusammenfassen um sie mit anderen zu teilen ist eine Stärke von AutoIt. Ich kann nachvollziehen, dass du gerne den Code verstehen möchtest, aber dann setze doch da an und frag nicht nach einer weiteren Lösung... Eine bessere Lösung als die von chesstiger wirst du kaum finden und ich vermute, dass so auch eine "offizielle" Funktion von AutoIt vorgehen würde.

    Hmmn, ja macht Sinn.
    Da hast du allerdings Recht. Obwohl das ja eigentlich bei jeder Sprache so ist.. Ich versuche halt immer alles so einfach wie möglich zu haben/machen. ^^
    Ich denke, dass das nichts für mich ist, also dieser Weg wie in der UDF. Entweder finde ich einen anderen Weg (wie eigentlich immer :) ) oder ich muss es halt lassen / anders machen.

    Wie gesagt, vielen Dank Leute :)