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. eukalyptus

Beiträge von eukalyptus

  • Beste Programmiersprache um DLLs zu erstellen

    • eukalyptus
    • 20. August 2012 um 06:08
    Code
    Extern "Windows-MS"
    
    
    Function _Add(iX As Integer, iY As Integer)As Integer Export
    	Return iX + iY	
    End Function
    
    
    End Extern
    [autoit]

    $hDll = DllOpen("Add.dll")
    $aResult = DllCall($hDll, "int", "_Add", "int", 1234, "int", 1234)
    ConsoleWrite("Ergebnis = " & $aResult[0] & @CRLF)

    [/autoit]

    Ohne Extern "Windows-MS" müsste man den DllCall so machen: _ADD@8
    Oder in deinem Fall ADDIEREN@8

    E

  • Particle Demo - Mit freebasic dll und farbverlauf und der QuickDraw lib von Moritz

    • eukalyptus
    • 13. August 2012 um 09:00

    Wie name22 schon sagte:

    DllStructCreate und den Pointer übergeben:

    Spoiler anzeigen
    [autoit]

    $hDll = DllOpen(@ScriptDir & "\Test.dll")

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

    $tTestStruct = DllStructCreate("int iInteger; char sString[64]; float fFloat; double fDouble;")

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

    DllCall($hDll, "none", "_Test", "ptr", DllStructGetPtr($tTestStruct))
    DllClose($hDll)

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

    ConsoleWrite("! Integer: " & DllStructGetData($tTestStruct, "iInteger") & @CRLF)
    ConsoleWrite("! String: " & DllStructGetData($tTestStruct, "sString") & @CRLF)
    ConsoleWrite("! Single: " & DllStructGetData($tTestStruct, "fFloat") & @CRLF)
    ConsoleWrite("! Double: " & DllStructGetData($tTestStruct, "fDouble") & @CRLF)

    [/autoit]


    Die Dll sieht dann so aus:

    Spoiler anzeigen
    Code
    Type t_TestStruct
    	iInteger As Integer
    	sString As ZString * 64
    	fFloat As Single
    	fDouble As Double
    End Type
    
    
    Extern "Windows-MS"
    
    
    Sub _Test(ByVal pTest As t_TestStruct Ptr) Export
    	pTest->iInteger = 1234
    	pTest->sString = "1234"
    	pTest->fFloat = 1234.1234
    	pTest->fDouble = 1234.1234
    End Sub
    
    
    End Extern
    Alles anzeigen

    Übrigens: Extern "Windows-MS" erleichtert das Aufrufen der Funktionen sehr.

    E

  • Aufzeichnen -> TCP -> Abspielen (BassUDF)

    • eukalyptus
    • 9. August 2012 um 11:02

    Eine neuere Lame Version hilft: http://sourceforge.net/tracker/index.php?func=detail&aid=1588283&group_id=290&atid=350290
    Der Parameter "--flush" bewirkt, dass die Mp3-Daten sofort ausgegeben werden.
    Evtl. muss der Parameter "-X" weggelassen werden!

    Dann kannst du mit den Werten etwas experimentieren.
    z.B. Sleep(10) statt Sleep(50)
    If $hStream And $iSize > 0 Then _BASS_EXT_StreamPutFileBufferData($hStream, $aBuffer, $iSize)
    usw...

    Um den Filestream überhaupt zu erzeugen benötigt Bass.dll allerdings eine gewisse Mindestmenge an Mp3-Daten.
    Der Wert in Zeile 34 darf also nicht zu niedrig sein...

    Natürlich kannst du auch die rohen PCM-Daten verschicken
    Das geht dann in etwa so:

    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_UseX64=n
    #include "Bass.au3"
    #include "BassExt.au3"

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

    If Not FileExists(@ScriptDir & "\TCP_RECEIVE.exe") Then
    MsgBox(0, "ERROR", @ScriptDir & "\TCP_RECEIVE.exe not found" & @CRLF & "please compile TCP_RECEIVE.au3 first")
    Exit
    EndIf

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

    $sIPADDRESS = "127.0.0.1"
    $iPORT = 1234

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

    OnAutoItExitRegister("_FreeBass")

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

    HotKeySet("{ESC}", "_Exit")

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

    _BASS_Startup()
    _BASS_EXT_STARTUP()

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

    _BASS_SetConfig($BASS_CONFIG_REC_BUFFER, 1000)

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

    _BASS_RecordInit(-1)
    $aBuffer = _BASS_EXT_MemoryBufferCreate()
    $hRecord = _BASS_RecordStart(44100, 2, 0, $BASS_EXT_RecordProc, $aBuffer[0])

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

    TCPStartup()
    $iSocket = TCPListen($sIPADDRESS, $iPORT)

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

    $iPid = Run('"' & @ScriptDir & '\TCP_RECEIVE.exe"')

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

    $iAcceptSocket = -1
    While 1
    If $iAcceptSocket = -1 Then
    $iAcceptSocket = TCPAccept($iSocket)
    $iSize = _BASS_EXT_MemoryBufferGetSize($aBuffer)
    _BASS_EXT_MemoryBufferGetData($aBuffer, $iSize) ; while not connected -> empty buffer
    ContinueLoop
    EndIf

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

    $iSize = _BASS_EXT_MemoryBufferGetSize($aBuffer)
    If $iSize Then
    $bMp3Data = _BASS_EXT_MemoryBufferGetData($aBuffer, $iSize)
    $iSent = TCPSend($iAcceptSocket, $bMp3Data)
    ConsoleWrite("Bytes: " & BinaryLen($bMp3Data) & " / gesendet: " & $iSent & @CRLF)
    EndIf

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

    Sleep(10)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func _FreeBass()
    ProcessClose($iPid)
    TCPCloseSocket($iAcceptSocket)
    TCPShutdown()
    _BASS_RecordFree()
    _BASS_Free()
    EndFunc ;==>_FreeBass

    [/autoit]
    Spoiler anzeigen
    [autoit]

    #AutoIt3Wrapper_UseX64=n
    #include "Bass.au3"
    #include "BassExt.au3"

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

    $sIPADDRESS = "127.0.0.1"
    $iPORT = 1234

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

    OnAutoItExitRegister("_FreeBass")

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

    _BASS_Startup()
    _BASS_EXT_STARTUP()

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

    _BASS_SetConfig($BASS_CONFIG_UPDATEPERIOD, 80)
    _BASS_SetConfig($BASS_CONFIG_BUFFER, 100)

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

    _BASS_Init(0, -1, 44100, 0, "")

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

    $aBuffer = _BASS_EXT_MemoryBufferCreate()

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

    TCPStartup()
    $ConnectedSocket = TCPConnect($sIPADDRESS, $iPORT)
    If $ConnectedSocket = -1 Then
    MsgBox(0, "", @error)
    Exit
    EndIf

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

    $hStream = _BASS_StreamCreate(44100, 2, 0, $STREAMPROC_PUSH, 0)
    _BASS_ChannelPlay($hStream, 1)

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

    While 1

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

    $bMp3Data = TCPRecv($ConnectedSocket, 88200)
    If BinaryLen($bMp3Data) > 0 Then _BASS_EXT_MemoryBufferAddData($aBuffer, $bMp3Data)

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

    $iSize = _BASS_EXT_MemoryBufferGetSize($aBuffer)
    ToolTip("TCP_REICIVE Buffer size: " & $iSize)
    If $hStream And $iSize > 0 Then _BASS_EXT_StreamPutBufferData($hStream, $aBuffer, $iSize)

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

    Sleep(10)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func _FreeBass()
    TCPCloseSocket($ConnectedSocket)
    TCPShutdown()
    _BASS_Free()
    EndFunc ;==>_FreeBass

    [/autoit]

    Die Werte für den Playbackbuffer sind schon fast zu niedrig bei mir.
    Am besten du probierst es auch mal mit BassASIO: _BASS_ASIO_ChannelEnable(True, 0, $BASS_EXT_AsioProc, $aBuffer[0])

    E

  • Aufzeichnen -> TCP -> Abspielen (BassUDF)

    • eukalyptus
    • 8. August 2012 um 22:02

    Nach ein paar Tests glaub ich, dass es an lame.exe bzw dem StdOut-Buffer liegt!
    Der Encoder gibt die Mp3-Daten nur in 4096-Byte Blöcken heraus!
    Wie man das ändert hab ich noch nicht rausgefunden...

    E

  • Videolänge herausfinden

    • eukalyptus
    • 7. August 2012 um 21:37

    Hier noch mein Script von damals: Videovorschau-Bild

  • StringRegExp() Hilfe

    • eukalyptus
    • 7. August 2012 um 19:34

    Falls du nur das "Hallo" benötigst, dann so:

    [autoit]

    $aRegExp = StringRegExp($text, "\{([^{}]*)\}", 3)
    _ArrayDisplay($aRegExp)

    [/autoit]
  • Aufzeichnen -> TCP -> Abspielen (BassUDF)

    • eukalyptus
    • 7. August 2012 um 18:40

    Um Zeit bei der Recording Funktion zu sparen, kannst du die Größe des RecordingBuffers verkleinern via _Bass_SetConfig.
    Am schnellsten ist Recording via BassASIO.dll

    Aber der Knackpunkt ist glaub ich TCP_Send.
    Kann man da nicht auch die Buffergröße verkleinern, oder sonst die Übertragungsgeschwindigkeit erhöhen?!?...

    E

  • Videolänge herausfinden

    • eukalyptus
    • 7. August 2012 um 18:36

    Hier: [ offen ] Attribute einer Videodatei auslesen

    E

  • GDI Plus Array

    • eukalyptus
    • 2. August 2012 um 11:19

    Natürlich kann man das in GDI+ machen.
    Ich würde das Programm allerdings etwas anders anpacken - ich kann am Nachmittag evtl. was basteln...

    Sind die Texte "vorgefertigt" oder soll man einen beliebigen Text mit frei wählbaren Schriftarten und Farben eingeben können?

    lgE

  • Error "undeclared variable", jedoch nur auf manchen PCs

    • eukalyptus
    • 30. Juli 2012 um 23:46

    Mit diesem Script werden alle Includes eingefügt und das Script so bearbeitet, dass es dem compilierten Script entsprechen sollte.

    So sollte sich der Fehler anhand der Zeilennummer schonmal eingrenzen lassen...

    Spoiler anzeigen
    [autoit]

    _Include(@ScriptDir & "\Script.au3")

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

    Func _Include($sScriptFile, $bUseBetaIncludes = False)
    Local $sScript = ""
    Local $aIncludesDir = _GetIncludesDir($sScriptFile, $bUseBetaIncludes)
    _InsertIncludeFile($sScriptFile, $sScript, $aIncludesDir) ; Rekursives Einfügen

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

    $sScript = StringRegExpReplace($sScript, "(?i)\s*#include-once.*", "") ;#include-once entfernen

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

    $sScript = StringRegExpReplace($sScript, "(?m)^\h+", "")
    $sScript = StringRegExpReplace($sScript, "\v+\v", @CRLF)
    $sScript = StringRegExpReplace($sScript, "\A\s*", "")

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

    $sScript = StringRegExpReplace($sScript, '\b\s*_\s*\n\s*', " ") ; geteilte Zeilen zusammenfügen

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

    Local $hFile = FileOpen(StringTrimRight($sScriptFile, 4) & "_incLUDER.au3", 2)
    FileWrite($hFile, $sScript)
    FileClose($hFile)
    EndFunc ;==>_Include

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

    Func _InsertIncludeFile($sIncludeFile, ByRef $sScript, $aIncludesDir, $sIncluded = '')
    Local $aScript, $sFile, $aTemp, $aInclude
    $sFile = FileRead($sIncludeFile)
    If @error Then Return SetError(1, 0, $sIncluded)
    _RemoveComments($sFile)
    If StringInStr($sFile, "#include-once") And StringInStr($sIncluded, $sIncludeFile) Then ; wurde bereits eingefügt
    Return SetError(1, 0, $sIncluded)
    EndIf
    $aInclude = StringRegExp(@CRLF & $sFile, "(?i)(?:[\r\n]\h*)(\#include\h+.+)", 3)
    $aTemp = StringRegExpReplace(@CRLF & $sFile, "(?i)[\r\n]\h*\#include\h+.+", Chr(2))
    $aScript = StringSplit($aTemp, Chr(2))
    $sIncluded &= $sIncludeFile & ";"
    If Not IsArray($aScript) Or Not IsArray($aInclude) Or UBound($aInclude) <> $aScript[0] - 1 Then
    $sScript &= $sFile
    Return SetError(1, 0, $sIncluded)
    EndIf
    For $i = 1 To $aScript[0] - 1
    $sScript &= $aScript[$i]
    $sIncluded = _InsertIncludeFile(_GetIncludeFile($aInclude[$i - 1], $sIncludeFile, $aIncludesDir), $sScript, $aIncludesDir, $sIncluded)
    Next
    $sScript &= $aScript[$aScript[0]]
    Return $sIncluded
    EndFunc ;==>_InsertIncludeFile

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

    Func _RemoveComments(ByRef $sScript)
    $sScript = StringRegExpReplace($sScript, '(?x)(?:\r?\n?\s*;.*)|' & '((?>"[^"]*")+|' & "(?>'[^']*')+)", "\1") ;entferne ;-Komments
    $sScript = StringRegExpReplace($sScript, '(?i)(?:[\r\n]\s*)(\#ce|\#comments-end)(.*)', '$1') ;manche #ce haben noch Text dahinter
    $sScript = StringRegExpReplace($sScript, '(?x)(?:\r?\n?\s*;.*)|(?s)\r?\n?\s*\#c(?>s|omments-start)(?>(?>"[^"]*")+|' & "(?>'[^']*')+|.)*?\#c(?>e|omments-end)(?-s)|" & '((?>"[^"]*")+|' & "(?>'[^']*')+)", "\1")
    EndFunc ;==>_RemoveComments

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

    Func _GetIncludeFile($sLine, $sLastFile, $aIncludesDir)
    Local $Temp, $sFilename, $sCurrentDir = StringLeft($sLastFile, StringInStr($sLastFile, "\", 0, -1))
    $Temp = StringRegExpReplace($sLine, "(?i)(.*#include\h+)([\<'" & '"].+[\>"' & "'])(.*)", "\2")
    $sFilename = StringStripWS(StringTrimRight(StringTrimLeft($Temp, 1), 1), 3)
    $Temp = StringLeft($Temp, 1)
    Switch $Temp
    Case "'", '"' ; Script, User, Standart
    If FileExists($sCurrentDir & $sFilename) Then Return $sCurrentDir & $sFilename
    For $i = 3 To $aIncludesDir[0]
    If FileExists($aIncludesDir[$i] & "\" & $sFilename) Then Return $aIncludesDir[$i] & "\" & $sFilename
    Next
    If FileExists($aIncludesDir[2] & "\" & $sFilename) Then Return $aIncludesDir[2] & "\" & $sFilename
    Case Else ; Standart, User, Script
    If FileExists($aIncludesDir[2] & "\" & $sFilename) Then Return $aIncludesDir[2] & "\" & $sFilename
    For $i = 3 To $aIncludesDir[0]
    If FileExists($aIncludesDir[$i] & "\" & $sFilename) Then Return $aIncludesDir[$i] & "\" & $sFilename
    Next
    If FileExists($sCurrentDir & $sFilename) Then Return $sCurrentDir & $sFilename
    EndSwitch
    Return $aIncludesDir[1] & "\" & $sFilename
    EndFunc ;==>_GetIncludeFile

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

    Func _GetIncludesDir($sFilename, $bUseBetaIncludes = False)
    Local $aReturn[3], $Temp, $iCnt = 3
    $aReturn[0] = 2
    $aReturn[1] = StringLeft($sFilename, StringInStr($sFilename, "\", 0, -1) - 1)
    Switch $bUseBetaIncludes
    Case 1
    $aReturn[2] = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", 'betaInstallDir')
    If @error Or $aReturn[2] = "" Then $aReturn[2] = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\AutoIt v3\AutoIt', 'betaInstallDir')
    If $aReturn[2] = "" Then
    ConsoleWrite("!ERROR no beta found - continue using standard includes" & @CRLF)
    $bUseBetaIncludes = False
    ContinueCase
    EndIf
    Case Else
    $aReturn[2] = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "InstallDir")
    If @error Or $aReturn[2] = "" Then $aReturn[2] = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\AutoIt v3\AutoIt', 'InstallDir')
    EndSwitch
    If $aReturn[2] <> "" Then $aReturn[2] &= "\include"
    $Temp = RegRead("HKEY_CURRENT_USER\Software\AutoIt v3\AutoIt", "Include")
    If @error Or StringStripWS($Temp, 8) = "" Then Return $aReturn
    Switch StringInStr($Temp, ";")
    Case False
    ReDim $aReturn[4]
    $aReturn[0] = 3
    $aReturn[3] = $Temp
    Case Else
    $Temp = StringSplit($Temp, ";")
    If @error Or Not IsArray($Temp) Then Return $aReturn
    For $i = 1 To $Temp[0]
    ReDim $aReturn[$iCnt + 1]
    $aReturn[$iCnt] = $Temp[$i]
    $aReturn[0] = $iCnt
    $iCnt += 1
    Next
    EndSwitch
    Return $aReturn
    EndFunc ;==>_GetIncludesDir

    [/autoit]

    E

  • GDI+ Spielerei: Rolle aus Rechtecken

    • eukalyptus
    • 30. Juli 2012 um 11:03
    Zitat von Marsi

    Der Puffer wird in WM_PAINT genutzt. (bestimmt übersehen)


    Jo, entschuldigung! War natürlich mein Fehler :whistling:

    Zitat von Marsi

    Die Funktionen für GDI+ die Float Angaben vertragen hielt ich immer für eine Legende^^
    Habe die auch irgendwann schonmal ausprobiert, aber ohne Erfolg.
    Edit: Aaaaah es liegt am Smoothing Mode ! Ohne Smoothing, keine Float Angaben.

    Fast alle GDI+ Graphics-Funktionen gibt es in der Int und Float Version.
    Die Int-Versionen haben ein großes i am Ende: GdipFillRectangleI
    Bei Smoothingmode 0 verhalten sich die Float-Funktionen fast so, wie die Int´s; allerdings mit einem feinen Unterschied:
    Float: Nachkommastellen werden abgeschnitten (3.7 = 3)
    Int: Wird normal gerundet (3.7 = 4)

    E

  • GDI+ Spielerei: Rolle aus Rechtecken

    • eukalyptus
    • 29. Juli 2012 um 09:18

    Sehr cooles Script! :thumbup:

    Allerdings ein kleiner Kritikpunkt: Du erstellst zwar einen Backbuffer, verwendest diesen aber nicht ;)

    Wenn du dann noch _GDIPlus_GraphicsSetSmoothingMode und GdipFillRectangle verwendest, dann ist die Bewegung smoother...

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>

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

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

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

    Global Const $iFrameRate = 45

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

    Global Const $iHoehe = 480, $iBreite = Int($iHoehe * 4 / 3)
    Global $hGUI, $hBUF, $hBMP, $hGFX, $hBRU, $fLast, $iFPS = 0, $iTimer

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

    $hGUI = GUICreate('Beispiel:', $iBreite, $iHoehe)
    GUISetBkColor(0x000000, $hGUI)

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

    _GDIPlus_Startup()

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

    $hGFX = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBMP = _GDIPlus_BitmapCreateFromGraphics($iBreite, $iHoehe, $hGFX)
    $hBUF = _GDIPlus_ImageGetGraphicsContext($hBMP)
    $hBRU = _GDIPlus_BrushCreateSolid()
    _GDIPlus_GraphicsSetSmoothingMode($hBUF, 2)

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

    _GDIPlus_GraphicsClear($hBUF, 0xFF000000)
    WM_PAINT()

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

    OnAutoItExitRegister('_Freigeben')
    GUIRegisterMsg(0xF, 'WM_PAINT')
    GUISetOnEvent(-3, '_Exit', $hGUI)
    GUISetState(@SW_SHOW, $hGUI)

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

    $iTimer = TimerInit()

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

    While True
    _GDIPlus_GraphicsClear($hBUF, 0xFF000000)
    _Main()
    _GDIPlus_GraphicsDrawImage($hGFX, $hBMP, 0, 0)
    WM_PAINT()
    WEnd

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

    Func _Main()
    Local Static $iCounter = 0, $aARGB1[4] = [255, 255, 0, 0], $aARGB2[4] = [100, 0, 255, 0], $aARGB3[4] = [255, 0, 0, 255], $aARGB4[4] = [150, 0, 255, 255]
    _Rolle($hBUF, 5, 25, 25, $iBreite / 2 - 50, $iHoehe / 2 - 50, 20, $aARGB1, $iCounter, False)
    _Rolle($hBUF, 35, 25 + $iBreite / 2, 25, $iBreite / 2 - 50, $iHoehe / 2 - 50, 10, $aARGB2, $iCounter, False)
    _Rolle($hBUF, 25, 25, 25 + $iHoehe / 2, $iBreite / 2 - 50, $iHoehe / 2 - 50, 10, $aARGB3, $iCounter, True)
    _Rolle($hBUF, 25, 25 + $iBreite / 2, 25 + $iHoehe / 2, $iBreite / 2 - 50, $iHoehe / 2 - 50, 5, $aARGB4, $iCounter, True)
    $iCounter += 1
    If $iCounter = 360 Then $iCounter = 0
    EndFunc ;==>_Main

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

    Func _Rolle($hGFX, $iAnz, $iX, $iY, $iB, $iH, $iElementH, $aARGB, $iCounter, $iAlpha = False)
    Local $iT = $iH, $_Y[$iAnz], $_T[$iAnz], $_C[$iAnz], $iTMP_1, $iTMP_2
    For $i = 0 To $iAnz - 1 Step 1
    $_Y[$i] = $iH / 2 + _Sin($iCounter + (360 / $iAnz) * $i) * ($iH / 2 - $iElementH / 2) + $iY
    $_T[$i] = (2.5 + (-_Sin($iCounter + (360 / $iAnz) * $i + 90)) / 2) / 3
    Next
    For $x = 0 To $iAnz - 1 Step 1
    $iTMP_1 = 0
    $iTMP_2 = $_T[0]
    For $i = 1 To $iAnz - 1 Step 1
    If $iTMP_2 > $_T[$i] Then
    $iTMP_2 = $_T[$i]
    $iTMP_1 = $i
    EndIf
    Next
    _Balken($hGFX, $iX, $_Y[$iTMP_1], $iB, $iElementH, $_T[$iTMP_1], $aARGB, $iAlpha)
    $_T[$iTMP_1] = 10
    Next
    EndFunc ;==>_Rolle

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

    Func _Balken($hGFX, $iX, $iY, $iB, $iH, $iT, $aARGB, $iAlpha)
    Local $iTMP_1 = $iT ^ 3
    If $iAlpha Then
    _GDIPlus_BrushSetSolidColor($hBRU, '0x' & Hex(Int($aARGB[0] * $iTMP_1), 2) & Hex(Int($aARGB[1] * $iTMP_1), 2) & Hex(Int($aARGB[2] * $iTMP_1), 2) & Hex(Int($aARGB[3] * $iTMP_1), 2))
    Else
    _GDIPlus_BrushSetSolidColor($hBRU, '0x' & Hex(Int($aARGB[0]), 2) & Hex(Int($aARGB[1] * $iTMP_1), 2) & Hex(Int($aARGB[2] * $iTMP_1), 2) & Hex(Int($aARGB[3] * $iTMP_1), 2))
    EndIf
    ;_GDIPlus_GraphicsFillRect($hGFX, $iX + $iB / 2 - ($iB * $iT) / 2, $iY - ($iH * $iT) / 2, $iB * $iT, $iH * $iT, $hBRU)
    DllCall($ghGDIPDll, "int", "GdipFillRectangle", "handle", $hBUF, "handle", $hBRU, "float", $iX + $iB / 2 - ($iB * $iT) / 2, "float", $iY - ($iH * $iT) / 2, "float", $iB * $iT, "float", $iH * $iT)
    $iY += $iH
    EndFunc ;==>_Balken

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

    Func _Sin($a)
    Return Sin($a * 0.0174532925199433)
    EndFunc ;==>_Sin

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func _Freigeben()
    _GDIPlus_BrushDispose($hBRU)
    _GDIPlus_GraphicsDispose($hBUF)
    _GDIPlus_BitmapDispose($hBMP)
    _GDIPlus_GraphicsDispose($hGFX)
    _GDIPlus_Shutdown()
    EndFunc ;==>_Freigeben

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

    Func WM_PAINT()
    _GDIPlus_GraphicsDrawImage($hGFX, $hBMP, 0, 0)
    $fLast += _FPS($iFrameRate)
    $iFPS += 1
    If TimerDiff($iTimer) > 1000 Then
    WinSetTitle($hGUI, '', 'FPS: ' & $iFPS & ' | Auslastung: ' & Round($fLast / $iFPS, 2) * 100 & '%')
    $iFPS = 0
    $fLast = 0
    $iTimer = TimerInit()
    EndIf
    EndFunc ;==>WM_PAINT

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

    Func _FPS($i)
    Local Static $_T = TimerInit(), $f
    Local $s = TimerDiff($_T), $l = (1000 / $i - $s)
    $f += $l
    If $f < 0 Then $f = 0
    If $l < 0 Then $l = 0
    Sleep(Int($f / 10) * 10)
    $f -= Int($f / 10) * 10
    $_T = TimerInit()
    Return $s / ($s + $l)
    EndFunc ;==>_FPS

    [/autoit]

    E

  • MusicMaker

    • eukalyptus
    • 22. Juli 2012 um 20:49

    Das ist lustig und faszinierend zugleich :thumbup:
    Hat mir schon ein breites Grinsen auf mein Gesicht gezaubert!

    Falls du das wirklich mit Bass.dll machen möchtest, dann könnte dir das hier evtl. weiterhelfen: The Simple Piano Simulator

    E

  • Gdiplus und Icons

    • eukalyptus
    • 14. Juli 2012 um 00:53

    Hmm... Warum hab ich das damals eigentlich so kompliziert gemacht?!

    Das hier ist eine wesentlich elegantere Methode:

    Spoiler anzeigen
    [autoit]

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

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

    Opt("GUIOnEventMode", 1)

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

    _GDIPlus_Startup()

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

    Global $iWidth = 300
    Global $iHeight = 200

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

    Global $hGui = GUICreate("Test", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetState()

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

    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFFABCDEF)

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

    Global $hBmpIcon1 = _Load_GdiPlus_Icon("Shell32.dll", 4, 32, 32)
    Global $hBmpIcon2 = _Load_GdiPlus_Icon("Explorer.exe", 0, 128, 128)

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

    _Draw()

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUIRegisterMsg($WM_ERASEBKGND, "WM_PAINT")

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

    While 1
    Sleep(10)
    WEnd

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

    Func _Load_GdiPlus_Icon($sFile, $iIndex, $iW = 32, $iH = 32)
    Local $aResult = DllCall("shell32.dll", "int", "SHExtractIconsW", "wstr", $sFile, "int", $iIndex, "int", $iW, "int", $iH, "ptr*", 0, "ptr*", 0, "int", 1, "int", 0)
    If @error Then Return SetError(1, 1, False)
    If Not $aResult[5] Then Return SetError(1, 2, False)
    Local $hIcon = $aResult[5]

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW, "int", $iH, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    If @error Then Return SetError(1, 3, False)
    Local $hBitmap = $aResult[6]

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

    Local $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetDC", "ptr", $hContext, "hwnd*", 0)
    If @error Then Return SetError(1, 4, False)
    Local $hDC = $aResult[2]

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

    _WinAPI_DrawIconEx($hDC, 0, 0, $hIcon, $iW, $iH)

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

    DllCall($ghGDIPDll, "uint", "GdipReleaseDC", "ptr", $hContext, "hwnd", $hDC)
    _GDIPlus_GraphicsDispose($hContext)
    _WinAPI_DestroyIcon($hIcon)

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

    Return $hBitmap
    EndFunc ;==>_Load_GdiPlus_Icon

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

    Func _Draw()
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF440000)

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

    _GDIPlus_GraphicsDrawImage($hGfxBuffer, $hBmpIcon1, 10, 10)
    _GDIPlus_GraphicsDrawImage($hGfxBuffer, $hBmpIcon2, 110, 10)

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

    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    EndFunc ;==>_Draw

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _Exit()
    _GDIPlus_BitmapDispose($hBmpIcon1)
    _GDIPlus_BitmapDispose($hBmpIcon2)

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

    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    E

  • BigNum - Rechnen mit großen Zahlen

    • eukalyptus
    • 2. Juli 2012 um 18:32

    Würde mich schon reizen, das in ASM zu schreiben...
    Aber evtl. ist es einfach besser (endlich) mal einen Wrapper für GMP.dll zu schreiben ;)
    Die Funktionen für Add und Sub (Int und FLoat) hätte ich sogar schonmal geschrieben (allerdings für eine ganz alte GMP Version aus dem Jahre 2004)

    Wenn ich Zeit finde, probier ich mich mal an der ASM-Version...

    lg
    E

  • Hilfe bei named pipes oder andere Lösung?

    • eukalyptus
    • 2. Juli 2012 um 18:26

    Ich muss zugeben, ich hab deinen Text nur überflogen...
    Aber vielleicht hilft dir dieses Named-Pipes Testscript weiter:
    Deutsche Hilfe - Funktionen ohne Beispiel

    E

  • BigNum - Rechnen mit großen Zahlen

    • eukalyptus
    • 1. Juli 2012 um 11:47

    Vor einigen Monaten hab ich angefangen meine BigNum UDF neu zu schreiben.

    Ist noch nicht fertig, aber da ich im Moment keine Zeit finde, poste ich hier mal die Beta-Version zum testen.


    Die Algos sind etwas schneller als die der alten Version:
    _BigNum_Add ca 5% schneller
    _BigNum_Sub ca 20% schneller
    _BigNum_Div ca 60% schneller!
    einzig _BigNum_Mul ist bei immer größeren Zahlen etwas langsamer, aber es wurde ein Bug beseitigt, welcher bei extrem großen Zahlen falsche Ergebnisse lieferte...

    Diese Geschwindigkeitsunterschiede sind abhängig von der Länge der Zahlen.
    Bei gewissen Situationen kann die neue Version auch etwas langsamer sein.
    Im Durchschnitt hab ich jedenfalls obige Werte gemessen.

    Wer immer schon die alte Version im Einsatz hatte, möge doch bitte die neue Version auf Fehler testen -Danke :thumbup:

    E

    Dateien

    BigNum.au3 16,31 kB – 288 Downloads
  • gdiplus

    • eukalyptus
    • 30. Juni 2012 um 17:25

    Die einfachste Methode um einen String zu messen ist: _GDIPlus_GraphicsMeasureString
    Ist auch bei der standard-Include dabei.
    Allerdings ist diese Methode nicht 100% Pixelgenau

    Es gibt noch die Möglichkeit den String als Path zu erstellen.
    Damit hat man die Größe dan Pixelgenau

    Funktioniert in etwa so:

    [autoit]

    Local $hFormat = _GDIPlus_StringFormatCreate()
    Local $hFamily = _GDIPlus_FontFamilyCreate("Courier New")
    Local $tLayout = _GDIPlus_RectFCreate(0, 0, 0, 0)
    _GDIPlus_PathAddString($hPath, "Test", $tLayout, $hFamily, 1, 50, $hFormat)
    Global $aBounds=_GDIPlus_PathGetWorldBounds($hPath)

    [/autoit]


    Benötigt GDIp.au3

    Edit: Ach ja, zuerst muss der Pfad natürlich erstellt werden: $hPath=_GDIPlus_PathCreate()
    Und via _GDIPlus_GraphicsDrawPath bzw. _GDIPlus_GraphicsFillPath kann er dann gezeichnet werden.
    _GDIPlus_PathDispose nicht vergessen
    _GDIPlus_PathReset um den Pfad wieder zu leeren, falls dieser schon Grafiken enthält...


    E

  • Schnittpunkt von 2 Kreisen

    • eukalyptus
    • 30. Juni 2012 um 06:39

    Hi

    ich hab vor einiger Zeit mal dieses Testscript erstellt, das könnte dir weiterhelfen:

    Spoiler anzeigen
    [autoit]

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

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

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

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

    _GDIPlus_Startup()

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

    Global $iWidth = 800
    Global $iHeight = 600

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

    Global $aL1[4] = [Random(0, $iWidth), Random(0, $iHeight), Random(0, $iWidth), Random(0, $iHeight)]
    Global $aL2[4] = [Random(0, $iWidth), Random(0, $iHeight), 0, 0]

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

    Global $aC1[3] = [$iWidth / 4 + Random(0, $iWidth / 2), $iHeight / 4 + Random(0, $iHeight / 2), Random(100, $iWidth / 4)]
    Global $aC2[3] = [$iWidth / 4 + Random(0, $iWidth / 2), $iHeight / 4 + Random(0, $iHeight / 2), Random(100, $iWidth / 4)]

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

    Global $hGui = GUICreate("Test", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

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

    Global $hPen = _GDIPlus_PenCreate(0xFF00AA00, 2)
    Global $hPen2 = _GDIPlus_PenCreate(0xFFFF0000, 2)
    Global $hPen3 = _GDIPlus_PenCreate(0xFF0000FF, 2)

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

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

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

    Global $aInfo, $bClick
    While 1
    Sleep(10)
    $aInfo = GUIGetCursorInfo()

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

    Switch $aInfo[2]
    Case True
    If Not $bClick Then _Random()
    $bClick = True
    Case Else
    $bClick = False
    EndSwitch

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

    $aL2[2] = $aInfo[0]
    $aL2[3] = $aInfo[1]
    $aC2[2] = Sqrt(($aInfo[0] - $aC2[0]) ^ 2 + ($aInfo[1] - $aC2[1]) ^ 2)

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

    _Intersect($aL1, $aL2, $aC1, $aC2)

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

    WEnd

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

    Func _Random()
    $aL1[0] = Random(0, $iWidth)
    $aL1[1] = Random(0, $iHeight)
    $aL1[2] = Random(0, $iWidth)
    $aL1[3] = Random(0, $iHeight)
    $aL2[0] = Random(0, $iWidth)
    $aL2[1] = Random(0, $iHeight)

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

    $aC1[0] = $iWidth / 4 + Random(0, $iWidth / 2)
    $aC1[1] = $iHeight / 4 + Random(0, $iHeight / 2)
    $aC1[2] = Random(100, $iWidth / 4)
    $aC2[0] = $iWidth / 4 + Random(0, $iWidth / 2)
    $aC2[1] = $iHeight / 4 + Random(0, $iHeight / 2)
    $aC2[2] = Random(100, $iWidth / 4)

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

    EndFunc ;==>_Random

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

    Func _Intersect($aL1, $aL2, $aC1, $aC2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFFFFFFFF)
    DllCall($ghGDIPDll, "int", "GdipDrawLine", "handle", $hGfxBuffer, "handle", $hPen2, "float", $aL1[0], "float", $aL1[1], "float", $aL1[2], "float", $aL1[3])
    DllCall($ghGDIPDll, "int", "GdipDrawLine", "handle", $hGfxBuffer, "handle", $hPen3, "float", $aL2[0], "float", $aL2[1], "float", $aL2[2], "float", $aL2[3])

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

    Local $fX, $fY

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

    Local $bIntersect = _Intersect_Lines($aL1[0], $aL1[1], $aL1[2], $aL1[3], $aL2[0], $aL2[1], $aL2[2], $aL2[3], $fX, $fY)
    Switch $bIntersect
    Case True
    DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfxBuffer, "handle", $hPen, "float", $fX - 10, "float", $fY - 10, "float", 20, "float", 20)
    Case Else
    DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfxBuffer, "handle", $hPen2, "float", $fX - 10, "float", $fY - 10, "float", 20, "float", 20)
    EndSwitch

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

    DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfxBuffer, "handle", $hPen, "float", $aC1[0] - $aC1[2], "float", $aC1[1] - $aC1[2], "float", $aC1[2] * 2, "float", $aC1[2] * 2)
    DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfxBuffer, "handle", $hPen, "float", $aC2[0] - $aC2[2], "float", $aC2[1] - $aC2[2], "float", $aC2[2] * 2, "float", $aC2[2] * 2)

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

    Local $fX1, $fY1, $fX2, $fY2
    $bIntersect = _Intersect_Circles($aC1[0], $aC1[1], $aC1[2], $aC2[0], $aC2[1], $aC2[2], $fX1, $fY1, $fX2, $fY2)
    Switch $bIntersect
    Case True
    DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfxBuffer, "handle", $hPen, "float", $fX1 - 10, "float", $fY1 - 10, "float", 20, "float", 20)
    DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfxBuffer, "handle", $hPen, "float", $fX2 - 10, "float", $fY2 - 10, "float", 20, "float", 20)
    EndSwitch

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

    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    EndFunc ;==>_Intersect

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _Exit()
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_PenDispose($hPen3)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

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

    Func _Intersect_Circles($fCX1, $fCY1, $fR1, $fCX2, $fCY2, $fR2, ByRef $fX1, ByRef $fY1, ByRef $fX2, ByRef $fY2)
    Local $fDX = $fCX2 - $fCX1
    Local $fDY = $fCY2 - $fCY1
    Local $fD = Sqrt(($fDY * $fDY) + ($fDX * $fDX))

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

    If ($fD > ($fR1 + $fR2)) Then Return False
    If ($fD < Abs($fR1 - $fR2)) Then Return False

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

    Local $fA = (($fR1 * $fR1) - ($fR2 * $fR2) + ($fD * $fD)) / (2 * $fD)

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

    Local $fX = $fCX1 + ($fDX * $fA / $fD)
    Local $fY = $fCY1 + ($fDY * $fA / $fD)

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

    Local $fH = Sqrt(($fR1 * $fR1) - ($fA * $fA))

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

    Local $fRX = (0 - $fDY) * ($fH / $fD)
    Local $fRY = $fDX * ($fH / $fD)

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

    $fX1 = $fX + $fRX
    $fY1 = $fY + $fRY
    $fX2 = $fX - $fRX
    $fY2 = $fY - $fRY

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

    Return True
    EndFunc ;==>_Intersect_Circles

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

    Func _Intersect_Lines($fL1X1, $fL1Y1, $fL1X2, $fL1Y2, $fL2X1, $fL2Y1, $fL2X2, $fL2Y2, ByRef $fX, ByRef $fY)
    Local $iOnX1, $iOnY1, $iOnX2, $iOnY2
    Local $fDet, $fA1, $fB1, $fC1, $fA2, $fB2, $fC2

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

    $fA1 = $fL1Y2 - $fL1Y1
    $fB1 = $fL1X1 - $fL1X2
    $fC1 = $fA1 * $fL1X1 + $fB1 * $fL1Y1

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

    $fA2 = $fL2Y2 - $fL2Y1
    $fB2 = $fL2X1 - $fL2X2
    $fC2 = $fA2 * $fL2X1 + $fB2 * $fL2Y1

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

    $fDet = $fA1 * $fB2 - $fA2 * $fB1
    If $fDet = 0 Then Return 0

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

    $fX = ($fB2 * $fC1 - $fB1 * $fC2) / $fDet
    $fY = ($fA1 * $fC2 - $fA2 * $fC1) / $fDet

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

    If $fL1X1 < $fL1X2 Then
    $iOnX1 = ($fX >= $fL1X1) And ($fX <= $fL1X2)
    Else
    $iOnX1 = ($fX <= $fL1X1) And ($fX >= $fL1X2)
    EndIf
    If $fL1Y1 < $fL1Y2 Then
    $iOnY1 = ($fY >= $fL1Y1) And ($fY <= $fL1Y2)
    Else
    $iOnY1 = ($fY <= $fL1Y1) And ($fY >= $fL1Y2)
    EndIf

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

    If $fL2X1 < $fL2X2 Then
    $iOnX2 = ($fX >= $fL2X1) And ($fX <= $fL2X2)
    Else
    $iOnX2 = ($fX <= $fL2X1) And ($fX >= $fL2X2)
    EndIf
    If $fL2Y1 < $fL2Y2 Then
    $iOnY2 = ($fY >= $fL2Y1) And ($fY <= $fL2Y2)
    Else
    $iOnY2 = ($fY <= $fL2Y1) And ($fY >= $fL2Y2)
    EndIf

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

    Return $iOnX1 And $iOnY1 And $iOnX2 And $iOnY2
    EndFunc ;==>_Intersect_Lines

    [/autoit]

    Die Formeln stammen glaub ich aus diesem Forum, aber ich weiß nicht mehr, von wem...
    Linke Maustaste drücken -> neue zufällige Positionen.

    wichtig für dich ist die Funktion _Intersect_Circles, da kannst du den Mittelpunkt der 2 Kreise und den Radius angeben.
    Der Returnwert ist True, wenn sich die Kreise schneiden, anderenfalls False.
    Die Schnittpunkte werden byref übergeben.


    Falls der Punkt N genau in der Mitte liegt oder du das Teilungsverhältnis kennst, dann geht das aber viel einfacher:

    [autoit]

    $fXN = $fXA + ($fXB - $fXA) / 2
    $fYN = $fYA + ($fYB - $fYA) / 2

    [/autoit]
    Spoiler anzeigen
    [autoit]

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

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

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

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

    _GDIPlus_Startup()

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

    Global $iWidth = 800
    Global $iHeight = 600

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

    Global $hGui = GUICreate("Test", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

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

    Global $hPen = _GDIPlus_PenCreate(0xFF00AA00, 2)
    Global $hPen2 = _GDIPlus_PenCreate(0xFFFF0000, 2)
    Global $hPen3 = _GDIPlus_PenCreate(0xFF0000FF, 2)

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

    _Test(Random(0, $iWidth), Random(0, $iHeight), Random(0, $iWidth), Random(0, $iHeight))

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

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

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

    Global $aInfo, $bClick
    While 1
    Sleep(10)
    $aInfo = GUIGetCursorInfo()

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

    Switch $aInfo[2]
    Case True
    If Not $bClick Then _Test(Random(0, $iWidth), Random(0, $iHeight), Random(0, $iWidth), Random(0, $iHeight))
    $bClick = True
    Case Else
    $bClick = False
    EndSwitch
    WEnd

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

    Func _Test($fXA, $fYA, $fXB, $fYB)
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFFFFFFFF)
    DllCall($ghGDIPDll, "int", "GdipDrawLine", "handle", $hGfxBuffer, "handle", $hPen2, "float", $fXA, "float", $fYA, "float", $fXB, "float", $fYB)
    DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfxBuffer, "handle", $hPen2, "float", $fXA - 10, "float", $fYA - 10, "float", 20, "float", 20)
    DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfxBuffer, "handle", $hPen2, "float", $fXB - 10, "float", $fYB - 10, "float", 20, "float", 20)

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

    Local $fXN, $fYN

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

    ;Version 1:
    $fXN = $fXA + ($fXB - $fXA) / 2
    $fYN = $fYA + ($fYB - $fYA) / 2
    DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfxBuffer, "handle", $hPen, "float", $fXN - 10, "float", $fYN - 10, "float", 20, "float", 20)

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

    ;Version 2:
    Local $fAngle, $fDist
    $fAngle = _Atan2($fYB - $fYA, $fXB - $fXA)
    $fDist = Sqrt(($fXB - $fXA) ^ 2 + ($fYB - $fYA) ^ 2) / 2
    $fXN = $fXA + Cos($fAngle) * $fDist
    $fYN = $fYA + Sin($fAngle) * $fDist
    DllCall($ghGDIPDll, "int", "GdipDrawEllipse", "handle", $hGfxBuffer, "handle", $hPen3, "float", $fXN - 15, "float", $fYN - 15, "float", 30, "float", 30)

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

    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    EndFunc ;==>_Test

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _Exit()
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_PenDispose($hPen2)
    _GDIPlus_PenDispose($hPen3)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]


    E

  • [Lazarus]

    • eukalyptus
    • 1. Juni 2012 um 23:02

    Hi

    Ich hab mit Lazarus bisher immer nur Dll´s für AutoIt erstellt.
    Consolenprogramme bekomm ich auch noch hin, aber bei GUI Anwendungen muss ich mich leider ausklinken...

    Am besten stellst du die Frage in einem Delphi-Forum; Viele Delphi-User kennen sich auch mit Lazarus aus bzw. ist es quasi ja fast dieselbe Sprache...

    E

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™