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

Beiträge von Matricus

  • An die Admins dieser Seite: Zertifikatfehler [Bug]

    • Matricus
    • 15. April 2015 um 20:06

    Und natürlich meckert nicht nur der Feuerfuchs, sondern auch der IE 11 unter Windows Threshold.
    Der Spartan Browser von Win10 interessanterweise nicht bei immer den gleichen wie der IE 11.

    Leider lässt sich dies auch nicht auf jeder Seite umgehen (durch hinzufügen/entfernen von www bzw. setzen als trusted page), sondern kann nur einen anderen Browser nutzen der aber womöglich ebenso reagiert.

    Dateien

    cert.PNG 38,77 kB – 336 Downloads
  • 2D Array & Excel_RangeWrite

    • Matricus
    • 1. November 2014 um 13:46

    Da ich gerade mal ein paar Minuten hatte und den Thread damit auch schließen möchte...
    Zur Optimierung wird nun, wie von Water vorgeschlagen, ein 1D-Array aus einer Spalte des 2D-Arrays erstellt und dieses entsprechend geschrieben.

    Angepasstes Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <Excel.au3>
    ; Array Include nicht benötigt, da Teil von Excel.au3

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

    $iCol = 2 ; zu schreibene Spalte
    $eCol = _Excel_ColumnToLetter($iCol+4) & "1" ; Zielspalte in Excel (+4 fürs Beispiel, da sonst überschrieben wird)

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

    $File = @ScriptDir & "\Example.xlsx"

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

    $oExcel = _Excel_Open(False, False, False, False, True) ; hidden thread
    $hExcel = _Excel_BookOpen($oExcel, $File)
    $aContent = _Excel_RangeRead($hExcel)

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

    $aExtract = _ArrayExtract($aContent, 0, UBound($aContent, 1)-1, $iCol, $iCol) ; Extract Column 3
    _Excel_RangeWrite($hExcel, Default, $aExtract, $eCol)

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

    _Excel_BookClose($hExcel)
    _Excel_Close($oExcel)

    [/autoit]


    Vielen Dank für die Hilfe! :)

  • OnEventMode - GUI anhalten bis GUI geschlossen wird

    • Matricus
    • 30. Oktober 2014 um 18:22
    Zitat von BugFix


    Im OnEvent Mode braucht es genau wie im MsgMode eine Endlosschleife um das Skript am Laufen zu halten. Ein einziger Blick in irgendein beliebiges GUI-Bsp. der Hilfe hätte das auch gezeigt.


    Natürlich braucht es eine Endlosschleife, dennoch würde das UI nicht reagieren, wenn das Skript z.B. mit WinWait() "pausiert".

    Und wenn ich mir meinen Text erneut durchlese, sehe ich nicht, an welcher Stelle ich dem widersprochen hätte. :/

  • OnEventMode - GUI anhalten bis GUI geschlossen wird

    • Matricus
    • 30. Oktober 2014 um 06:24

    Grundlegend kannst du das Skript bzw. die Funktion in Bezug auf ein Fenster mit WinWaitClose() bzw. WinWait() anhalten, je nachdem ob du darauf wartest das es geschlossen bzw. geöffnet wird.
    Während es wartet ist es jedoch nicht mehr ansprechbar.

    Damit die UIs weiterhin funktionieren, musst du die betreffende Funktion z.B. mit AdlibRegister() aufrufen (und mit AdlibUnRegister() am Ende schließen), sodass der Rest des Skriptes weiterhin ausgeführt werden kann:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $hGUI1, $hGUI2 = 9999, $hButton1, $hButton2, $hButton3 = 9999 ; Predeclare the variables with dummy values to prevent firing the Case statements

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

    gui1()

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

    Func gui1()
    $hGUI1 = GUICreate("Gui 1", 200, 200, 100, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "On_Close") ; Call a common GUI close function
    $hButton1 = GUICtrlCreateButton("Msgbox 1", 10, 10, 80, 30)
    GUICtrlSetOnEvent(-1, "On_Button") ; Call a common button function
    $hButton2 = GUICtrlCreateButton("Show Gui 2", 10, 60, 80, 30)
    GUICtrlSetOnEvent(-1, "On_Button") ; Call a common button function
    GUISetState()

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

    While 1
    Sleep(10)
    WEnd
    EndFunc ;==>gui1

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

    Func gui2()
    $hGUI2 = GUICreate("Gui 2", 200, 200, 350, 350, -1, -1, $hGUI1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "On_Close") ; Call a common GUI close function
    $hButton3 = GUICtrlCreateButton("MsgBox 2", 10, 10, 80, 30)
    GUICtrlSetOnEvent(-1, "On_Button") ; Call a common button function
    GUISetState()

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

    ;~ While 1
    ;~ Sleep(10)
    ;~ WEnd
    EndFunc ;==>gui2

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

    Func On_Close()
    Switch @GUI_WINHANDLE ; See which GUI sent the CLOSE message
    Case $hGUI1
    Exit ; If it was this GUI - we exit <<<<<<<<<<<<<<<
    Case $hGUI2
    GUIDelete($hGUI2) ; If it was this GUI - we just delete the GUI <<<<<<<<<<<<<<<
    GUICtrlSetState($hButton2, $GUI_ENABLE)
    EndSwitch
    EndFunc

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

    Func ShowGUI2()
    GUICtrlSetState($hButton2, $GUI_DISABLE)
    gui2()
    WinWaitClose("Gui 2", "")

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

    MsgBox(0, "sfdsf", "sdfsfd") ; hier weiter machen, nachdem gui2 nicht mehr benötigt wird (geschlossen wurde)
    AdlibUnRegister("ShowGUI2")
    EndFunc

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

    Func On_Button()
    Switch @GUI_CTRLID ; See which button sent the message
    Case $hButton1
    MessageBox(1) ; We can call a function with parameters here <<<<<<<<<<<<<<<<<<<
    Case $hButton2
    AdlibRegister("ShowGUI2")

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

    Case $hButton3
    MessageBox(2) ; We can call a function with parameters here <<<<<<<<<<<<<<<<<<<
    EndSwitch
    EndFunc

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

    Func MessageBox($iIndex)
    MsgBox("", "MsgBox " & $iIndex, "Test from Gui " & $iIndex)
    EndFunc

    [/autoit]

    Aber gibt es einen Grund, weshalb du die GUIs in separaten Funktionen erstellst?
    Ich pers. erstelle mit OnEvent alle GUIs zu Beginn und blende diese dann bei Bedarf ein/aus (GuiSetState()); so hast du auch nur deine normale While-Schleife für das Skript, außerhalb einer Funktion.

    Bei einem simplen Skript macht dies zumindest keinen Unterschied in Bezug auf die Ressourcen und ist auf Dauer simpler zu managen.

  • 2D Array & Excel_RangeWrite

    • Matricus
    • 23. Oktober 2014 um 18:04
    Zitat von water

    Die Excel UDF schreibt immer den kompletten Array nach Excel. Eine Möglichkeit wäre, die Spalte aus Deinem Array mit Hilfe einer der _Array* Funktionen in einen neuen Array zu kopieren und diesen dann an die _Excel_RangeWrite Funktion zu übergeben.


    Guter Einfall, die zu kopierende Spalte einfach in ein neues 1D-Array zu kopieren.
    Werde ich bei Gelegenheit mal versuchen, vielen Dank. :)

    Zitat

    Sieh dir mal Beispiel 4 aus der Hilfe an: autoitscript.com/autoit3/docs/…ons/_Excel_RangeWrite.htm
    Damit sollte es doch egtl funktionieren


    Wie bereits von Water erwähnt, funktioniert dies leider nicht so ganz mit mehreren Werten, außer man übergibt ein komplettes Array.

  • 2D Array & Excel_RangeWrite

    • Matricus
    • 23. Oktober 2014 um 00:31

    Grüße!

    Großes, kleines Projekt, wie es noch einmal so ist. ;)

    Im Moment liebäugle ich damit einen Teil meines Scripts zu optimieren, welches sich mit dem Umsortieren großer Datenmengen in Excel befasst.
    Die Daten stammen aus einem dynamischen 2D-Array.

    Langsamste Stelle im Script ist aktuell das Schreiben einer gesamten Spalte des 2D-Arrays in die (sich ständig ändernde) Excel-Spalte.

    Aktuell schreibt das Skript jede Zeile dieser Spalte manuell in die Datei.
    Vereinfachtes Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <Excel.au3>

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

    $File = @ScriptDir & "\Example.xlsx"

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

    $oExcel = _Excel_Open(False, False, False, False, True) ; hidden thread
    $hExcel = _Excel_BookOpen($oExcel, $File)
    $aContent = _Excel_RangeRead($hExcel)

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

    For $i=0 To UBound($aContent, 1)-1 Step 1
    _Excel_RangeWrite($hExcel, Default, $aContent[$i][1], "E" & ($i+1))
    Next

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

    _Excel_BookClose($hExcel)
    _Excel_Close($oExcel)

    [/autoit]


    Bei steigendem row-count dauert das natürlich entsprechend lange.

    Gibt es eine Möglichkeit, direkt eine bestimmte Array-Spalte oder -Zeile in eine Excel-Spalte/-Zeile zu schreiben, ohne die einzelnen Felder des Arrays per loop durchzugehen?
    Ich dachte daran, vielleicht direkt VBA-Code an das Objekt zu hängen statt die Funktion zu verwenden, aber aus den VBA-Schnipseln innerhalb der RangeWrite-Funktion der UDF werde ich diesbezüglich nicht schlau.

    Vielleicht habt's ihr noch einen spontanen Hinweis.

    Cheerio,
    Matricus

  • Prüfen ob bzw. wann Datei vorhanden ist?

    • Matricus
    • 23. Oktober 2014 um 00:28

    So etwas kannst du mit StringFormat() realisieren.
    Dort kannst du den übergebenen Wert speziell formatieren, so also auch einer Zahl führende Nullen verpassen.

    [autoit]


    ProgressOn("Example", "Formatiere Int via StringFormat")

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

    For $i=1 To 100 Step 1
    $FileName = StringFormat("%03i", $i) & ".dat" ; 3 stelliger integer, mit führender 0
    ProgressSet($i, $FileName)
    If FileExists(@ScriptDir & "\" & $FileName) Then ExitLoop ; Datei gefunden
    Sleep(75)
    Next
    ProgressOff()

    [/autoit]
  • Glücksrad! via GDI+?

    • Matricus
    • 25. November 2013 um 08:10
    Zitat von UEZ

    Ich habe einige Kommentare hinzugefügt:

    Spoiler anzeigen
    [autoit]


    Func Btn_Drehen()
    $f = Random(5, 15) ;zufälligen Drehwinkel in Grad erstellen
    Do
    If $f > 0 Then
    Drehen($f) ;drehe Scheibe um $f Grad
    $ff += $f ;addiere Drehwinkel zur Drehwinkel Summe ($ff)
    $f -= 0.1 ;reduziere Drehwinkel um 1/10 Grad pro Schleifendurchgang
    Else
    $iRunden = Floor($ff / 360) ;messe Anzahl der Runden
    $iSegment = Mod($iRunden + Ceiling($ff / 15), 25) ;bestimme Segment -> 24 Segmente zu je 15°
    If Not $iSegment Then $iSegment += 1 ;korrigiere, wenn Segment Kalulation = 0 ist
    If Mod($ff, 15) > 14.45 Or Mod($ff, 15) < 0.55 Then $iSegment = 0 ;finde "Kippe"
    GUICtrlSetData($iLbl_Preis, $aFelder[$iSegment]) ;zeige "Gewinn"
    ExitLoop
    EndIf
    Until False * Sleep(30)
    EndFunc

    [/autoit]

    Ich hoffe, dass es jetzt "klarer" wird.

    Gruß,
    UEZ

    Alles anzeigen


    Ein wahrer Augenöffner, gar keine Frage. ;)
    Danke!

    Erst einmal wieder 'solved', wie zu nächsten Frage. :S

  • Glücksrad! via GDI+?

    • Matricus
    • 23. November 2013 um 18:44

    Irgendwie komme ich mir vor wie ein Grundschüler, der gerade das erste Mal Mathematik Unterricht hat und nichts versteht.
    Ich steig' nicht hinter die Berechnungen von UEZ zur Erfassung des "Siegesfeldes".

    Hier noch mal seine Funktion:

    Spoiler anzeigen
    [autoit]

    Func Btn_Drehen()
    $f = Random(3, 15)
    Do
    If $f > 0 Then
    Drehen($f)
    $ff += $f
    $f -= 0.1
    Else
    $iRunden = Floor($ff / 360)
    $iSegment = Mod($iRunden + Ceiling($ff / 15), 25)
    If Not $iSegment Then $iSegment += 1
    If Mod($ff, 15) > 14.45 Or Mod($ff, 15) < 0.55 Then $iSegment = 0
    GUICtrlSetData($iLbl_Preis, $aFelder[$iSegment])
    $f = 0
    ExitLoop
    EndIf
    Until False * Sleep(30)
    EndFunc

    [/autoit]

    Floor - Abrunden, Ceiling - Aufrunden ... klar.
    Mod ist schon komplexer - Berechnung des Restes aus einer Division, aber sollte klar sein.

    [autoit]

    $iRunden = Floor($ff / 360)
    $iSegment = Mod($iRunden + Ceiling($ff / 15), 25)
    [...]
    If Mod($ff, 15) > 14.45 Or Mod($ff, 15) < 0.55 Then $iSegment = 0

    [/autoit]


    Meine Frage dazu: Warum teilst du bei Ceiling und später beim Modulos durch 15? Was hat es mit dieser 15 auf sich - da grüble ich jetzt schon' bisschen dran. :S
    Den Zusammenhang verstehe ich nicht ganz.

    Und steht die 25 als Divisor bei der $iSegment-Berechnung für die Anzahl der Felder oder wofür?

    Naja, wenn ich's nicht hinbekomme, mache ich einfach 'ne Color-PixelSearch. :D

  • Glücksrad! via GDI+?

    • Matricus
    • 15. November 2013 um 21:37
    Zitat von UEZ

    Welche Dynamik fehlt dir denn?


    Naja, zum Bleistift die simple Tatsache, dass es ein Bild ist. Folglich müssen alle Variationen, ob nun Anzahl der Felder oder dessen (visueller) Inhalt als Bild vorhanden sein.

    Das macht eine Dynamik, z.B. das sich die Werte der Felder jede Runde ändern können, quasi unmöglich.

    Zitat von UEZ

    Meine Berechnung sieht etwas kompliziert aus, aber sollte nicht so schwer sein zu verstehen, da die Kalkulation sich im Prinzip auf 4 Zeilen beschränkt.

    Im Prinzip werden die Rotationen zusammen gezählt und auf das Glücksrad übersetzt. Insgesamt sind es 24 Segmente zu je 15°. Ferner wird noch geprüft, ob der Zeiger auf der "Kippe" steht.


    Wenn man es auf die Tatsachen reduziert, ja, einfach. Es aber logisch zu übernehmen ist wie eine andere Sache.

    Mag' daran liegen, dass ich die jetzige Version in den 2 vorherigen Tagen nach der Arbeit Abends um 22 Uhr zusammengeschustert habe und mein Gehirn einfach schon abgeschalten hat.
    Vielleicht steig' ich ja jetzt durch, wo ich mal 3 Tage am Stück frei habe und nicht immer so im Arbeit-Frei-Wechsel bin. :rolleyes:

    Zitat

    - Anzeige von Werten auf dem Rad, in den Feldern (als Text, nicht als Bild)


    Da ist mir spontan selbst eine Idee gekommen - ja, jetzt wo man frei hat, kann man den Geist auf Wanderschaft schicken :).
    Ich setz' einfach 1 bis 3 labels ein, die am Punkt an dem letztlich der Marker liegt die Werte anzeigen; den aktuellen, sowie den vom vorherigen und nächsten Feld.
    Diese werden dann beim spin auch permanent aktualisiert.

    Ist zwar nicht die optimale Lösung, aber besser als eine Legende oder gar keine Anzeige.

    Wenn jemand 'ne andere oder bessere Idee hat, dann immer her damit. :)

  • Glücksrad! via GDI+?

    • Matricus
    • 15. November 2013 um 10:07

    Ich bin's wieder! ;)

    Ich hab' in der wenigen Freizeit nun mal etwas an dem Projekt gearbeitet und bisher das Zustande gebracht:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <WinAPI.au3>
    #include <GUISlider.au3>
    #include <GUIButton.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #include <ComboConstants.au3>
    #include <Date.au3>

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

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

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

    ; Size of GUI, Wheel and Modifier Vars
    Global Const $AC_SRC_ALPHA = 1
    Global Const $PIE_DIAMETER = 600
    Global Const $PIE_MARGIN = $PIE_DIAMETER * 0.025
    Global Const $PIE_DEPTH = $PIE_DIAMETER * 0.2
    Global Const $PIE_AREA = $PIE_DIAMETER + 2 * $PIE_MARGIN

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

    ;MsgBox(64, "Data Output", $PIE_DIAMETER & @CRLF & $PIE_MARGIN & @CRLF & $PIE_DEPTH & @CRLF & $PIE_AREA)

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

    ; Wheel Data: Sections, Colors etc.
    Global Const $NUM_VALUES = 8 ; amount of parts
    Global $aChartValue[$NUM_VALUES]
    Global $aChartColour[$NUM_VALUES]
    Global $NUM_Radius = 360 / $NUM_VALUES ; size per part (if 1:1)
    For $i = 0 To $NUM_VALUES - 1
    $aChartValue[$i] = $NUM_Radius
    $aChartColour[$i] = (Random(0, 255, 1) * 0x10000) + (Random(0, 255, 1) * 0x100) + Random(0, 255, 1) ; randomize colors
    Next

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

    ; Pi
    Global Const $PI = ATan(1) * 4

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

    _GDIPlus_Startup()

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

    ; Solid Creation
    Global $ahBrush[$NUM_VALUES][2], $ahPen[$NUM_VALUES]
    For $i = 0 To $NUM_VALUES - 1
    $ahBrush[$i][0] = _GDIPlus_BrushCreateSolid(BitOR(0xff000000, $aChartColour[$i]))
    $ahBrush[$i][1] = _GDIPlus_BrushCreateSolid(BitOR(0xff000000, _GetDarkerColour($aChartColour[$i])))
    $ahPen[$i] = _GDIPlus_PenCreate(BitOR(0xff000000, _GetDarkerColour(_GetDarkerColour($aChartColour[$i]))))
    Next

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

    #region GUI CREATION
    ; GUI Creation
    Global $hWnd = GUICreate("Wheel", $PIE_AREA + 250, $PIE_AREA, Default, Default)
    ;SetBitmap($hwnd, $hPointer, 255) ; not yet used

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

    ; Basic Controls
    $hcb = GUICtrlCreateCombo("Preset 1", $PIE_DIAMETER + 90, $PIE_DEPTH - 40, $PIE_DEPTH * 2 - 55, 20, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
    GUICtrlSetData(-1, "Preset 2|Preset 3")
    $Button2 = GUICtrlCreateButton("New Preset", $PIE_DIAMETER + 105, $PIE_DEPTH - 10, $PIE_DEPTH - 50, 25)
    $Button1 = GUICtrlCreateButton("Edit Preset", $PIE_DIAMETER + 190, $PIE_DEPTH - 10, $PIE_DEPTH - 50, 25)

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

    $hSpinIt = GUICtrlCreateButton("Spin It!", $PIE_DIAMETER + 40, $PIE_DIAMETER - 60, 100, 25)
    GUICtrlSetOnEvent($hSpinIt, "_SpinWheel")

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

    ; Wheel Modifier
    Global $hSlideAspect = _GUICtrlSlider_Create($hWnd, $PIE_MARGIN + 600, $PIE_AREA + 60, 100, 20) ; yet not used
    _GUICtrlSlider_SetRange($hSlideAspect, 10, 100)
    _GUICtrlSlider_SetPos($hSlideAspect, 50)
    Global $hSlideRotation = _GUICtrlSlider_Create($hWnd, $PIE_DIAMETER + 40, $PIE_DEPTH + 40, $PIE_DEPTH * 2, 20)
    _GUICtrlSlider_SetRange($hSlideRotation, 0, 720)
    Global $cStyle = GUICtrlCreateCheckbox("Donut", $PIE_MARGIN, $PIE_AREA + 70, $PIE_DIAMETER / 2 - $PIE_MARGIN, 20) ; not yet used; checked by default
    Global $hStyle = GUICtrlGetHandle($cStyle)
    GUICtrlSetState ($cStyle, $GUI_CHECKED)
    Global $hHoleSize = _GUICtrlSlider_Create($hWnd, $PIE_DIAMETER + 40, $PIE_DEPTH + 70, $PIE_DEPTH * 2, 20)
    _GUICtrlSlider_SetRange($hHoleSize, $PIE_DEPTH + 80, $PIE_DEPTH + 155)
    _GUICtrlSlider_SetPos($hHoleSize, $PIE_DEPTH * 2)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetState()

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

    ; Set up GDI+
    Global $hDC = _WinAPI_GetDC($hWnd)
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hDC)
    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($PIE_AREA, $PIE_AREA, $hGraphics)
    Global $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)
    #endregion

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

    ; Draw the initial pie chart
    _DrawPie($aChartValue, _GUICtrlSlider_GetPos($hSlideAspect) / 100, _
    _GUICtrlSlider_GetPos($hSlideRotation), _
    (GUICtrlRead($cStyle) = $GUI_CHECKED), _
    _GUICtrlSlider_GetPos($hHoleSize))

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

    ; The sliders will send WM_NOTIFY messages
    GUIRegisterMsg($WM_NOTIFY, "_OnNotify")

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

    ; Wait until the user quits
    While 1
    Sleep(10)
    WEnd

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

    ; Release the resources
    For $i = 0 To UBound($aChartColour) - 1
    _GDIPlus_PenDispose($ahPen[$i])
    _GDIPlus_BrushDispose($ahBrush[$i][0])
    _GDIPlus_BrushDispose($ahBrush[$i][1])
    Next
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphics)
    _WinAPI_ReleaseDC($hWnd, $hDC)

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

    ; Shut down GDI+
    _GDIPlus_Shutdown()

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

    ; Done
    Exit

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

    Func _Exit()
    Exit
    EndFunc

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

    ; Get a darker version of a colour by extracting the RGB components
    Func _GetDarkerColour($Colour)
    Local $Red, $Green, $Blue
    $Red = (BitAND($Colour, 0xff0000) / 0x10000) - 40
    $Green = (BitAND($Colour, 0x00ff00) / 0x100) - 40
    $Blue = (BitAND($Colour, 0x0000ff)) - 40
    If $Red < 0 Then $Red = 0
    If $Green < 0 Then $Green = 0
    If $Blue < 0 Then $Blue = 0
    Return ($Red * 0x10000) + ($Green * 0x100) + $Blue
    EndFunc ;==>_GetDarkerColour

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

    Func _OnNotify($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    Local $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    Switch $hWndFrom
    Case $hSlideAspect, $hSlideRotation, $hStyle, $hHoleSize
    ; Update the pie chart
    _DrawPie($aChartValue, _GUICtrlSlider_GetPos($hSlideAspect) / 100, _
    _GUICtrlSlider_GetPos($hSlideRotation), _
    (GUICtrlRead($cStyle) = $GUI_CHECKED), _
    _GUICtrlSlider_GetPos($hHoleSize))
    Case $hSpinIt
    ;_SpinWheel(Random(750, 2310))

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

    EndSwitch
    EndFunc ;==>_OnNotify

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

    Func _SpinWheel()
    Local $pRotation = Random(10, 25)
    Local $pStepMissing = $pRotation

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

    While $pStepMissing > 0
    _DrawPie($aChartValue, _GUICtrlSlider_GetPos($hSlideAspect) / 100, _
    $pRotation, _
    (GUICtrlRead($cStyle) = $GUI_CHECKED), _
    _GUICtrlSlider_GetPos($hHoleSize))
    ;MsgBox(64, "rotation", $pRotation)
    $pStepMissing -= 0.05 ; countdown for spin end + reducing spin amount per round; should not be higher than 0.1
    $pRotation += $pStepMissing ; keep spinning!
    WEnd
    EndFunc

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

    ; Draw the pie
    Func _DrawPie($Percentage, $Aspect, $rotation, $style = 0, $holesize = 100)
    If $style <> 0 Then $Aspect = 1
    Local $nCount, $nTotal = 0, $angleStart, $angleSweep, $X, $Y
    Local $pieLeft = $PIE_MARGIN, $pieTop = $PIE_AREA / 2 - ($PIE_DIAMETER / 2) * $Aspect
    Local $pieWidth = $PIE_DIAMETER, $pieHeight = $PIE_DIAMETER * $Aspect, $hPath

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

    ; Total up the values
    For $nCount = 0 To UBound($Percentage) - 1
    $nTotal += $Percentage[$nCount]
    Next

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

    ; Set the fractional values
    For $nCount = 0 To UBound($Percentage) - 1
    $Percentage[$nCount] /= $nTotal
    Next

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

    ; Make sure we don't over-rotate
    $rotation = Mod($rotation, 360)

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

    ; Clear the graphics buffer
    _GDIPlus_GraphicsClear($hBuffer, 0xffc0c0c0)

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

    ; Set the initial angles based on the fractional values
    Local $Angles[UBound($Percentage) + 1]
    For $nCount = 0 To UBound($Percentage)
    If $nCount = 0 Then
    $Angles[$nCount] = $rotation
    Else
    $Angles[$nCount] = $Angles[$nCount - 1] + ($Percentage[$nCount - 1] * 360)
    EndIf
    Next

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

    Switch $style
    Case 0
    ; Adjust the angles based on the aspect
    For $nCount = 0 To UBound($Percentage)
    $X = $PIE_DIAMETER * Cos($Angles[$nCount] * $PI / 180)
    $Y = $PIE_DIAMETER * Sin($Angles[$nCount] * $PI / 180)
    $Y -= ($PIE_DIAMETER - $pieHeight) * Sin($Angles[$nCount] * $PI / 180)
    If $X = 0 Then
    $Angles[$nCount] = 90 + ($Y < 0) * 180
    Else
    $Angles[$nCount] = ATan($Y / $X) * 180 / $PI
    EndIf
    If $X < 0 Then $Angles[$nCount] += 180
    If $X >= 0 And $Y < 0 Then $Angles[$nCount] += 360
    $X = $PIE_DIAMETER * Cos($Angles[$nCount] * $PI / 180)
    $Y = $pieHeight * Sin($Angles[$nCount] * $PI / 180)
    Next

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

    ; Decide which pieces to draw first and last
    Local $nStart = -1, $nEnd = -1
    For $nCount = 0 To UBound($Percentage) - 1
    $angleStart = Mod($Angles[$nCount], 360)
    $angleSweep = Mod($Angles[$nCount + 1] - $Angles[$nCount] + 360, 360)
    If $angleStart <= 270 And ($angleStart + $angleSweep) >= 270 Then
    $nStart = $nCount
    EndIf
    If ($angleStart <= 90 And ($angleStart + $angleSweep) >= 90) _
    Or ($angleStart <= 450 And ($angleStart + $angleSweep) >= 450) Then
    $nEnd = $nCount
    EndIf
    If $nEnd >= 0 And $nStart >= 0 Then ExitLoop
    Next

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

    ; Draw the first piece
    _DrawPiePiece($hBuffer, $pieLeft, $pieTop, $pieWidth, $pieHeight, $PIE_DEPTH * (1 - $Aspect), $nStart, $Angles)

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

    ; Draw pieces "to the right"
    $nCount = Mod($nStart + 1, UBound($Percentage))
    While $nCount <> $nEnd
    _DrawPiePiece($hBuffer, $pieLeft, $pieTop, $pieWidth, $pieHeight, $PIE_DEPTH * (1 - $Aspect), $nCount, $Angles)
    $nCount = Mod($nCount + 1, UBound($Percentage))
    WEnd

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

    ; Draw pieces "to the left"
    $nCount = Mod($nStart + UBound($Percentage) - 1, UBound($Percentage))
    While $nCount <> $nEnd
    _DrawPiePiece($hBuffer, $pieLeft, $pieTop, $pieWidth, $pieHeight, $PIE_DEPTH * (1 - $Aspect), $nCount, $Angles)
    $nCount = Mod($nCount + UBound($Percentage) - 1, UBound($Percentage))
    WEnd

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

    ; Draw the last piece
    _DrawPiePiece($hBuffer, $pieLeft, $pieTop, $pieWidth, $pieHeight, $PIE_DEPTH * (1 - $Aspect), $nEnd, $Angles)
    Case 1
    ; Draw the donut pieces
    For $nCount = 0 To UBound($Percentage) - 1
    $angleStart = Mod($Angles[$nCount], 360)
    $angleSweep = Mod($Angles[$nCount + 1] - $Angles[$nCount] + 360, 360)

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

    ; Draw the outer arc in a darker colour
    $hPath = _GDIPlus_GraphicsPathCreate()
    _GDIPlus_GraphicsPathAddArc($hPath, $pieLeft, $pieTop, $pieWidth, $pieHeight, $angleStart, $angleSweep)
    _GDIPlus_GraphicsPathAddArc($hPath, $pieLeft + $PIE_MARGIN, $pieTop + $PIE_MARGIN, $pieWidth - $PIE_MARGIN * 2, _
    $pieHeight - $PIE_MARGIN * 2, $angleStart + $angleSweep, -$angleSweep)
    _GDIPlus_GraphicsPathCloseFigure($hPath)
    _GDIPlus_GraphicsFillPath($hBuffer, $ahBrush[$nCount][1], $hPath)
    _GDIPlus_GraphicsDrawPath($hBuffer, $ahPen[$nCount], $hPath)
    _GDIPlus_GraphicsPathDispose($hPath)

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

    ; Draw the inner piece in a lighter colour - leave room for the hole
    $hPath = _GDIPlus_GraphicsPathCreate()
    _GDIPlus_GraphicsPathAddArc($hPath, $pieLeft + $PIE_MARGIN, $pieTop + $PIE_MARGIN, $pieWidth - $PIE_MARGIN * 2, _
    $pieHeight - $PIE_MARGIN * 2, $angleStart, $angleSweep)
    _GDIPlus_GraphicsPathAddArc($hPath, $pieLeft + ($PIE_DIAMETER - $holesize) / 2, $pieTop + ($PIE_DIAMETER - $holesize) / 2, _
    $holesize, $holesize, $angleStart + $angleSweep, -$angleSweep)
    _GDIPlus_GraphicsPathCloseFigure($hPath)
    _GDIPlus_GraphicsFillPath($hBuffer, $ahBrush[$nCount][0], $hPath)
    _GDIPlus_GraphicsDrawPath($hBuffer, $ahPen[$nCount], $hPath)
    _GDIPlus_GraphicsPathDispose($hPath)
    Next
    EndSwitch

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

    ; Now draw the bitmap on to the device context of the window
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0)
    EndFunc ;==>_DrawPie

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

    Func _DrawPiePiece($hGraphics, $iX, $iY, $iWidth, $iHeight, $iDepth, $nCount, $Angles)
    Local $hPath, $cX = $iX + ($iWidth / 2), $cY = $iY + ($iHeight / 2), $fDrawn = False
    Local $iStart = Mod($Angles[$nCount], 360), $iSweep = Mod($Angles[$nCount + 1] - $Angles[$nCount] + 360, 360)

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

    ; Draw side
    ConsoleWrite(_Now() & @CRLF)
    $hPath = _GDIPlus_GraphicsPathCreate()
    If $iStart < 180 And ($iStart + $iSweep > 180) Then
    _GDIPlus_GraphicsPathAddArc($hPath, $iX, $iY, $iWidth, $iHeight, $iStart, 180 - $iStart)
    _GDIPlus_GraphicsPathAddArc($hPath, $iX, $iY + $iDepth, $iWidth, $iHeight, 180, $iStart - 180)
    _GDIPlus_GraphicsPathCloseFigure($hPath)
    _GDIPlus_GraphicsFillPath($hGraphics, $ahBrush[$nCount][1], $hPath)
    _GDIPlus_GraphicsDrawPath($hGraphics, $ahPen[$nCount], $hPath)
    $fDrawn = True
    EndIf
    If $iStart + $iSweep > 360 Then
    _GDIPlus_GraphicsPathAddArc($hPath, $iX, $iY, $iWidth, $iHeight, 0, $iStart + $iSweep - 360)
    _GDIPlus_GraphicsPathAddArc($hPath, $iX, $iY + $iDepth, $iWidth, $iHeight, $iStart + $iSweep - 360, 360 - $iStart - $iSweep)
    _GDIPlus_GraphicsPathCloseFigure($hPath)
    _GDIPlus_GraphicsFillPath($hGraphics, $ahBrush[$nCount][1], $hPath)
    _GDIPlus_GraphicsDrawPath($hGraphics, $ahPen[$nCount], $hPath)
    $fDrawn = True
    EndIf
    If $iStart < 180 And (Not $fDrawn) Then
    _GDIPlus_GraphicsPathAddArc($hPath, $iX, $iY, $iWidth, $iHeight, $iStart, $iSweep)
    _GDIPlus_GraphicsPathAddArc($hPath, $iX, $iY + $iDepth, $iWidth, $iHeight, $iStart + $iSweep, -$iSweep)
    _GDIPlus_GraphicsPathCloseFigure($hPath)
    _GDIPlus_GraphicsFillPath($hGraphics, $ahBrush[$nCount][1], $hPath)
    _GDIPlus_GraphicsDrawPath($hGraphics, $ahPen[$nCount], $hPath)
    EndIf
    _GDIPlus_GraphicsPathDispose($hPath)

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

    ; Draw top
    _GDIPlus_GraphicsFillPie($hGraphics, $iX, $iY, $iWidth, $iHeight, $iStart, $iSweep, $ahBrush[$nCount][0])
    _GDIPlus_GraphicsDrawPie($hGraphics, $iX, $iY, $iWidth, $iHeight, $iStart, $iSweep, $ahPen[$nCount])

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

    EndFunc ;==>_DrawPiePiece

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

    Func _GDIPlus_GraphicsPathCreate($iFillMode = 0)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipCreatePath", "int", $iFillMode, "int*", 0);
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, $aResult[2])
    EndFunc ;==>_GDIPlus_GraphicsPathCreate

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

    Func _GDIPlus_GraphicsPathAddLine($hGraphicsPath, $iX1, $iY1, $iX2, $iY2)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipAddPathLine", "hwnd", $hGraphicsPath, "float", $iX1, "float", $iY1, _
    "float", $iX2, "float", $iY2)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
    EndFunc ;==>_GDIPlus_GraphicsPathAddLine

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

    Func _GDIPlus_GraphicsPathAddArc($hGraphicsPath, $iX, $iY, $iWidth, $iHeight, $iStartAngle, $iSweepAngle)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipAddPathArc", "hwnd", $hGraphicsPath, "float", $iX, "float", $iY, _
    "float", $iWidth, "float", $iHeight, "float", $iStartAngle, "float", $iSweepAngle)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
    EndFunc ;==>_GDIPlus_GraphicsPathAddArc

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

    Func _GDIPlus_GraphicsPathAddPie($hGraphicsPath, $iX, $iY, $iWidth, $iHeight, $iStartAngle, $iSweepAngle)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipAddPathPie", "hwnd", $hGraphicsPath, "float", $iX, "float", $iY, _
    "float", $iWidth, "float", $iHeight, "float", $iStartAngle, "float", $iSweepAngle)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
    EndFunc ;==>_GDIPlus_GraphicsPathAddPie

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

    Func _GDIPlus_GraphicsPathCloseFigure($hGraphicsPath)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipClosePathFigure", "hwnd", $hGraphicsPath)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
    EndFunc ;==>_GDIPlus_GraphicsPathCloseFigure

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

    Func _GDIPlus_GraphicsPathDispose($hGraphicsPath)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipDeletePath", "hwnd", $hGraphicsPath)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
    EndFunc ;==>_GDIPlus_GraphicsPathDispose

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

    Func _GDIPlus_GraphicsDrawPath($hGraphics, $hPen, $hGraphicsPath)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipDrawPath", "hwnd", $hGraphics, "hwnd", $hPen, "hwnd", $hGraphicsPath)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
    EndFunc ;==>_GDIPlus_GraphicsDrawPath

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

    Func _GDIPlus_GraphicsFillPath($hGraphics, $hBrush, $hGraphicsPath)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdipFillPath", "hwnd", $hGraphics, "hwnd", $hBrush, "hwnd", $hGraphicsPath)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, 0)
    EndFunc ;==>_GDIPlus_GraphicsFillPath

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

    Func SetBitmap($hGUI, $hImage, $iOpacity) ; not yet used
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

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

    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
    EndFunc ;==>SetBitmap

    [/autoit]

    Es ist so aus allen Vorschlägen etwas. :)

    UEZ' Vorschlag war gut, jedoch auf lange Sicht gesehen, nicht dynamisch genug.
    bollens' Vorschlag geht in die Richtung, in die ich es auch jetzt habe.

    Also hab ich anhand euer Vorschläge selbst was gebaut.

    Probleme die ich noch habe:
    - Anzeige von Werten auf dem Rad, in den Feldern (als Text, nicht als Bild)
    - Ermittlung in welchem Feld es stehen geblieben ist (*)

    * Das war bei UEZ' Vorschlag zwar mit drin, aber aus den Berechnungen werde ich nicht ganz schlau. Wenn ich es richtig verstehe, wird einfach errechnet, wie weit es sich gedreht hat und welches Feld dann dort sein müsste, hm?
    Wo die Position zur Ermittlung ist, sei erst einmal dahingestellt.

    Jemand'n Ideechen?

  • Glücksrad! via GDI+?

    • Matricus
    • 24. Oktober 2013 um 21:45
    Zitat von UEZ

    Hier mal ein Prototyp.


    Dank' Dir! Ich werd' mich am Wochenende mal reinlesen.

    Beim spontanen Überfliegen sehe ich, dass die Beschriftungen auf dem Bild rein zur Darstellung sind, richtig?
    Die tatsächlichen Werte sind in $aFelder gespeichert.

    Zitat

    UEZ nett, aber er hält manchmal (jedes 2te Mal bei mir) auf dem schwarzen Strich, evtl. sollte man dann noch 2-3cm weiter drehen :D


    Kann man ja einbauen, dass es sich automatisch ein Stück weiterdreht. Daran soll es letztlich nun nicht scheitern. ;)

    Zitat

    Es soll nur als Ideengeber dienen, so dass Matricus was zum basteln hat.


    Und das ist es, definitiv! Ich werde mir das, wie gesagt, am Wochenende genauer anschauen und solange drehen, bis ich's Rad nicht mehr sehen kann. :D
    Da muss ich mich zwar wieder ein einiges einlesen, aber learning by doing ist eh der beste Weg für so etwas.

    Vielen Dank für deinen Entwurf!

    Ich setz den Thread erst einmal auf solved. Wenn ich weitere Hilfe brauche, lasse ich es euch wissen. ;)

    <3

  • Glücksrad! via GDI+?

    • Matricus
    • 23. Oktober 2013 um 20:15

    Danke euch beiden soweit! Wie immer schnelle und gute Hilfe. :)

    Zitat von BugFix

    Ich mach recht wenig mit Grafik, aber zu Glücksrad würden mir als erstes
    _GDIPlus_GraphicsDrawPie und
    _GDIPlus_MatrixRotate
    einfallen. Lies dich da mal ein und probiere die Bsp.

    Mit _GraphicsDrawPie komm ich klar und kann die Abschnitt auch dynamisch berechnen lassen - ist ja nicht sonderlich schwer - aber mit _MatrixRotate komm' ich nicht zurecht.
    Ick schau mal ob ich es nicht noch hinbekomme, aber hab' dafür nach der Arbeit und am Abend kaum noch einen Nerv für. ;)

    Zitat von bollen

    du kannst auch nur die Farben rotieren lassen. Ich hab ein beispiel angehängt, aber erst schauen wenn du selber eine Lösung hast!! sonst hat es ja keinen zweck ;)


    Ich hab reingeschmult - ich bin böse und hab das Geschenk schon vor allen anderen geöffnet. :whistling:
    Bitte nicht verhauen. ^^

    Wenn ich recht sehe, zeichnest du im Skript bei jeder "Rotation" die Felder neu bzw. lässt die Farben einfach aktualisieren/eine Position weiterrücken, sodass ein Rotationseffekt entsteht, hm?
    Jedenfalls eine interessante Methode. :)

    Kann man dazu auch noch Text in die Felder einblenden? Es würde reichen, wenn es am Anfang (vorm Drehen) und am Ende (nach dem Drehen) angezeigt wird.
    Ich würde spontan sagen, dass man zu Beginn bei der Bestimmung der Farben diesen direkt ein label mit abspeichert.

    Aber: Lassen sich labels mit Rotation X anzeigen, sodass man sie am Anfang & Ende in den Feldern mit einblenden kann?

    Edit: Beim Rumdoktorn an deinem Skript bollen ist mir auch aufgefallen, dass der pointer, der letztlich das ausgewählte Feld bestimmt z.B. nicht "zwischen" 2 Feldern sein kann ("knappe Drehungen" usw.), da die Felder ja nicht wirklich rotieren, sondern nur 'weitergereicht' werden.
    Wäre natürlich superb, wenn die tatsächliche Rotation möglich wäre.

  • Glücksrad! via GDI+?

    • Matricus
    • 23. Oktober 2013 um 17:51

    Post aktualisiert! Bitte in diesen Beitrag zur Aktualisierung schauen.

    Hey folks,

    ich beschäftige mich seit langem mal wieder mit AutoIt. Als "Aufwärmübung" wollte ich'n Glücksrad basteln.
    Sprich ein Kreis der sich auf Klick drehen lässt, wobei dieser in Bereiche unterteilt werden kann.

    Kurz um:
    - drehender Kreis
    - Kreis in X Bereiche unterteilbar
    - Fixpunkt um zu ermitteln in welchem Bereich der Fixpunkt nach dem Drehen ist

    Ich dachte dabei natürlich an GDI+ und unter anderem an _GDIPlus_GraphicsDrawArc, aber damit lassen sich innerhalb des Kreisen ja keine Bereiche festlegen.

    Da die Suche nichts hilfreiches ergeben hat die Frage: In welche Richtig sollte ich mich orientieren bzw. welche Funktionen wären hilfreich?
    Speziell um Bereiche zu definieren (die an den Abschnitt gebunden sind) usw.

    Cheers,
    Matricus

  • Schreibt keinen Registry Eintrag und kopiert Datei beim zweiten Mal nicht

    • Matricus
    • 14. Januar 2012 um 22:56

    Ich gehe einmal davon aus, dass du ein 64bit Betriebssystem hast du aber eine 32bit Applikation erzeugst.

    Falls dies zutrifft, so leitet Windows deine Anfragen auf Windows- oder Registry Verzeichnisse automatisch auf die 32bit Version um, anstatt, wie es nötig wäre, auf die 64bit Pfade zuzugreifen (Stichwort: Abwärtskompatibilität).
    In der Registry ist das HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\... bzw. \Windows\SysWOW64 bei Verzeichnisanfragen.

    Bei der Registry ist es möglich dies direkt zu umgehen (HKLM64\Software\... - siehe Hilfe), bei Pfaden jedoch nicht.

    Folgende Zeile einfach an den Anfang deines Scriptes setzen, dann sollte die Umleitung für Verzeichniszugriffe für das laufende Programm deaktiviert sein (und du musst nichts am Code ändern):

    [autoit]

    DllCall("kernel32.dll", "int", "Wow64DisableWow64FsRedirection", "int", 1)

    [/autoit]
  • Transparentes Fenster ohne $WS_EX_layered

    • Matricus
    • 14. Januar 2012 um 18:06

    Das bringt mich doch schon mal weiter, Danke.

    Nun müssen sich die erstellten controls nur noch bewegen lassen, was mit $GUI_WS_EX_Parentdrag kein Problem ist, jedoch bewegt sich dann, logischweise, nur 1 control.
    Wie lasse ich nun diese "controlgruppe" (oder Fenster) sich gemeinsam bewegen als wenn alle im selben Fenster wären?

    Gibt es da eine einfachere Methode als es per Event "nachzuschieben":

    Spoiler anzeigen
    [autoit]

    $W_Overlay_Ll1 = GUICreate("OvlMain", 50, 15, 100, 100, 0x80000000, -1, WinGetHandle(AutoItWinGetTitle()))
    $Ovl_Ll_test = GUICtrlCreateLabel("test", 0, 0, 50, 15, "", $GUI_WS_EX_PARENTDRAG)
    GUISetState()
    $W_Overlay_Ll2 = GUICreate("Ovl2", 150, 15, 100, 120, 0x80000000, -1, WinGetHandle(AutoItWinGetTitle()))
    $Ovl_Dat_test = GUICtrlCreateLabel("test1", 0, 0, 150 ,15)
    GUISetState()

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

    GUICtrlSetOnEvent($Ovl_Ll_Artist, "_GuiMove")

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

    while 1
    sleep(100)
    wend

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

    Func _GuiMove()
    Local $X. $Y, $aPos

    $aPos = WinGetPos("OvlMain")

    $X = $aPos[0]
    $Y = $aPos[1] + 20

    WinMove("Ovl2", "", $X, $Y)
    EndFunc

    [/autoit]
  • Dateipfad für Speicherdatei

    • Matricus
    • 13. Januar 2012 um 19:48

    Als Beispiel:

    [autoit]

    $ProgrammName = "Test"
    $Pfad = @UserProfileDir
    $DateiName = "Datei.txt"

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

    If Not FileExists($Pfad & "\" & $ProgrammName & "\" $DateiName) Then DirCreate($Pfad & "\" & $ProgrammName)

    [/autoit]

    Es wird geprüft ob die Datei "Datei.txt" in %userprofile%\Test vorhanden ist, wenn nicht wird der Ordner (%userprofile%\Test) angelegt.
    Anzumerken sei, dass du mit FileExists auch prüfen kannst ob ein Verzeichnis exisitiert - einfach den Dateinamen und letzten Backslash weglassen.

    %userprofile% entspricht C:\Benutzer\<Benutzername> (Bei XP oder älter wäre es C:\Dokumente und Einstellungen\<Benutzername>
    Der Laufwerksbuchstabe und sowas wird auch automatisch aktualisiert (auf das Windows-Laufwerk, was ja für gewöhnlich C: ist)
    Für mehr "Pfadmakros", wirf einen Blick in die Hilfedatei unter Makros.

    @ScriptDir entspricht z.B. dem aktuellen Pfad indem die .exe liegt.

  • Transparentes Fenster ohne $WS_EX_layered

    • Matricus
    • 13. Januar 2012 um 19:43

    Heyho,

    um es einem anderen Programm zu ermöglichen ein Fenster eines meiner Programme zu erfassen, welches transparent sein soll (nur controls sichtbar), darf dieses transparente Fenster nicht den Windows-Layered Stil verwenden, da es sonst für das Programm nicht "sichtbar" ist.

    Gibt es eine Möglichkeit ein transparentes Fenster ohne $WS_EX_LAYERED zu erstellen?
    GDI+ verwendet ja ebenfalls ein layered Fenster, jedenfalls soweit ich das gesehen habe.

    Entsprechender Code-Auszug:

    Spoiler anzeigen
    [autoit]

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

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

    $W_Overlay = GUICreate("Overlay", 200, 85, -1, -1,$WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOOLWINDOW))
    GUISetFont(10, 1,"", "Arial")
    $Ovl_Ll_Test = GUICtrlCreateLabel("Test", 16, 24, 40, 16,"",$GUI_WS_EX_PARENTDRAG)

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

    GUISetBkColor (0xE7AF22, $W_Overlay)
    _WinAPI_SetLayeredWindowAttributes($W_Overlay, 0xE7AF22, 255)

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

    GUISetState(@SW_SHOW, $W_Overlay)

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

    While 1
    Sleep(100)
    WEnd

    [/autoit]
  • GUI kontrollieren, trotz Schleife etc. (Adlib)

    • Matricus
    • 28. Oktober 2011 um 15:52
    Zitat von hellboy3

    Schön das du dir zu helfen weist, geht aber viel einfacher ;)

    [autoit]

    $cBG = GUICtrlCreatePic($path, 0, 0, 253, 149)
    GUICtrlSetState(-1, $GUI_DISABLE)

    [/autoit]

    Durch das $GUI_DISABLE sollten die Events ganz normal empfangen werden :)

    *-*
    Das ich auf solch eine einfache Lösung nicht komme... Ist aber immer so, ich denke zu kompliziert. ;)

    Vielen Dank dafür, funktioniert!

  • GUI kontrollieren, trotz Schleife etc. (Adlib)

    • Matricus
    • 28. Oktober 2011 um 15:20

    Okay, die Lösung war einfacher als gedacht.

    Das Script hat, so wie es gedacht war, schon funktioniert, nur seltsamerweise hat das "Hintergrundbild", die Splash Art, die Controls beim klicken überlagert, sodass keine Events empfangen wurden.
    Als ich nun das Image Control als letztes deklariert habe, funktionierten die Events wie gewünscht, nur mit dem Fehler, dass die Controls nun tatsächlich hinter dem Bild waren (nicht sicht- aber anklickbar).

    Als Lösung dafür: 2 GUIs erstellt (parent & child), eines für den Hintergrund, das andere als overlay für die controls.
    Etwas umständlicher, wird aber funktionieren...

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™