GDIPlus | *Kein Sinvollen Titel für das Thread gefunden*

  • Hallo, ich habe 2 Fragen :)

    Frage 1:
    Ich habe ein kleines Script geschrieben. Hier der Code:

    [autoit]

    #NoTrayIcon
    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>

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

    $Gui = GUICreate('Beispiel', 800, 600)
    GUISetState(@SW_SHOW, $Gui)

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

    _GDIPlus_Startup()
    $Pfad = @ScriptDir & '\Beispiel.jpg'
    $Picture = _GDIPlus_ImageLoadFromFile($Pfad)
    $Graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $Bitmap = _GDIPlus_BitmapCreateFromGraphics(800, 600, $Graphic)
    $Buffer = _GDIPlus_ImageGetGraphicsContext($Bitmap)
    _GDIPlus_GraphicsDrawImage($Buffer, $Picture, 0, 0)
    _GDIplus_GraphicsDrawImage($Graphic, $Bitmap, 0, 0)

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

    While Sleep(10)
    $gmsg = GUIGetMsg(0)
    If $gmsg = $GUI_EVENT_CLOSE Then _Exit()
    WEnd

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

    Func _Exit()
    _GDIPlus_GraphicsDispose($Graphic)
    _GDIPlus_BitmapDispose($Bitmap)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]

    Wenn ich diesen nun starte, wird das Bild ja gezeichnet. Wenn ich aber nun über den Bildschirm mit dem Fenster gehe, geht ein teil des Bildes verloren. Gibt es eine möglichkeit um das Bild ohne es neu zu zeichnen, vollständig zu halten? Es geht ja schließlich bei anderen Programmen auch...


    Frage 2:
    Hat wer ne antwort auf Frage 1? :D
    Okey, kleiner scherz am Rande. Was ich wollte habe ich beim schreiben vergessen X( Wenn es mir wieder einfällt editiere ich das einfach dazu xD
    Danke für euer verständnis :whistling:
    Edit: Weiß wieder :D Kann man das anhalten des Scriptes verhindern? (Also wenn man das Fenster verschiebt?)


    Bedanke mich schonmal im Vorraus...

    2 Mal editiert, zuletzt von Yjuq (6. September 2012 um 13:41)

  • Ich denke,du wirst über das neuzeichnen kaum hinwegkommen.
    Und ich denke andere Programme benutzen entweder kein GDI+ oder Autoit ;)
    Da hast du aber min. 2 Möglichkeiten
    1. Mit TimerInit() und TimerDiff() überprüfen ob ein großer Zeitabstand in einer Schleife war (weil das verschieben das Skript anhält)
    2. Die Position mit WinGetPos() überprüfen und vergleichen

    Das kannst du alle +-500ms überprüfen und dann notfalls neu zeichnen lassen, braucht eig. wenig CPU

  • Es gibt ein Redraw-Event, das für solche Abfragen benutzt wird. Ich hab das schon bei vielen GDI-Scripten gesehen, allerdings hab ich es selbst noch nie benutzt... ^^ Ich denke früher oder später wird einer der GDI+ Pro's hier reinschneien und die Lösung posten... :P

    LG
    Christoph :)

  • Andere Programme zeichnen das Dargestellte neu :rolleyes: ... Da kommst du nicht wirklich drum herum. Und schlimm ist das auch nicht.
    Bei komplizierten Zeichenvorgängen kann man auch einen Backbuffer verwenden und den dann neu zeichnen, das ist effizienter.
    Wie dem auch sei. Wenn du nicht willst, dass ein Teil des Bildes verloren geht, dann musst du eben auf die WM_PAINT Message reagieren die an alle Fenster gesendet wird die neu gezeichnet werden müssen (die Nachricht ist nämlich nicht nur Deko, alle standard Controls reagieren auch darauf und werden neu gezeichnet). Das geht folgendermaßen:

    [autoit]

    #include <WindowsConstants.au3>

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")

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

    Func WM_PAINT()
    ;Hier alles neu zeichnen.
    EndFunc

    [/autoit]

    Edit:

    Zitat

    Kann man das anhalten des Scriptes verhindern? (Also wenn man das Fenster verschiebt?)


    Nicht direkt, soweit ich weiß. Wenn du eine Funktion hast die, unabhängig vom Zustand des Fensters, regelmäßig aufgerufen werden soll, dann kannst du für solche Zwecke die _Timer Funktionen aus der Timers.au3 UDF verwenden um sie in einem angegebenen Intervall aufrufen zu lassen. Das passiert dann auch während man das Fenster verschiebt.

  • Habe die schon in der Hilfe gesehen. Das sind die Windows-Message-ID oder?

    Was ist das überhaupt und wofür sind die denn gut :o?


    >> Frage 1 wäre eig damit ja dann erledigt :P Klappt ja

  • Richtig ^^ Die WM_PAINT :)


    Aber ich habe mich jetzt auf alle bezogen ^^ | Also im Allgemeinen :)
    Guck mir mal den Link an ^^


    Noch ne Frage hab isch :D
    Timers.au3 UDF | Wie meinst du das: (Fail Formulierung) -> Wie macht man das? x)

    Nicht direkt, soweit ich weiß. Wenn du eine Funktion hast die, unabhängig vom Zustand des Fensters, regelmäßig aufgerufen werden soll, dann kannst du für solche Zwecke die _Timer Funktionen aus der Timers.au3 UDF verwenden um sie in einem angegebenen Intervall aufrufen zu lassen. Das passiert dann auch während man das Fenster verschiebt.


    Kannst du mir vielleicht ein kleines Beispiel schreiben? (sofern man das Beispiel klein halten kann xD)
    Ich kapiere aus dem Text soviel wie Bahnhof... Habe bisher noch nie damit gearbeitet und aus der hilfe werde ich nicht schlau :o


    Ansonsten wären alle Fragen damit beantwortet ^^

  • Moin.

    Du kannst auch eine Funktion automatisch aufrufen lassen sobald das Fenster bewegt wird.
    Damit kann man auch unabhängig vom "Festhaltezustand" etwas Ausführen lassen.

    (minimalistischer konnte ich es nicht machen^^)

    [autoit]

    Opt('GUIOnEventMode', 1)

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

    GUICreate('')

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

    GUISetOnEvent(-3, 'EVENT')
    GUIRegisterMsg(0x3, 'WM_MOVE')
    GUISetState()

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

    While Sleep(100)
    ToolTip('')
    WEnd

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

    Func WM_MOVE()
    ToolTip('Hilfe, ich werde Bewegt')
    EndFunc

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

    Func EVENT()
    Switch @GUI_CtrlId
    Case -3
    Exit
    EndSwitch
    EndFunc

    [/autoit]