Transparente Bilder einfach einfügen.

  • Hallo zusammen,

    ist es eigentlich mit einfachen Mitteln möglich, ein transparentes GIF oder PNG in einer GUI zu platzieren (z.B. ein rotes Kreuz neben dem Abbrechen-Button) - so wie man es z.B. in HTML machen kann?

    Sprich ohne irgendwie GUIs übereinanderzuschachteln oder GDI-Funktionen zu gebrauchen? Einfach so, mit einer Function à la GUICtrlCreatePic()...

    In der Hilfe steht zwar ein Beispiel (s.u.), aber das kann doch - ehrlich gesagt - nicht wirklich wahr sein, dass man das für jedes einzelne Bild machen muss, oder? :rolleyes:

    Vielen Dank für Tips.

    Gruß
    Trainer

    Das Beispiel aus der Hilfe:

    Spoiler anzeigen
    [autoit]

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

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

    Global $hGUI, $hImage, $hGraphic, $hImage1

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

    ; GUI erstellen
    $hGUI = GUICreate("PNG zeigen", 250, 250)

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

    ; PNG Bild laden
    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile("cancel.png")
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)

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

    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
    GUISetState()

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

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    ; Ressourcen aufräumen
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()

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

    ; PNG Bild zeichnen
    Func MY_WM_PAINT($hWnd, $msg, $wParam, $lParam)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
    _WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_PAINT

    [/autoit]

    2 Mal editiert, zuletzt von ip_trainer (7. Mai 2011 um 12:58) aus folgendem Grund: Auf "gelöst" gesetzt

  • Hi Funkey,

    erst mal danke für deine Antwort...

    Klär mich auf, was habe ich übersehen? In diesem Beispiel werden doch 2 GUIs übereinander gelegt, oder?

    Gruß
    Trainer

  • Sorry, hab ich überlesen, dass das auch nicht gewünscht wird. Aber wo ist da genau das Problem dabei. Kanst dir ja eine Funktion dazu schreiben, die dir das Child-Gui und das Pic transparent erstellt. Es gibt auch einige Funktionen hier im Forum, die diese und andere Techniken nutzen, um transparente Bilder darzustellen. Einfach mal suchen.

  • Probiere es mal damit:

    Spoiler anzeigen
    [autoit]


    #include <GDIPlus.au3>
    #include <GUIConstants.au3>
    #Include <GuiButton.au3>
    #Include <WindowsConstants.au3>

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

    Global Const $STM_SETIMAGE = 0x0172
    $hMainWindow = GUICreate("Test", 320, 256)
    $Pic = GUICtrlCreatePic("", 0, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)

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

    _GDIPlus_Startup ()
    $image = _GDIPlus_ImageLoadFromFile("c:\Program Files (x86)\AutoIt3\Examples\GUI\Torus.png")
    $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($image)
    GUICtrlSendMsg($Pic, $STM_SETIMAGE, 0, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _GDIPlus_ImageDispose($image)
    _GDIPlus_Shutdown()
    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    GUIDelete()
    Exit
    EndSelect
    WEnd

    [/autoit]

    Du musst nur den Pfad zur Bilddatei entsprechend anpassen!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hi Leute,

    erst mal danke für eure Antworten und sorry für meinen Tonfall gestern - es war spät und ich war müde :S ...

    Ich werde mal versuchen, das bereits gepostete in eine Funktion zu packen, so dass man z.B. mit "GUICtrlCreatePng()" oder so einfach nur einen Einzeiler braucht. Falls jemand diesbezüglich noch einen Codeschnipsel oder eine URL zu einem Forumsbeitrag hat, dann wäre es natürlich schön.

    Ansonsten würde ich die Entwickler bitten, das mal in die ToDo für eine der kommenden Beta-Versionen mit aufzunehmen. Diese Funktionalität ist - so finde ich - doch echt wichtig für ein Programm mit dem man GUIs erstellen kann, oder nicht? Sogar der "kleine Bruder" Autohotkey macht das ohne zu murren!

    Gruß
    Trainer

  • Hallo zusammen,

    hier ist meine Funktion, bzw. mein Include ("PNG_Extender.au3"):

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <GDIPlus.au3>

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

    Func GUICtrlCreatePng($src, $top="", $left="")

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

    Local Const $STM_SETIMAGE = 0x0172

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

    Local $Pic = GUICtrlCreatePic("", $left, $top)

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

    _GDIPlus_Startup ()
    Local $image = _GDIPlus_ImageLoadFromFile($src)
    Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($image)
    GUICtrlSendMsg($Pic, $STM_SETIMAGE, 0, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _GDIPlus_ImageDispose($image)
    _GDIPlus_Shutdown()

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

    Return $Pic

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

    EndFunc

    [/autoit]


    Und hier ein Beispiel-Skript:

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <PNG_Extender.au3>
    #include <GUIConstants.au3>

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

    $hMainWindow = GUICreate("Test", 320, 256)
    $ok = GUICtrlCreatePng("ok.png", 20, 20)
    $cancel = GUICtrlCreatePng("cancel.png", 20, 60)
    GUISetState()

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

    ;Bilder löschen...
    MsgBox("", "", "Bild 1 löschen...")
    GUICtrlDelete($ok)

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

    MsgBox("", "", "Bild 2 löschen...")
    GUICtrlDelete($cancel)

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

    ;Warten auf das Ende
    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    GUIDelete()
    Exit
    EndSelect

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

    Sleep(50)
    WEnd

    [/autoit]


    Gruß Trainer

    Einmal editiert, zuletzt von ip_trainer (8. Mai 2011 um 01:15)