[praktisch] Beschreibbares Kästchenpapier in eigener GUI - Beispiel

  • Hi!

    Ich brauchte letztens etwas um einem Klassenkameraden eine mathematische Rechnung zu verdeutlichen, dazu baute ich mir ein GUI mit Kästchenpapier.

    Das half so, das ich dafür zwei rudimentäre Funktionen geschrieben habe, _SetText mit welcher man den Text des Kästchenpapiers ändern kann, und _Clear, welche die gesamte Seite säubert.

    Wenn Interesse besteht baue ich auch noch mehr Funktionen ein wie z.B. das Ändern einer einzelnen Zeile.
    Das fertige Ding mit den Funktionen passt in 85 Zeilen.

    Vlt. mach ich irgendwann noch ne UDF daraus, mal sehen, dann aber mit GDE statt naja...

    Das Skript:

    Skript
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <StaticConstants.au3>
    $hGUI = GUICreate("", @desktopwidth, @desktopheight, 0, 0, $WS_POPUP, $WS_EX_TOPMOST)
    GUISetBkColor(0x000000)
    GUISetState()
    ;campweb
    #region Create
    $Big = 10
    ToolTip("Please wait while creating...")
    Dim $Label[10000]
    $It = 0
    For $x = 1 To @DesktopWidth Step $Big*2
    For $y = 1 To @DesktopHeight Step $Big*2
    $It += 1
    $Label[$It] = GUICtrlCreateLabel("", $x, $y, ($Big*2)-1, ($Big*2)-1, $SS_CENTER)
    GUICtrlSetFont(-1, 12, default, default, "Courier New")
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    Next
    Next
    ToolTip("Created!")
    #endregion
    _SetText($hGUI, "Hallo, du da! CRLF" & _
    "Zweite Zeile? CRLF" & _
    "CRLF" & _
    " 100 CRLF" & _
    "+ 900 CRLF" & _
    "----- CRLF" & _
    " 1000 CRLF" & _
    "CRLF" & _
    "CRLF" & _
    "by campweb (2011) CRLF" & _
    "ESC for the next! CRLF" & _
    "Look at autoit.de for more cool stuff from CRLF"& _
    "others and me!")
    Do
    ToolTip("Wieso kann ich eigentlich keine toten ToolTips löschen? Es ist "&@hour&" Uhr "&@min&".")
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    _Clear($hGUI)
    Sleep(2000)

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

    Func _Clear($hGUI)
    GUISwitch($hGUI)
    ToolTip("Please wait while clearing...")
    For $i = 1 To (Int(@DesktopWidth/20))*(Int(@Desktopheight/20))
    GUICtrlSetData($Label[$i], "")
    Next
    ToolTip("Cleared!")
    EndFunc

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

    Func _SetText($hGUI, $Text)
    GUISwitch($hGUI)
    ToolTip("Please wait while setting Text...")
    $Data = $Text
    $aAll = StringSplit($Data, "CRLF", 1)
    For $e = 1 To $aAll[0]
    $sData = $aAll[$e]
    $aData = StringSplit($sData, "")
    For $i = 0 To UBound($aData)-2
    $Const = $e+1
    If $aData[$i+1] > (@DesktopWidth/20) Then
    ConsoleWrite("Text Line Error: Longer then Desktopwidth!")
    Exit
    EndIf
    $Textt = $aData[$i+1]
    GUICtrlSetData($Label[((@desktopheight/20)*$i-1)+($Const)], $Textt)
    Next
    Next
    ToolTip("Text set!")
    EndFunc

    [/autoit]

    MfG, campweb

    3 Mal editiert, zuletzt von campweb (13. September 2011 um 17:39)

    • Offizieller Beitrag

    [OT]

    Noch kein Feedback oder Vorschläge?


    Du postest 21:30 Uhr und pushst deinen Thread am Folgetag um 7:30 Uhr wegen mangelnden Feedbacks! :thumbdown:
    Bist du so geil nach Lobhudelei und Anerkennung, dass du nicht abwarten kannst bis im normalen Zeitablauf jemand dein Skript begutachtet?
    Übrigens ist es förderlich das Skript nicht nur anzuhängen, sondern auch im Thread zu posten. Ich persönlich lade nicht ein Skript herunter, nur um mal einen Blick drauf zu werfen. Wozu haben wir den solch gutes Online-Syntaxhighlighting? Warum soll ich da ein Skript noch extra in den Editor laden?
    [/OT]

  • Nein tut es nicht.

    Dann interpretiert die SetText Funktion nämlich die @crlf als 2 @crlf, rückt also in die übernächste Zeile, und ohne das ganze & und " Gehabe ists für mich angenhemer :)

    EDIT: Nun deutlich kürzer und schneller ;)

    MfG, campweb

    Einmal editiert, zuletzt von campweb (13. September 2011 um 17:40)

  • Ich finde die Idee des Scripts gut :)
    Vielleicht hilft dir mein Ansatz bei deiner Realisierung weiter:

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <StaticConstants.au3>
    #include <GDIPlus.au3>
    #include <array.au3>

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

    $width = 200
    $height = 200
    $hWnd = GUICreate("7 + 3 = 10", $width, $height)
    GUISetBkColor(0x000000)
    GUISetState()
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd) ;create graphic
    $ParticleBitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $hGraphic) ;create bitmap
    $ParticleBuffer = _GDIPlus_ImageGetGraphicsContext($ParticleBitmap) ;create buffer
    $size = 20

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

    Dim $rect[7][2] ; Kästchenpositionen
    $rect[0][1] = 3 ; 7
    $rect[1][1] = 4 ; +
    $rect[2][1] = 4 ; 3
    $rect[3][1] = 5 ; =
    $rect[4][1] = 5 ; 1
    $rect[5][1] = 5 ; 0
    $rect[6][1] = 5 ; Strich über dem Ergebnis

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

    $rect[0][0] = 6 ; wie oben
    $rect[1][0] = 4
    $rect[2][0] = 6
    $rect[3][0] = 4
    $rect[4][0] = 5
    $rect[5][0] = 6
    $rect[6][0] = 4

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

    For $i = 0 To 6 ; Kästchen bestimmen
    getSquare($rect[$i][0], $rect[$i][1])
    Next

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

    Do

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

    _GDIPlus_GraphicsClear($ParticleBuffer, 0xFFFFFFFF)
    For $i = 1 To ($height / $size) ; Horizontale Linien
    _GDIPlus_GraphicsDrawLine($ParticleBuffer, 0, $size * $i, $width, $size * $i)
    Next
    For $i = 1 To ($width / $size) ; Vertikale Linien
    _GDIPlus_GraphicsDrawLine($ParticleBuffer, $size * $i, 0, $size * $i, $height)
    Next

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

    _GDIPlus_GraphicsDrawString($ParticleBuffer, "7", $rect[0][0], $rect[0][1] - 2, "Arial", 15) ; Matheaufgabe: 7 + 3 = 10
    _GDIPlus_GraphicsDrawString($ParticleBuffer, "+", $rect[1][0], $rect[1][1] - 2, "Arial", 15)
    _GDIPlus_GraphicsDrawString($ParticleBuffer, "3", $rect[2][0], $rect[2][1] - 2, "Arial", 15)
    _GDIPlus_GraphicsDrawString($ParticleBuffer, "=", $rect[3][0], $rect[3][1] - 2, "Arial", 15)
    _GDIPlus_GraphicsDrawString($ParticleBuffer, "1", $rect[4][0], $rect[4][1] - 2, "Arial", 15)
    _GDIPlus_GraphicsDrawString($ParticleBuffer, "0", $rect[5][0], $rect[5][1] - 2, "Arial", 15)

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

    _GDIPlus_GraphicsDrawLine($ParticleBuffer, $rect[6][0], $rect[6][1], $rect[6][0] + $size * 3 - 1, $rect[6][1]) ; Strich über dem Ergebnis

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

    _GDIPlus_GraphicsDrawImageRect($hGraphic, $ParticleBitmap, 0, 0, $width, $height)

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

    Until Sleep(10) And GUIGetMsg() = -3

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

    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BitmapDispose($ParticleBitmap)
    _GDIPlus_GraphicsDispose($ParticleBuffer)
    _GDIPlus_Shutdown()
    Exit

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

    Func getSquare(ByRef $xpos, ByRef $ypos) ; Funktion zur Bestimmung des gewünschten Feldes (Kästenchens)
    $xpos = ($xpos - 1) * $size + 1
    $ypos = ($ypos - 1) * $size + 1
    EndFunc ;==>getSquare

    [/autoit]

    Ich würde mich freuen, wenn man auch etwas komplexere Rechnungen (nicht vom Rechnen her 'schwierig',
    sondern vom Aufschreiben - z.B. schriftliches Multiplizieren/Dividieren) angezeigt bekommen könnte ;).

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!