1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Yjuq

Beiträge von Yjuq

  • Text "lesbar" machen

    • Yjuq
    • 29. Dezember 2014 um 04:57

    Lad mal bitte die Readme Datei komplett hoch. :)


    €dit:
    Obwohl, geht auch ohne, da steht folgendes drin: (russisch)

    Code
    Удар Ведущего мяч в блицболе (заморажимать не рекомендуется)
    Пас Ведущего мяч в блицболе (заморажимать не рекомендуется)
    Опыт в блицболе (лучше ставить 9000)
    Время в блицболе (заморажимать не рекомендуется)

    Als Google Übersetzer:

    Code
    Blei Schieß den Ball in blitsbole (zamorazhimat nicht empfohlen)
    Führen vorbei den Ball blitsbole (zamorazhimat nicht empfohlen)
    Erleben Sie in blitsbole (besser, 9000 Put)
    Zeit blitsbole (zamorazhimat nicht empfohlen)

    Ich habe keine Ahnung worauf sich das bezieht xD

    €dit2:
    Ich habe da sogar noch'n Service. Falls du wissen möchtest was da genau steht, ich habe ne Freundin die kann russisch. Dann frag ich die mal an :P

  • AutoIt-Object -- dynamische Wertezuweisung an Properties

    • Yjuq
    • 29. Dezember 2014 um 00:49

    Achja, genau... Musste bisschen nachdenken... :D
    Mit _AutoItObject_AddProperty() kannst du existierende Werte auch überschreiben. Wenn du es "ganz sauber" haben willst lösche das Property vorher mit _AutoItObject_RemoveMember().

    Spoiler anzeigen
    [autoit]

    #include "AutoitObject.au3"
    #include <Array.au3>

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

    _AutoItObject_StartUp()

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

    ; Objekt mit Properties erstellen
    $o = _Obj('Alpha;Beta;Gamma;Delta')

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

    ; Property-Namen anzeigen
    $aProps = $o.ArrayProps
    _ArrayDisplay($aProps)

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

    ; Werte ausgeben (Wert = Index bei Erstellung)
    With $o
    ConsoleWrite(.Alpha & @CRLF)
    ConsoleWrite(.Beta & @CRLF)
    ConsoleWrite(.Gamma & @CRLF)
    ConsoleWrite(.Delta & @CRLF & @CRLF)
    EndWith

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

    ; Werte in Schleife ausgeben
    For $i = 1 To $aProps[0]
    ConsoleWrite(Execute('$o.' & $aProps[$i]) & @CRLF)
    Next
    ConsoleWrite(@CRLF)

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

    ; ??? Werte in Schleife zuweisen ???
    Global $aNewVal[4] = [10,20,30,40]
    For $i = 1 To $aProps[0]
    _AutoItObject_AddProperty($o, $aProps[$i], $ELSCOPE_PUBLIC, $aNewVal[$i -1])
    Next

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

    ; Werte in Schleife ausgeben
    For $i = 1 To $aProps[0]
    ConsoleWrite(Execute('$o.' & $aProps[$i]) & @CRLF)
    Next

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

    _AutoItObject_Shutdown()

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

    Func _Obj($_sProps)
    Local $self = _AutoItObject_Create()
    Local $aProps = StringSplit($_sProps, ';')
    For $i = 1 To $aProps[0]
    _AutoItObject_AddProperty($self, $aProps[$i], $ELSCOPE_PUBLIC, $i)
    Next
    ; Array mit Property-Namen speichern in eigener Property
    _AutoItObject_AddProperty($self, 'ArrayProps', $ELSCOPE_PUBLIC, $aProps)
    Return $self
    EndFunc

    [/autoit]
  • AutoIt-Object -- dynamische Wertezuweisung an Properties

    • Yjuq
    • 28. Dezember 2014 um 23:49
    Spoiler anzeigen

    Geht auch mit Execute, mich wundert's eigentlich dass du nicht auf die Idee kommst das = $aNewVal[$i-1] in nen String zu packen... :D


    [autoit]

    #include "AutoitObject.au3"
    #include <Array.au3>

    [/autoit]

    [autoit][/autoit] [autoit]

    [s]
    [/s]

    [/autoit] [autoit]

    [s]_AutoItObject_StartUp()[/s]

    [/autoit] [autoit]

    [s]
    [/s]

    [/autoit] [autoit]

    [s]; Objekt mit Properties erstellen
    $o = _Obj('Alpha;Beta;Gamma;Delta')[/s]

    [/autoit] [autoit]

    [s]
    [/s]

    [/autoit] [autoit]

    [s]; Property-Namen anzeigen
    $aProps = $o.ArrayProps
    _ArrayDisplay($aProps)[/s]

    [/autoit] [autoit]

    [s]
    [/s]

    [/autoit] [autoit]

    [s]; Werte ausgeben (Wert = Index bei Erstellung)
    With $o
    ConsoleWrite(.Alpha & @CRLF)
    ConsoleWrite(.Beta & @CRLF)
    ConsoleWrite(.Gamma & @CRLF)
    ConsoleWrite(.Delta & @CRLF & @CRLF)
    EndWith[/s]

    [/autoit] [autoit]

    [s]
    [/s]

    [/autoit] [autoit]

    [s]; Werte in Schleife ausgeben
    For $i = 1 To $aProps[0]
    ConsoleWrite(Execute('$o.' & $aProps[$i]) & @CRLF)
    Next[/s]

    [/autoit] [autoit]

    [s]
    [/s]

    [/autoit] [autoit]

    [s]; ??? Werte in Schleife zuweisen ???
    Global $aNewVal[4] = [10,20,30,40]
    For $i = 1 To $aProps[0]
    ; wie kann ich dynamisch den Property-Namen verwenden?
    ; so gehts nicht:
    Execute('$o.' & $aProps[$i] & '= $aNewVal[$i-1]') ; ==>> error: Statement cannot be just an expression.
    Next[/s]

    [/autoit] [autoit]

    [s]
    [/s]

    [/autoit] [autoit]

    [s]_AutoItObject_Shutdown()[/s]

    [/autoit] [autoit]

    [s]
    [/s]

    [/autoit] [autoit]

    [s]Func _Obj($_sProps)
    Local $self = _AutoItObject_Create()
    Local $aProps = StringSplit($_sProps, ';')
    For $i = 1 To $aProps[0]
    _AutoItObject_AddProperty($self, $aProps[$i], $ELSCOPE_PUBLIC, $i)
    Next
    ; Array mit Property-Namen speichern in eigener Property
    _AutoItObject_AddProperty($self, 'ArrayProps', $ELSCOPE_PUBLIC, $aProps)
    Return $self
    EndFunc[/s]

    [/autoit]

    Sorry, da war ich wieder schneller als wie ich nachgedacht habe...
    Aber ich hatte das schonmal gemacht. Ich schau mal nach... :S

  • Hex Farbwerte nach RGB umrechnen

    • Yjuq
    • 27. Dezember 2014 um 16:05

    Um ein paar Bytes einzusparen xD
    Hatte kein Bock auf diese "xyz or xyz or xyz or xyz or ..." Geschichte :x
    Kann sich ja jeder umschreiben wie er/sie lustig ist ^^

  • Hex Farbwerte nach RGB umrechnen

    • Yjuq
    • 27. Dezember 2014 um 01:04
    [autoit]

    Func RGBToHex($iRed, $iGreen, $iBlue)
    If Not BitAND(IsInt($iRed), IsInt($iGreen), IsInt($iBlue)) Then Return SetError(1, 0, -1)
    If BitOR($iRed < 0, $iGreen < 0, $iBlue < 0, $iRed > 0xff, $iGreen > 0xff, $iBlue > 0xff) Then Return SetError(2, 0, -1)
    Return '0x' & Hex($iRed, 2) & Hex($iGreen, 2) & Hex($iBlue, 2)
    EndFunc

    [/autoit]

    €dit: Achja, alternativ ginge auch noch die Funktion _ColorSetRGB()...

  • The Perseus Programming Language

    • Yjuq
    • 22. Dezember 2014 um 14:41

    Ach stimmt, da habe ich nicht dran gedacht BugFix. Aber vielen dank dass du Perseus woanders hochgeladen hast!
    Du bist ein Schatz :D

  • The Perseus Programming Language

    • Yjuq
    • 22. Dezember 2014 um 03:17

    Das kann ich dir leider nicht sagen. Vielleicht liegt es an Chrome oder einfach nur meiner lahmarschigen 5~7 kb/s Leitung. Es könnte auch sein dass ich irgendeine Software installiert habe welche schlichtweg Downloads von SourceForge blockt. Wenn ich das wüsste hätte ich mir nicht die Mühe gemacht nachzufragen ob jemand netterweise den Download hier im Forum zur Verfügung stellt...

    Fakt ist: Ich bekomme einfach den Download nicht gestartet.

    Hoffentlich war das nun unmissverständlich ausgedrückt.
    Sorry wenn das jetzt so unfreundlich rüber kommt, aber mir kommt es vor als ob du mich hier als total bescheuert darstellen möchtest. Und ich habe gerade auch nicht die beste Laune für solch einen Kindergarten.

  • The Perseus Programming Language

    • Yjuq
    • 22. Dezember 2014 um 02:47

    @Über mir: Lies nochmal :rolleyes:

  • The Perseus Programming Language

    • Yjuq
    • 22. Dezember 2014 um 02:37

    7 MB o.o
    Was hast du denn da alles drin? Das ist ja schon beinahe unverschämt... :S

    Ich habe leider immer wieder ein Problem mit SourceForge. Ich kann da rein gar nichts downloaden. Wäre jemand so nett und würde den Download evtl. hier zur Verfügung stellen?

  • Eigenen Script-Editor programmieren, dazu ein paar Fragen.....

    • Yjuq
    • 17. Dezember 2014 um 16:43

    Ach, da kenne ich schon ein Programm welches diese "grafische Programmierung" ermöglicht. Schau dir mal Scratch an, wird kostenlos im Netz auf der Herstellerseite angeboten.

    Zu deinen Fragen:
    Du kannst das Programm einfach normal in der CMD aufrufen. In Falle eines AutoIt Programmes eben mit Run. Da hast du dann die Möglichkeit die STD-Streams auszulesen und dann ggf. zu verwerten. Allein schon beispielsweise bei dem Au3Check erhälst du eine kleine Hilfe angezeigt wenn du diesen in der CMD ohne Parameter startest.

  • ObjCreateInterface() => CLSID & IID

    • Yjuq
    • 16. Dezember 2014 um 17:54

    Ach super, danke ihr zwei!
    Die meisten Header liefert "Microsoft SDK" (ich weiß gerade nicht ob das vorinstalliert ist) mit: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include
    Da kann ich mir die Online Header Suche schonmal sparen ^^

    Habe das Gleiche mal für das ID2D1Factory Interface (Direct2D) versucht und muss sagen dass ich tatsächlich die IID gefunden habe. Da ich von eukalyptus ja die Direct2D UDF besitze konnte ich das leicht nachprüfen. Stimmt alles, dankeschön. Jetzt weiß ich endlich wie man an die IID's dran kommt. CLSID wird dann wohl auf gleichen Weg erfolgen, und je nach Bibliothek kann ja auch einfach der Pointer zu dem Objekt genutzt werden.

    Ich bedanke mich recht herzlich ^^

  • ObjCreateInterface() => CLSID & IID

    • Yjuq
    • 15. Dezember 2014 um 06:43

    Schönen guten Morgen :)
    Seit geraumer Zeit steht uns ja die ObjCreateInterface() Funktion zur Verfügung. Damit ist es ja möglich solche Finge wie Direct2D oder auch DirectWrite und DirectShow in AutoIt zu verwenden. Das Potential dahinter und deren Verwendung habe ich bereits erkannt, jedoch ist mir noch eins unschlüssig.

    Bleiben wir mal bei dem Beispiel welches in der englischen Hilfe existiert. Dort wird via ObjCreateInterface() und dem ITaskBar Interface das Notepad Icon aus der Taskbar gelöscht. Jedoch hab ich absolut keine Ahnung wie man auf die CLSID und IID des Interfaces gekommen ist. Vielleicht kann mir einer vob euch erklären woher diese (ich nenne Sie mal so) "IDs" stammen und wie man diese für bestimmte Interfaces ermittelt!?

    Lg. Make :)

  • Geschwindigkeitsoptimierung in AutoIt

    • Yjuq
    • 13. Dezember 2014 um 17:25

    Hier mal meine Daten für die NSA:

    Spoiler anzeigen

    >Result with AutoIt 3.3.12.0 x86.
    >CPU: Intel(R) Core(TM) i5-2450M CPU @ 2.50GHz X64
    >RAM: 5.42/7.98 GB
    >OS: WIN_7 (7601) X64
    >Parameter: 100
    +Func For (1) needs for 32767 runs 7935.01 ms (Average: 0.2422 ms) --> 1.0x
    !Func While (2) needs for 32767 runs 9730.47 ms (Average: 0.2970 ms) --> 1.2x
    -Func Do (3) needs for 32767 runs 9682.48 ms (Average: 0.2955 ms) --> 1.2x

    >Result with AutoIt 3.3.12.0 x64.
    >CPU: Intel(R) Core(TM) i5-2450M CPU @ 2.50GHz X64
    >RAM: 5.42/7.98 GB
    >OS: WIN_7 (7601) X64
    >Parameter: 100
    +Func For (1) needs for 32767 runs 6842.51 ms (Average: 0.2088 ms) --> 1.0x
    -Func While (2) needs for 32767 runs 8460.29 ms (Average: 0.2582 ms) --> 1.2x
    !Func Do (3) needs for 32767 runs 8712.79 ms (Average: 0.2659 ms) --> 1.3x

  • Geschwindigkeitsoptimierung in AutoIt

    • Yjuq
    • 11. Dezember 2014 um 16:20

    Interessanter Thread!
    Ich selber habe mich noch nie mit der Geschwindigkeit von Programmen befasst. Vielleicht mal wenn es in den Grafischen Bereich ging. Ansonsten war und ist die Geschwindigkeit von AutoIt durchaus ausreichend gewesen. Aber echt interessant was für Kleinigkeiten einige Sekunden einsparen. Ich denke wenn man konsequent dann auf diese kleinen Dinge achtet, dann sollte man einen deutlich merkbaren Unterschied in komplexen Algorithmen spüren. Natürlich sollte man zuerst den Algorithmus an sich verbessern. Wie kommt man eigentlich darauf? Bzw. wo gibt es Lektüre zu diesem Thema? Gibt's da spezielle Begriffe zu um sich das eine oder andere selber zu googeln?

    Um selber mal was beizutragen:
    Wer gerne mit GDI+ arbeitet sollte sich mal überlegen Bitmaps (normalerweise verwendet man ja ein Backbuffer) mit _WinAPI_BitBlt() ins Fenster zu zeichnen. Dies ist um Längen schneller als _GDIPlus_GraphicsDrawImage(). Siehe Codebeispiel:

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

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

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

    Global $hGUI, $hGraphic, $hBitmap, $hHBitmap, $hImage, $hDCDest, $hDCSrc, $oObj, $hGfx, $iFor, $hPen, $hTimer

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

    _GDIPlus_Startup()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $hGUI = GUICreate('GDI+ Example', 800, 600)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(800, 600, $hGraphic)
    $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    $hImage = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $hDCDest = _WinAPI_GetDC($hGUI)
    $hDCSrc = _WinAPI_CreateCompatibleDC($hDCDest)
    $oObj = _WinAPI_SelectObject($hDCSrc, $hHBitmap)
    $hGfx = _GDIPlus_GraphicsCreateFromHDC($hDCSrc)
    GUISetState()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    _GDIPlus_GraphicsClear($hImage, 0xFFFFFFFF)
    For $iFor = 1 To 100
    $hPen = _GDIPlus_PenCreate(BitOR(0xFF000000, Random(0x000000, 0xFFFFFF, 1)))
    _GDIPlus_GraphicsDrawLine($hImage, Random(0, 800, 1), Random(0, 600, 1), Random(0, 800, 1), Random(0, 600, 1), $hPen)
    _GDIPlus_GraphicsDrawLine($hGfx, Random(0, 800, 1), Random(0, 600, 1), Random(0, 800, 1), Random(0, 600, 1), $hPen)
    _GDIPlus_PenDispose($hPen)
    Next

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

    $hTimer = TimerInit()
    For $iFor = 1 To 1000
    _GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)
    Next
    ConsoleWrite('_GDIPlus_GraphicsDrawImage => ' & TimerDiff($hTimer) & @CRLF)

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

    $hTimer = TimerInit()
    For $iFor = 1 To 1000
    _WinAPI_BitBlt($hDCDest, 0, 0, 800, 600, $hDCSrc, 0, 0, $SRCCOPY)
    Next
    ConsoleWrite(' _WinAPI_BitBlt => ' & TimerDiff($hTimer) & @CRLF)

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    _GDIPlus_GraphicsDispose($hGfx)
    _WinAPI_SelectObject($hDCSrc, $oObj)
    _WinAPI_DeleteDC($hDCSrc)
    _WinAPI_ReleaseDC($hGUI, $hDCDest)
    _GDIPlus_GraphicsDispose($hImage)
    _WinAPI_DeleteObject($hHBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]
  • "Tree"-Variable

    • Yjuq
    • 8. Dezember 2014 um 14:35

    Herjee... Lies dir nochmal den Post von mir durch und überleg dann mal wie du die vorhandene Funktion so umschreibst, dass du doch mit zahlen arbeiten kannst :S

    Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2

  • Tutorial – OOP in AutoIt

    • Yjuq
    • 5. Dezember 2014 um 03:17

    Teil #2
    (Alle Beispiele sind für die AutoIt Version 3.3.12.0 geschrieben und laufen eventuell auf älteren Versionen nicht!)
    + ++ +++ ++++ +++++ ++++++ +++++++ ++++++++ +++++++++ ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +
    Teil #1

    Teil #3
    + ++ +++ ++++ +++++ ++++++ +++++++ ++++++++ +++++++++ ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +


    Wofür OOP?
    Du weißt zwar jetzt was Objekte sind, aber vielleicht ist dir noch nicht klar geworden wofür man diese nun gebrauchen kann. Ich versuche es mal an einem Beispiel zu erklären. Stellen wir uns einmal eine GUI vor in dem viele unterschiedliche aber auch irgendwie ähnliche Controls enthalten sind. Beispielsweise Button Controls. Sie sehen vom Design her gleich aus, erfüllen aber je nach Programmierung einen anderen Zweck und beinhalten andere Texte. Jedes dieser Controls ist im Grunde nur ein Objekt, welches wir von seinen Eigenschaften her verändern können. Ein anderes Beispiel wäre da z.B. NPCs in diversen Computerspielen. Jeder reagiert unterschiedlich auf die Handlungen des Spielers und hat andere Eigenschaften. Kurz gesagt: Überall wo viele unterschiedlich aber irgendwie auch ähnliche Objekte existieren, kann OOP zum Einsatz kommen.


    Ziel des Teilabschnittes:
    Im ersten Teil des Tutorials hast du gelernt, wie man Objekte in AutoIt erstellt. In diesem Teil kommen die Objekte auch zum Einsatz. Bleiben wir einmal bei unseren GUI Controls. Wir wollen in diesem Abschnitt ein Pseudo Button erstellen. Dies wird zwar kein „echtes“ Control werden, erfüllt aber den Zweck eines Buttons. Ziel ist es, das Objekt möglichst so zu programmieren, dass es problemlos in jede Anwendung integriert werden kann. Dazu gehört auch, dass so viele Buttons wie gewünscht erstellt werden können.


    Schritt 1 - Erste Überlegungen:
    Zuerst einmal müssen wir uns überlegen was wir genau für unseren Button an Attribute und Methoden benötigen. Dazu ist es denke ich am einfachsten, wenn wir Schritt für Schritt vorgehen. Ein Button wird für gewöhnlich auf eine GUI erstellt, daher benötigen wir ein Attribut welches das Handle der GUI enthält (.handle). Zudem wird ein Button ja nicht irgendwo erstellt, sondern an der Position (.left|.top). Ein Button hat auch eine gewissen Höhe (.height) und Breite (.width) welche wir angeben können. Natürlich können wir für das Design dem Button einem Text zuweisen (.text). Damit haben wir schon 6 Attribute die wir im Objekt angeben können. Aber ein Button hat ja auch eine Funktion die Aufgerufen wird, sobald man es anklickt. Diese Funktion können wir in einem zusätzlichen Attribut (.func) hinterlassen. Jetzt muss der Button nur noch irgendwie in der GUI angezeigt werden, da können wir eine Methode (.draw()) definieren die das für uns erledigt. Damit haben wir im Grunde alles nötige für ein Button abgedeckt. Auf diese erste Definition des Objektes werden wir unseren Pseudo Button nun aufbauen:

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <AutoItObject.au3>

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

    _AutoItObject_Startup()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func __Class_Button()
    Local $oClass = _AutoItObject_Class()
    $oClass.AddProperty('handle')
    $oClass.AddProperty('text')
    $oClass.AddProperty('left')
    $oClass.AddProperty('top')
    $oClass.AddProperty('width')
    $oClass.AddProperty('height')
    $oClass.AddProperty('func')
    $oClass.AddMethod('draw', '__Button_Draw')

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

    Return $oClass
    EndFunc

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

    Func __Button_Draw($oSelf)
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]

    Nun steht quasi schon das Grundgerüst. Um den Button zu zeichnen benutze ich im folgendem GDI+. Wer damit nichts anfangen kann sollte sich vielleicht vorab dieses Tutorial hier anschauen: Gdi+ Tutorial [Part 5]


    Schritt 2 - Button zeichnen:
    Nun kommt eigentlich das tolle an OOP. Wir können direkt die Funktionalität zum zeichnen des Buttons erstellen ohne das wir großartig das ganze drum herum erst programmieren müssen. Wir können davon ausgehen dass das erstellte Objekt später auch alle nötigen Informationen enthält, dafür sind die Attribute schließlich da. Da wir nun mit GDI+ arbeiten und ggf. Ressourcen benötigen brauchen wir auch einen Destruktor welcher uns die gesamten Ressourcen wieder frei gibt, sobald das Objekt gelöscht wird. Klingt ja irgendwie auch logisch, oder?

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <AutoItObject.au3>
    #include <GDIPlus.au3>

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

    _AutoItObject_Startup()
    _GDIPlus_Startup()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func __Class_Button()
    Local $oClass = _AutoItObject_Class()
    $oClass.AddProperty('handle')
    $oClass.AddProperty('text')
    $oClass.AddProperty('left')
    $oClass.AddProperty('top')
    $oClass.AddProperty('width')
    $oClass.AddProperty('height')
    $oClass.AddProperty('func')
    $oClass.AddMethod('draw', '__Button_Draw')
    $oClass.AddDestructor('__Button_Destructor')

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

    Return $oClass
    EndFunc

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

    Func __Button_Draw($oSelf)
    EndFunc

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

    Func __Button_Destructor($oSelf)
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]

    Die Handles zu den Ressourcen können wir später im Objekt als private Attribute hinterlegen. So kann sich das Objekt selber darum kümmern und von außen kann der Programmierer diese nicht „versehentlich“ überschreiben. Das bietet Sicherheit und weniger Gefahren für den Programmierer. Im Grunde müssen wir jetzt nur noch den Button auf unsere GUI zeichnen:

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <AutoItObject.au3>
    #include <GDIPlus.au3>

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

    _AutoItObject_Startup()
    _GDIPlus_Startup()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $hGUI = GUICreate('', 220, 70)
    $oButton = __Class_Button().Object
    $oButton.handle = $hGUI
    $oButton.text = 'Button'
    $oButton.left = 10
    $oButton.top = 10
    $oButton.width = 200
    $oButton.height = 50
    GUISetState()

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

    While GUIGetMsg() <> -3
    $oButton.draw()
    WEnd

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $oButton = Null
    _GDIPlus_Shutdown()
    _AutoItObject_Shutdown()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func __Class_Button()
    Local $oClass = _AutoItObject_Class()
    ; PUBLIC
    $oClass.AddProperty('handle')
    $oClass.AddProperty('text')
    $oClass.AddProperty('left')
    $oClass.AddProperty('top')
    $oClass.AddProperty('width')
    $oClass.AddProperty('height')
    $oClass.AddProperty('func')
    $oClass.AddMethod('draw', '__Button_Draw')
    $oClass.AddDestructor('__Button_Destructor')
    ; PRIVATE
    $oClass.AddProperty('_call_', $ELSCOPE_PRIVATE) ; Für den ersten Aufruf der .draw() Methode
    $oClass.AddProperty('_graphic_', $ELSCOPE_PRIVATE) ; Handle zu dem Grafik Objekt von einem Fenster Handle
    $oClass.AddProperty('_bitmap_', $ELSCOPE_PRIVATE) ; Handle zu dem Bitmap in welches der Button gezeichnet wird
    $oClass.AddProperty('_image_', $ELSCOPE_PRIVATE) ; Grafikkontext des Bitmaps um in dieser zu zeichnen

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

    Return $oClass
    EndFunc

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

    Func __Button_Draw($oSelf)
    If Not $oSelf._call_ Then
    $oSelf._call_ = True
    $oSelf._graphic_ = _GDIPlus_GraphicsCreateFromHWND($oSelf.handle)
    $oSelf._bitmap_ = _GDIPlus_BitmapCreateFromScan0($oSelf.width, $oSelf.height)
    $oSelf._image_ = _GDIPlus_ImageGetGraphicsContext($oSelf._bitmap_)
    EndIf

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

    _GDIPlus_GraphicsClear($oSelf._image_, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawRect($oSelf._image_, 0, 0, $oSelf.width -1, $oSelf.height -1)
    _GDIPlus_GraphicsDrawString($oSelf._image_, $oSelf.text, 2, 2)
    _GDIPlus_GraphicsDrawImage($oSelf._graphic_, $oSelf._bitmap_, $oSelf.left, $oSelf.top)
    EndFunc

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

    Func __Button_Destructor($oSelf)
    _GDIPlus_GraphicsDispose($oSelf._image_)
    _GDIPlus_BitmapDispose($oSelf._bitmap_)
    _GDIPlus_GraphicsDispose($oSelf._graphic_)
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]

    Okey, ich gebe zu dass unser Button bis hier hin sehr bescheiden aussieht. Jedoch wird uns zumindest was in der GUI angezeigt, das ist doch schon mal was! Zwar ist es etwas unpraktisch dass wir noch die einzelnen Attribute selber setzen müssen (und das für jedes Objekt einzeln) aber darum kümmern wir uns später.


    Schritt 3 - Funktionalität:
    Noch kann unser Button nichts wenn man auf ihn klickt. Also fügen wir nun eine weitere Methode hinzu welche checkt ob der Button gedrückt ist. Wenn dieser tatsächlich gerade gedrückt ist, wird dann eine entsprechende Funktion aufgerufen. Unser Code erweitern wir also folgendermaßen:

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <AutoItObject.au3>
    #include <GDIPlus.au3>

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

    _AutoItObject_Startup()
    _GDIPlus_Startup()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $hGUI = GUICreate('', 220, 70)
    $oButton = __Class_Button().Object
    $oButton.handle = $hGUI
    $oButton.text = 'Button'
    $oButton.left = 10
    $oButton.top = 10
    $oButton.width = 200
    $oButton.height = 50
    $oButton.func = _Button_Click
    GUISetState()

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

    While GUIGetMsg() <> -3
    $oButton.draw()
    $oButton.click()
    WEnd

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $oButton = Null
    _GDIPlus_Shutdown()
    _AutoItObject_Shutdown()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func _Button_Click()
    MsgBox(0, 'CLICK', 'Button wurde gedrückt!', 0, $hGUI)
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func __Class_Button()
    Local $oClass = _AutoItObject_Class()
    ; PUBLIC
    $oClass.AddProperty('handle')
    $oClass.AddProperty('text')
    $oClass.AddProperty('left')
    $oClass.AddProperty('top')
    $oClass.AddProperty('width')
    $oClass.AddProperty('height')
    $oClass.AddProperty('func')
    $oClass.AddMethod('draw', '__Button_Draw')
    $oClass.AddMethod('click', '__Button_Click')
    $oClass.AddDestructor('__Button_Destructor')
    ; PRIVATE
    $oClass.AddProperty('_call_', $ELSCOPE_PRIVATE) ; Für den ersten Aufruf der .draw() Methode
    $oClass.AddProperty('_graphic_', $ELSCOPE_PRIVATE) ; Handle zu dem Grafik Objekt von einem Fenster Handle
    $oClass.AddProperty('_bitmap_', $ELSCOPE_PRIVATE) ; Handle zu dem Bitmap in welches der Button gezeichnet wird
    $oClass.AddProperty('_image_', $ELSCOPE_PRIVATE) ; Grafikkontext des Bitmaps um in dieser zu zeichnen

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

    Return $oClass
    EndFunc

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

    Func __Button_Draw($oSelf)
    If Not $oSelf._call_ Then
    $oSelf._call_ = True
    $oSelf._graphic_ = _GDIPlus_GraphicsCreateFromHWND($oSelf.handle)
    $oSelf._bitmap_ = _GDIPlus_BitmapCreateFromScan0($oSelf.width, $oSelf.height)
    $oSelf._image_ = _GDIPlus_ImageGetGraphicsContext($oSelf._bitmap_)
    EndIf

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

    _GDIPlus_GraphicsClear($oSelf._image_, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawRect($oSelf._image_, 0, 0, $oSelf.width -1, $oSelf.height -1)
    _GDIPlus_GraphicsDrawString($oSelf._image_, $oSelf.text, 2, 2)
    _GDIPlus_GraphicsDrawImage($oSelf._graphic_, $oSelf._bitmap_, $oSelf.left, $oSelf.top)
    EndFunc

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

    Func __Button_Click($oSelf)
    Local $aiCursor = GUIGetCursorInfo($oSelf.handle)
    Local $hFunc

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

    If $aiCursor[2] And $aiCursor[0] >= $oSelf.left And $aiCursor[0] <= $oSelf.left + $oSelf.width And $aiCursor[1] >= $oSelf.top And $aiCursor[1] <= $oSelf.top + $oSelf.height Then
    $hFunc = $oSelf.func
    If IsFunc($hFunc) Then $hFunc()
    EndIf
    EndFunc

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

    Func __Button_Destructor($oSelf)
    _GDIPlus_GraphicsDispose($oSelf._image_)
    _GDIPlus_BitmapDispose($oSelf._bitmap_)
    _GDIPlus_GraphicsDispose($oSelf._graphic_)
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]


    Schritt 4 – Optimierungen:
    Noch ist unser Button ziemlich unhandlich. Wir müssen alle Attribute per Hand setzen und dass ist nicht gerade so vorteilhaft. Zudem müssen wir uns auch manuell um das Zeichnen kümmern und auch für jedes Objekt nachprüfen ob der entsprechende Button gedrückt wurde. Jetzt machen wir aus unserem Objekt eine UDF. Wir nutzen einfach Prozedurale Programmierung um alle erstellten Buttons zu verwalten. Das spart Schreibaufwand beim Programmierer und vermindert mögliche Fehlerquellen die dieser praktizieren kann. Fangen wir einmal damit an, eine Funktion zu schreiben womit der Button auf einem Schlag erstellt wird. Im Grunde nehmen wir dem Programmierer damit die Arbeit ab, mehrere Zeilen für die Attribut-Definitionen zu verschwenden:

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <AutoItObject.au3>
    #include <GDIPlus.au3>

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

    _AutoItObject_Startup()
    _GDIPlus_Startup()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func _Button_Create($hGUI, $sText, $iLeft, $iTop, $iWidth, $iHeight, $hFunc)
    Local $oObject = __Class_Button().Object

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

    $oObject.handle = $hGUI
    $oObject.text = $sText
    $oObject.left = $iLeft
    $oObject.top = $iTop
    $oObject.width = $iWidth
    $oObject.height = $iHeight
    $oObject.func = $hFunc

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

    Return $oObject
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func __Class_Button()
    Local $oClass = _AutoItObject_Class()
    ; PUBLIC
    $oClass.AddProperty('handle')
    $oClass.AddProperty('text')
    $oClass.AddProperty('left')
    $oClass.AddProperty('top')
    $oClass.AddProperty('width')
    $oClass.AddProperty('height')
    $oClass.AddProperty('func')
    $oClass.AddMethod('draw', '__Button_Draw')
    $oClass.AddMethod('click', '__Button_Click')
    $oClass.AddDestructor('__Button_Destructor')
    ; PRIVATE
    $oClass.AddProperty('_call_', $ELSCOPE_PRIVATE) ; Für den ersten Aufruf der .draw() Methode
    $oClass.AddProperty('_graphic_', $ELSCOPE_PRIVATE) ; Handle zu dem Grafik Objekt von einem Fenster Handle
    $oClass.AddProperty('_bitmap_', $ELSCOPE_PRIVATE) ; Handle zu dem Bitmap in welches der Button gezeichnet wird
    $oClass.AddProperty('_image_', $ELSCOPE_PRIVATE) ; Grafikkontext des Bitmaps um in dieser zu zeichnen

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

    Return $oClass
    EndFunc

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

    Func __Button_Draw($oSelf)
    If Not $oSelf._call_ Then
    $oSelf._call_ = True
    $oSelf._graphic_ = _GDIPlus_GraphicsCreateFromHWND($oSelf.handle)
    $oSelf._bitmap_ = _GDIPlus_BitmapCreateFromScan0($oSelf.width, $oSelf.height)
    $oSelf._image_ = _GDIPlus_ImageGetGraphicsContext($oSelf._bitmap_)
    EndIf

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

    _GDIPlus_GraphicsClear($oSelf._image_, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawRect($oSelf._image_, 0, 0, $oSelf.width -1, $oSelf.height -1)
    _GDIPlus_GraphicsDrawString($oSelf._image_, $oSelf.text, 2, 2)
    _GDIPlus_GraphicsDrawImage($oSelf._graphic_, $oSelf._bitmap_, $oSelf.left, $oSelf.top)
    EndFunc

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

    Func __Button_Click($oSelf)
    Local $aiCursor = GUIGetCursorInfo($oSelf.handle)
    Local $hFunc

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

    If $aiCursor[2] And $aiCursor[0] >= $oSelf.left And $aiCursor[0] <= $oSelf.left + $oSelf.width And $aiCursor[1] >= $oSelf.top And $aiCursor[1] <= $oSelf.top + $oSelf.height Then
    $hFunc = $oSelf.func
    If IsFunc($hFunc) Then $hFunc()
    EndIf
    EndFunc

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

    Func __Button_Destructor($oSelf)
    _GDIPlus_GraphicsDispose($oSelf._image_)
    _GDIPlus_BitmapDispose($oSelf._bitmap_)
    _GDIPlus_GraphicsDispose($oSelf._graphic_)
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]

    Nun brauchen wir irgendein Mechanismus, der sich um alle Objekte verwaltet. Wir möchten ja schließlich alle Buttons mit nur einem einzigen Funktionsaufruf zeichnen. Und am besten sollen sich die Objekte gleich selber beim Programmende löschen:

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <AutoItObject.au3>
    #include <GDIPlus.au3>

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

    Global $__avButton[1] = [0]

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

    OnAutoItExitRegister('__Button_Exit')

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

    _AutoItObject_Startup()
    _GDIPlus_Startup()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func _Button_Create($hGUI, $sText, $iLeft, $iTop, $iWidth, $iHeight, $hFunc)
    ReDim $__avButton[$__avButton[0] +2]
    $__avButton[0] += 1
    $__avButton[$__avButton[0]] = __Class_Button().Object

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

    $__avButton[$__avButton[0]].handle = $hGUI
    $__avButton[$__avButton[0]].text = $sText
    $__avButton[$__avButton[0]].left = $iLeft
    $__avButton[$__avButton[0]].top = $iTop
    $__avButton[$__avButton[0]].width = $iWidth
    $__avButton[$__avButton[0]].height = $iHeight
    $__avButton[$__avButton[0]].func = $hFunc

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

    Return $__avButton[0]
    EndFunc

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

    Func _Button_Refresh()
    Local $i

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

    For $i = 1 To $__avButton[0]
    $__avButton[$i].draw()
    $__avButton[$i].click()
    Next
    EndFunc

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

    Func __Button_Exit()
    Local $i

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

    For $i = 1 To $__avButton[0]
    $__avButton[$i] = Null
    Next

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

    _GDIPlus_Shutdown()
    _AutoItObject_Shutdown()
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func __Class_Button()
    Local $oClass = _AutoItObject_Class()
    ; PUBLIC
    $oClass.AddProperty('handle')
    $oClass.AddProperty('text')
    $oClass.AddProperty('left')
    $oClass.AddProperty('top')
    $oClass.AddProperty('width')
    $oClass.AddProperty('height')
    $oClass.AddProperty('func')
    $oClass.AddMethod('draw', '__Button_Draw')
    $oClass.AddMethod('click', '__Button_Click')
    $oClass.AddDestructor('__Button_Destructor')
    ; PRIVATE
    $oClass.AddProperty('_call_', $ELSCOPE_PRIVATE) ; Für den ersten Aufruf der .draw() Methode
    $oClass.AddProperty('_graphic_', $ELSCOPE_PRIVATE) ; Handle zu dem Grafik Objekt von einem Fenster Handle
    $oClass.AddProperty('_bitmap_', $ELSCOPE_PRIVATE) ; Handle zu dem Bitmap in welches der Button gezeichnet wird
    $oClass.AddProperty('_image_', $ELSCOPE_PRIVATE) ; Grafikkontext des Bitmaps um in dieser zu zeichnen

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

    Return $oClass
    EndFunc

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

    Func __Button_Draw($oSelf)
    If Not $oSelf._call_ Then
    $oSelf._call_ = True
    $oSelf._graphic_ = _GDIPlus_GraphicsCreateFromHWND($oSelf.handle)
    $oSelf._bitmap_ = _GDIPlus_BitmapCreateFromScan0($oSelf.width, $oSelf.height)
    $oSelf._image_ = _GDIPlus_ImageGetGraphicsContext($oSelf._bitmap_)
    EndIf

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

    _GDIPlus_GraphicsClear($oSelf._image_, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawRect($oSelf._image_, 0, 0, $oSelf.width -1, $oSelf.height -1)
    _GDIPlus_GraphicsDrawString($oSelf._image_, $oSelf.text, 2, 2)
    _GDIPlus_GraphicsDrawImage($oSelf._graphic_, $oSelf._bitmap_, $oSelf.left, $oSelf.top)
    EndFunc

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

    Func __Button_Click($oSelf)
    Local $aiCursor = GUIGetCursorInfo($oSelf.handle)
    Local $hFunc

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

    If $aiCursor[2] And $aiCursor[0] >= $oSelf.left And $aiCursor[0] <= $oSelf.left + $oSelf.width And $aiCursor[1] >= $oSelf.top And $aiCursor[1] <= $oSelf.top + $oSelf.height Then
    $hFunc = $oSelf.func
    If IsFunc($hFunc) Then $hFunc()
    EndIf
    EndFunc

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

    Func __Button_Destructor($oSelf)
    _GDIPlus_GraphicsDispose($oSelf._image_)
    _GDIPlus_BitmapDispose($oSelf._bitmap_)
    _GDIPlus_GraphicsDispose($oSelf._graphic_)
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]

    Wie man sieht wurde hier der Mechanismus mit einem globalen Array umgesetzt. Die _Button_Create() Funktion gibt jetzt auch nicht mehr das eigentliche Objekt zurück, sondern nur den Index zu dem globalen Array wo das Objekt nun abgespeichert ist. Leider geht das nicht anders! Sobald zu dem Objekt eine Referenz erstellt wird, muss sowohl die Referenz als auch das eigentliche Objekt gelöscht werden, damit auch wirklich das Objekt zerstört wird.


    Abschluss Teil 2:
    Nun haben wir einen eigenen Pseudo Button wovon wir gleich mehrere in eine GUI packen können. Zudem können wir nachträglich auch die Attribute verändern um so Größe, Position, Text und Funktion zu verändern. Am besten spielt ihr doch selber ein wenig damit herum. Letztendlich haben wir mithilfe von OOP nun eine eigene kleine UDF gebastelt. Wen das Design zu langweilig ist, der kann das Objekt ja selbständig noch erweitern! Dies sollte lediglich ein kleines Beispiel sein für sinnvollen Einsatz von OOP. Zu guter Letzt noch ein Beispielcode mit mehren anklickbaren Buttons:

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #include <AutoItObject.au3>
    #include <GDIPlus.au3>

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

    Global $__avButton[1] = [0]

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

    OnAutoItExitRegister('__Button_Exit')

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

    _AutoItObject_Startup()
    _GDIPlus_Startup()

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    $hGUI = GUICreate('', 120, 100)
    $id1 = _Button_Create($hGUI, 'Button 1', 10, 10, 100, 20, _f1)
    $id2 = _Button_Create($hGUI, '~(^.(^.(^.^).^).^)~', 10, 40, 100, 20, _f2)
    $id3 = _Button_Create($hGUI, '', 10, 70, 100, 20, Null)
    GUISetState()

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

    While GUIGetMsg() <> -3
    _Button_Refresh()
    WEnd

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

    Func _f1()
    MsgBox(0, '', 'Button 1', 0, $hGUI)
    EndFunc

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

    Func _f2()
    Local $iX = $__avButton[$id2].left
    Local $iY = $__avButton[$id2].top

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

    $__avButton[$id2].left = $__avButton[$id3].left
    $__avButton[$id2].top = $__avButton[$id3].top
    $__avButton[$id3].left = $iX
    $__avButton[$id3].top = $iY
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func _Button_Create($hGUI, $sText, $iLeft, $iTop, $iWidth, $iHeight, $hFunc)
    ReDim $__avButton[$__avButton[0] +2]
    $__avButton[0] += 1
    $__avButton[$__avButton[0]] = __Class_Button().Object

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

    $__avButton[$__avButton[0]].handle = $hGUI
    $__avButton[$__avButton[0]].text = $sText
    $__avButton[$__avButton[0]].left = $iLeft
    $__avButton[$__avButton[0]].top = $iTop
    $__avButton[$__avButton[0]].width = $iWidth
    $__avButton[$__avButton[0]].height = $iHeight
    $__avButton[$__avButton[0]].func = $hFunc

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

    Return $__avButton[0]
    EndFunc

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

    Func _Button_Refresh()
    Local $i

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

    For $i = 1 To $__avButton[0]
    $__avButton[$i].draw()
    $__avButton[$i].click()
    Next
    EndFunc

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

    Func __Button_Exit()
    Local $i

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

    For $i = 1 To $__avButton[0]
    $__avButton[$i] = Null
    Next

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

    _GDIPlus_Shutdown()
    _AutoItObject_Shutdown()
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func __Class_Button()
    Local $oClass = _AutoItObject_Class()
    ; PUBLIC
    $oClass.AddProperty('handle')
    $oClass.AddProperty('text')
    $oClass.AddProperty('left')
    $oClass.AddProperty('top')
    $oClass.AddProperty('width')
    $oClass.AddProperty('height')
    $oClass.AddProperty('func')
    $oClass.AddMethod('draw', '__Button_Draw')
    $oClass.AddMethod('click', '__Button_Click')
    $oClass.AddDestructor('__Button_Destructor')
    ; PRIVATE
    $oClass.AddProperty('_call_', $ELSCOPE_PRIVATE) ; Für den ersten Aufruf der .draw() Methode
    $oClass.AddProperty('_graphic_', $ELSCOPE_PRIVATE) ; Handle zu dem Grafik Objekt von einem Fenster Handle
    $oClass.AddProperty('_bitmap_', $ELSCOPE_PRIVATE) ; Handle zu dem Bitmap in welches der Button gezeichnet wird
    $oClass.AddProperty('_image_', $ELSCOPE_PRIVATE) ; Grafikkontext des Bitmaps um in dieser zu zeichnen

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

    Return $oClass
    EndFunc

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

    Func __Button_Draw($oSelf)
    If Not $oSelf._call_ Then
    $oSelf._call_ = True
    $oSelf._graphic_ = _GDIPlus_GraphicsCreateFromHWND($oSelf.handle)
    $oSelf._bitmap_ = _GDIPlus_BitmapCreateFromScan0($oSelf.width, $oSelf.height)
    $oSelf._image_ = _GDIPlus_ImageGetGraphicsContext($oSelf._bitmap_)
    EndIf

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

    _GDIPlus_GraphicsClear($oSelf._image_, 0xFFFFFFFF)
    _GDIPlus_GraphicsDrawRect($oSelf._image_, 0, 0, $oSelf.width -1, $oSelf.height -1)
    _GDIPlus_GraphicsDrawString($oSelf._image_, $oSelf.text, 2, 2)
    _GDIPlus_GraphicsDrawImage($oSelf._graphic_, $oSelf._bitmap_, $oSelf.left, $oSelf.top)
    EndFunc

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

    Func __Button_Click($oSelf)
    Local $aiCursor = GUIGetCursorInfo($oSelf.handle)
    Local $hFunc

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

    If $aiCursor[2] And $aiCursor[0] >= $oSelf.left And $aiCursor[0] <= $oSelf.left + $oSelf.width And $aiCursor[1] >= $oSelf.top And $aiCursor[1] <= $oSelf.top + $oSelf.height Then
    $hFunc = $oSelf.func
    If IsFunc($hFunc) Then $hFunc()
    EndIf
    EndFunc

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

    Func __Button_Destructor($oSelf)
    _GDIPlus_GraphicsDispose($oSelf._image_)
    _GDIPlus_BitmapDispose($oSelf._bitmap_)
    _GDIPlus_GraphicsDispose($oSelf._graphic_)
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]

    Wie immer sind Fragen, Kritik und Anregungen erwünscht! Weitere Teile folgen... :)

  • Combo Control, jedes Item mit eigene Schriftart belegen

    • Yjuq
    • 4. Dezember 2014 um 19:48

    Abend :)
    Wie der Titel schon verrät würde ich gerne jedes Item in einem Combo Control eine eigene Schriftart und Schriftgröße zuteilen. Habe via Google noch keinen Ansatz dazu gefunden. Mit GUICtrlSetFont() kann ich leider nur dem Gesamten Control eine einzige Schriftart zuweisen. Hat da jemand eine Idee oder gleich eine Lösung für mich? Möglichst ohne gleich das ganze Control nochmal selbst schreiben zu müssen.

    LG. Make :)

  • Multiplikation von mathematischen Variablen -> 2x*3x = 6x^2

    • Yjuq
    • 2. Dezember 2014 um 17:25

    AutoIt kann das an sich nicht, da musst dir selber die nötigen Prozeduren schreiben. Siehe Stichwort CAS: http://de.m.wikipedia.org/wiki/Computeralgebrasystem

    Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2

  • "Tree"-Variable

    • Yjuq
    • 1. Dezember 2014 um 15:56

    Korrekt, wie du sicherlich weißt gibt es Beschränkungen bei Variablenbezeichnungen. Die gleichen Beschränkungen gelten auch für Attribute in einem Objekt. Ist so und kann man auch nichts dran machen. Aber eigentlich sollte eine Suche ja nicht über die Bezeichner erfolgen sondern über deren Inhalt. Wäre ja auch total unsinnig. Du kannst den Baum ja auch erweitern sodass direkt in der Wurzel sämtliche Pfade als extra Attribut hinterlegt werden (+ deren Schlüssel im Objekt). So kannst du dann trotzdem Dateien suchen und hast dennoch eine Baumstruktur durch die Objekte. Aber man sollte sich vorab natürlich immer fragen in wie fern das eigene Vorhaben Sinn macht und ob man nun unbedingt bestimmte Dinge benötigt. Wenn es dir halt nur um das Suchen von Dateien geht, würde ich einfach alle Pfade in ein String schreiben und komplett auf die Baumstruktur verzichten.

  • Tutorial – OOP in AutoIt

    • Yjuq
    • 29. November 2014 um 21:48

    Nein, sorry ^^
    Ist auch nicht geplant.
    Habe zwar das Tutorial komplett als Textdatei vorliegen,jedoch mit den BB-Codes für die Formatierungen. Jedoch schreibe ich gerade an einem BB-Code Viewer da es sehr lange dauert (bei meiner Inet-Verbindung) hier im Forum bis die Vorschau angezeigt wird. Ggf. kann ich da noch eine Speicherfunktion später einbauen sodass ich die Tutorials (also auch noch die, die kommen werden) als HTML Dateien hochladen kann. Bis dahin dauerts aber noch. :)

    Gesendet von meinem HTC Desire HD A9191 mit Tapatalk 2

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™