PNG ohne Rahmen darstellen

  • Hallo Leute,

    ein weiteres Problem hat sich aufgetan.

    Folgendes Szenario:
    Ich löse mittels Butten in der GUI per Telnet auf dem externen Gerät einen Screenshot an. Dieser Screenshot ist und muss immer eine *.PNG sein, ansonsten funktioniert die leider nicht.
    Dieser Screenshot wird per FTP-Funktion in einen Ordner geladen.
    Das funktioniert perfekt so weit.

    Nun zum Problem:
    Diese Screenshot.PNG soll nun (am liebsten ohne Rahmen) auf der GUI angezeigt werden und bei jedem neuen Screenshot ausgetauscht werden....

    Bislang habe ich innerhalb der GUI immer nur mit JPG oder BMP gearbeitet... nur leider geht das in diesem Fall leider nicht.

    Alle Beispiele die ich gefunden habe sind entweder für mich so undurchsichtig, dass ich die nocht an meine Bedürfnisse angepasst bekomme... und dazu eigentlich immer im eigenen Fenster. Das kann ich leider auch nicht gebrauchen.

    Kennt jemand entweder ein verständliches Tut, oder kann mir dabei jemand helfen, büdde?

    Gruß
    Pitter

    Gruß
    Pitter

    Einmal editiert, zuletzt von Pitter (22. Januar 2012 um 21:30)

  • Du willst ein PNG in einem GUI darstellen?

    Dann mach doch mal mit

    [autoit]

    _GDIPlus_GraphicsCreateFromHWND

    [/autoit]

    eine Graphic und mit

    [autoit]

    _GDIPlus_ImageLoadFromFile

    [/autoit]

    das Bild und dann zeichnest du das mit

    [autoit]

    _GDIPlus_GraphicsDrawImageRect

    [/autoit]


    Es wäre aber besser das Bild mit den TCP-Funktionen zu schicken, denn dann könntest du es aus dem Arbeitsspeicher laden und das auch in einer Schleife ohne dass deine Festplatte zu sehr beansprucht wird.

    MfG, James C.

  • Danke für Deine Antwort!

    Mit GDI hab ich noch nie gearbeitet... da muss ich mich mal "reinquälen"... :(

    Das PNG muss ich eh auf dem PC speichern, also ist das eh egal, oder?

    Gruß
    Pitter

  • Jep, das hab ich nun hinbekommen, jedenfalls das Startbild wird angezeigt. Danke!!! :thumbup:

    Den Bildwechsel beim Screenshot muss ich morgen machen, wenn ich das externe Gerät dran habe.

    Was mich noch etwas stört ist, dass das PNG weg ist, wenn ich das Programm in die Taskleiste minimiere und wieder hoch hole...
    Hat da noch jemand eine Idee zu?

    Gruß
    Pitter

  • Du musst das Bild wieder in den GDI+ Grafik Handle hinein kopieren -> z.B. GUIRegisterMsg: WM_ERASEBKGND prüfen, ob die GUI gelöscht wurde.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • ;( .... hmmm....

    Da krieg ich keinen Kopf dran..

    Ich rufe das Startbild folgendermassen auf:

    [autoit]


    Func _Main()
    _GDIPlus_Startup()
    .
    .
    GUISetState()

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

    $pic2 = @ScriptDir & "\Testbild.png"
    $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND($WinMain)
    $hImage = _GDIPlus_ImageLoadFromFile($pic2)
    _GDIPlus_GraphicsDrawImageRect($hGraphic1, $hImage, 615, 545, 400, 240)

    [/autoit]


    Damit bekomme ich das Bild angezeigt.

    Wie gehe ich dann nun mit
    "z.B. GUIRegisterMsg: WM_ERASEBKGND" um, damit ich das hin bekomme?

    ...und 2.:

    Wie schaffe ich es, dass das gespeicherte neue PNG nach der schreenshot-Funktion auch angezeigt wird?

    GDI... ein Buch mit sieben Siegeln für mich... :wacko:

    Gruß
    Pitter

  • Hier mal 2 Beispiele wie oben beschrieben.

    Beispiel 1 (GDI+):

    Spoiler anzeigen
    [autoit]


    #AutoIt3Wrapper_UseUpx=n
    #include <GDIPlus.au3>
    #include <WindowsConstants.au3>

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

    Opt("GUIOnEventMode", 1)
    Opt('MustDeclareVars', 1)

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

    Local $iX = 320
    Local $iY = 320
    Local $hWnd = GUICreate("GDI+ Redraw Window", $iX, $iY)
    GUISetState()
    GUISetOnEvent(-3, "_Close")

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

    _GDIPlus_Startup()
    Local $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iX, $iY, $hGraphics)
    Local $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    Local $pen_size = 128
    Local $hPen = _GDIPlus_PenCreate(0xFF00FF00, $pen_size)
    _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)
    _GDIPlus_GraphicsClear($hBackbuffer)
    _GDIPlus_GraphicsDrawEllipse($hBackbuffer, $pen_size / 2, $pen_size / 2, $iX - $pen_size, $iY - $pen_size, $hPen)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $iX, $iY)

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

    GUIRegisterMsg($WM_ERASEBKGND, "ReDraw")

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

    While Sleep(30000)
    WEnd

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

    Func ReDraw()
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $iX, $iY)
    Return 1
    EndFunc

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

    Func _Close()
    GUIRegisterMsg($WM_TIMER, "")
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hBackbuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]

    Beispiel 2 (GUICtrlCreatePic()):

    Spoiler anzeigen
    [autoit]


    ;coded by UEZ 2011
    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>

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

    Global Const $IMAGE_BITMAP = 0
    Global Const $STM_SETIMAGE = 0x0172
    Global $msg
    _GDIPlus_Startup()
    Global Const $png = StringReplace(@AutoItExe, "autoit3.exe", "Examples\GUI\Torus.png")
    Global Const $hImage = _GDIPlus_ImageLoadFromFile($png)
    Global Const $hGUI = GUICreate("Display PNG Image in picture control", _GDIPlus_ImageGetWidth($hImage), _GDIPlus_ImageGetHeight($hImage))
    Global Const $idPic = GUICtrlCreatePic("", 0, 0)
    Global Const $Bmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    _WinAPI_DeleteObject(GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $Bmp))
    GUISetState()

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $idPic
    MsgBox(0, "Information", "PNG image was clicked")
    Case $GUI_EVENT_CLOSE
    _WinAPI_DeleteObject($Bmp)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    GUIDelete($hGUI)
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Danke für die Beispiele.... :thumbup:

    Jetzt wird nach Minimieren und dann wieder aus der Taskleiste hoch holen zwar das PNG wieder angezeigt, aber mein Hintergrund der GUI ist weg. Stattdessen wird aus dem Desktop ein "Hintergrund" generiert. Was mach ich da falsch? ;(

    Hab das jetzt so gemacht:

    Spoiler anzeigen
    [autoit]


    _Main()

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

    Func _Main()
    ;====== set gui
    ;============================
    $WinMain = GUICreate($progname, 1200, 800, -1, -1)
    GUISetBkColor(0x232A30) ;darkgrey
    ;============
    ;=== hier kommen dann die ganzen Controls, wie Buttons und Textfelder
    ;============
    ;======================== end button create ======================================

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

    GUISetState()

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

    ;======== show dummy.png ==========
    _GDIPlus_Startup()
    $pic2 = @ScriptDir & "\Testbild.png"
    $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND($WinMain)
    $hImage = _GDIPlus_ImageLoadFromFile($pic2)
    _GDIPlus_GraphicsDrawImageRect($hGraphic1, $hImage, 615, 545, 400, 240)
    GUIRegisterMsg($WM_ERASEBKGND, "_Redraw")
    ;===================================

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

    ;=============================== Events ==========================================
    ;============================= end events =================================
    EndFunc ;==>_Main

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

    ;======= func restore image on WinMain
    Func _Redraw()
    _GDIPlus_GraphicsDrawImageRect($hGraphic1, $hImage, 615, 545, 400, 240)
    Return 1
    EndFunc ;==>_redraw

    [/autoit]

    Wie zum Henker kriege ich jetzt meinen Hintergrund wieder an den Start?!? ?(

    Gruß
    Pitter

  • Ersetze die _Redraw() Funktion mit dieser:

    [autoit]


    Func _Redraw()
    _GDIPlus_GraphicsClear($hGraphic1, 0xFF232A30)
    _GDIPlus_GraphicsDrawImageRect($hGraphic1, $hImage, 615, 545, 400, 240)
    Return 1
    EndFunc ;==>_redraw

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Noch eine Nachfrage...

    Ich hoffe, ich geh Euch nicht auf den Keks damit... ;(

    Wie kann ich bei einer Änderung des PNG dieses auf der GUI austauschen?
    Egal was ich mache, das Startbild bleibt immer oben.

    Hintergrund:
    Ich habe eine Screenshot-Funktion, die das Bild per FTP auf den PC schaufelt. Dieses PNG soll dann das gerade angezeigtre PNG austauschen.... Das krieg ich nicht gebacken.

    Gruß
    Pitter

    Gruß
    Pitter

  • Das Bild wieder laden und in den Grafik Handle kopieren.

    Vorher das alte Handle "disposen".

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ach SCh*****...
    Mann, was bin ich blond. :rofl:

    Das kann ja nicht gehen, wenn ich 2x die gleiche Func aufrufe.... Hab das gerade gemerkt, als ich die Cases und Funcs hier zeigen wollte...
    Mann ist das peinlich! 8|

    Gruß
    Pitter