GDI-Plus

  • Habe heute begonnen mich etwas mit GDI-Plus zu beschäftigen. Bei meinem ersten Übungsscript kam folgendes raus:

    Spoiler anzeigen
    [autoit]

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

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

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

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

    Global $set = 1, $brushbg,$brush,$brush1,$brush2

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

    global $Form1 = GUICreate("Form1", 800, 600, 110, 50,$WS_Popup)
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "move")
    GUISetOnEvent(-3, "_Exit")
    GUISetState()

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

    _GDIPlus_Startup()
    global $Graphic=_GDIPlus_GraphicsCreateFromHWND($Form1)

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

    drawcar()
    draw()

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

    AdlibRegister("set",2000)

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

    global $xys = WinGetHandle("")

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

    While 1
    WEnd

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

    Func _Exit()
    _GDIPlus_BrushDispose($brushbg)
    _GDIPlus_BrushDispose($brush)
    _GDIPlus_BrushDispose($brush1)
    _GDIPlus_BrushDispose($brush2)
    _GDIPlus_GraphicsDispose($Graphic)
    _GDIPlus_Shutdown()

    exit

    EndFunc

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

    func draw()
    sleep(1)
    $brushbg=_GDIPlus_BrushCreateSolid(0xff414141)
    _GDIPlus_GraphicsFillRect($Graphic,0,0,140,350,$brushbg)
    _GDIPlus_GraphicsFillRect($Graphic,60,350,20,350,$brushbg)

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

    $brush=_GDIPlus_BrushCreateSolid(0xffff0000)
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,25,100,100,$brush)
    local $red=_GDIPlus_GraphicsDrawEllipse($Graphic, 20,25,100,100)

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

    $brush1=_GDIPlus_BrushCreateSolid(0xffffff00)
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,130,100,100,$brush1)
    local $yellow=_GDIPlus_GraphicsDrawEllipse($Graphic, 20,130,100,100)

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

    $brush2=_GDIPlus_BrushCreateSolid(0xff00ff00)
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,235,100,100,$brush2)
    local $Green=_GDIPlus_GraphicsDrawEllipse($Graphic, 20,235,100,100)
    EndFunc

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

    func drawcar()
    local $hImgBack = _GDIPlus_ImageLoadFromFile("car.gif")
    _GDIPlus_GraphicsDrawImageRect($Graphic,$hImgBack,200,200,450,450)
    EndFunc

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

    func drive()
    for $1 = 450 to 390 step -20
    for $3 = 200 to 140 step -20
    local $hImgBack = _GDIPlus_ImageLoadFromFile("car.gif")
    _GDIPlus_GraphicsDrawImageRect($Graphic,$hImgBack,200,$3,$1,$1)
    next
    next

    EndFunc

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

    func set()
    If $set = 1 Then
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,25,100,100)
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,130,100,100)
    $set = $set +1
    drive()
    Elseif $set = 2 then
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,235,100,100)
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,130,100,100,$brush1)
    $set = $set +1
    elseif $set = 3 Then
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,130,100,100)
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,25,100,100,$brush)
    $set = $set +1
    elseif $set = 4 Then
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,130,100,100,$brush1)
    $set = $set +1
    elseif $set = 5 Then
    drawcar()
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,25,100,100)
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,130,100,100)
    _GDIPlus_GraphicsFillEllipse($Graphic, 20,235,100,100,$brush2)
    $set = 1
    endif
    EndFunc

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

    func move()
    DllCall("user32.dll","int","SendMessage","hWnd", $xys,"int",$WM_NCLBUTTONDOWN,"int", $HTCAPTION,"int", 0)
    EndFunc

    [/autoit]

    Ich wollte mal fragen, ob ich das Auto nicht "flüssiger" zum laufen bekomme und ob ich die Farben der Ampel nur durch übermalen ändern kann
    Auch würde mich interessieren ob ich irgendwelche Grundlegende Fehler gemacht habe und was verbesserungswürdig ist
    Eine kleine Anmerkung noch ;D
    Das Script ist völlig Sinnlos, da es nur eine Übung ist.

    Bild fürs Script:
    autoit.de/wcf/attachment/9839/.

  • Da funktioniert GAR NICHTS!
    Das liegt größtenteils an den falsch declarierten Variablen.
    P.S. Die Includes

    [autoit]

    #include <GDIPConstants.au3>
    #include <GDIP.au3>

    [/autoit]

    sind mir vollkommen unbekannt... Ich gehe aber mal davon aus, dass du

    [autoit]

    #include <GDIPlusConstants.au3>
    #include <GDIPlus.au3>

    [/autoit]

    meinst ;)

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • @Cartan: Es gibt sehrwohl die autoit.de/wcf/attachment/9840/ und die autoit.de/wcf/attachment/9841/, allerdings sind diese nicht bei der Installation dabei.
    Aber abgesehen davon, meinte er wirklich die GDIPlus.au3 und die GDIPlusConstants.au3

  • Also bei mir läuft das.
    Und die Inculdes die ich habe, heißen auch so. Ich hänge sie mal am ersten Post an.

    Edit: Hat irgenwie nicht funktioniert.
    Jedoch läuft das Script mit den verwendeten Includes :whistling:

    Einmal editiert, zuletzt von descent (24. Mai 2010 um 22:10)

  • clezZ: Danke, man lernt eben immer was dazu :D

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Kp, aber jetzt klappts...
    Na ja, deine Struktur lässt noch zu wünschen übrig. Du solltest es mal mit

    [autoit]

    Opt("MustDeclareVars", 1)

    [/autoit]

    versuchen...

    Edit: arrg :cursing:
    Sorry für den Doppelpost :rolleyes:

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Also bei mir läuft das.
    Und die Inculdes die ich habe, heißen auch so. Ich hänge sie mal am ersten Post an.

    Das es läuft ist logisch, da am Anfang der GDIP.au3 die GDIPlus.au3 und die GDIPlusConstants.au3 includet werden. Allerdings benutzt du keine Funktion aus der GDIP.au3, weshalb du #include <GDIPlus.au3> schreiben solltest.

  • Ok danke für die Tipps. Ich habe diese auch gleich versucht umzusetzen.
    @Cartan
    Was meinst du genau mit der Struktur und was sollte ich daran verbessern?

    Ich habe mal die geänderte Version in Post 1 eingefügt.

  • Hier mal die Warnungen...
    Das bedeutet du solltest die mal alle am Anfang als Global deklarieren (--> siehe Opt("MustDeclareVars",0), die verhindert, dass du was vergisst ^^), denn in Funktionen ist das nicht so schlau...

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Ok, werde ich in Zukunft machen. Danke :)
    Wenn nun angenommen eine Variable nur in einer Funktion verwendet wird, sollte diese am Anfang der Funktion als Local deklariert werden oder?

  • Genau!
    Aber immer dran denken, dass die nirgendwo sonst benutzt werden kann, es sei denn, du gibst sie per Return zurück ^^

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Gut, dass mit dem Return muss ich mir nachher noch anschauen.
    Habe den Quelltext nun so geändert, dass nun keine Warnungen mehr erscheinen.

    Hat vielleicht noch jemand eine Idee, wie ich das Auto bewegen könnte, damit dies flüssiger läuft?

  • Aber immer dran denken, dass die nirgendwo sonst benutzt werden kann, es sei denn, du gibst sie per Return zurück ^^

    Oder du deklarierst die Variable in der Funktion Global ^^
    Wobei bei Return nicht direkt diese Variable genutzt werden kann.

  • Oder du deklarierst die Variable in der Funktion Global ^^

    Sollte man vermeiden, wenn man sie nicht am Anfang des Scriptes als Global deklariert hat (und dann brings auch schon gar nicht mehr, die in der Func als Global zu deklarieren)
    Ich weiß, ich nerv euch mit dem "hab einen guten Programmier Stil", aber ich hab gemerkt, dass es so 1000 mal einfacher ist, die Scripte von anderen Leuten zu verstehen

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Ich weiß, ich nerv euch mit dem "hab einen guten Programmier Stil", aber ich hab gemerkt, dass es so 1000 mal einfacher ist, die Scripte von anderen Leuten zu verstehen

    Warum nerven? Ich bin der gleichen Meinung.

  • ich hätte da noch ne frage

    [autoit]

    local $red=_GDIPlus_GraphicsDrawEllipse($Graphic, 20,25,100,100)

    [/autoit]

    warum belegst du die variable $red mit dem return von _GDIPlus_GraphicsDrawEllipse ?

    das is eigentlich nich nötig da die funktion ja nix brauchbares zurückgibt

  • Übrigens ist es sinnvoller in der Funktion set, anstatt die If-ElseIf-EndIf-Möglichkeit, Switch zu nehmen.
    Und du kannst anstatt

    [autoit]

    $set = $set + 1

    [/autoit][autoit]

    $set += 1

    [/autoit]


    schreiben.

  • yxyx
    Hatte ich vergessen zu löschen. War ja wie gesagt mein erstes Script mit GDI+ und ich dachte das ich das später noch benötige.

    @m-obi
    Wusste nicht das ich das so schreiben kann. Danke für den Tipp :)
    Werde nachher mal versuchen das so abzuändern.