MatrixGadget

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Bisonte
Beiträge: 2470
Registriert: 01.04.2007 20:18

MatrixGadget

Beitrag von Bisonte »

Hallo...

Da hab ich doch mal mit dem Canvaszeug rumgespielt... und siehe da :

Code: Alles auswählen

;##### 
;##### Matrix Gadget
;##### 
;##### Matrix Routine von : AndyX (http://purebasic.fr/german/viewtopic.php?p=76436#p76436)
;##### 

EnableExplicit

Macro Center(Value, Max)
  (((Max) - (Value)) / 2)
EndMacro
 
Structure MatrixGadget_Structure
  text.s
  refresh.i
  thread.i
  halt.i
  font.i
  fontcolor.i
EndStructure

Procedure UpdateMatrixGadgetThread(Gadget)
  
  Protected i, j, xx, yy, scrollletter.c, Green.c, Letter, FontFarbe
  Protected StartTime = ElapsedMilliseconds()
  Protected *p.MatrixGadget_Structure
  
  If IsGadget(Gadget)
    If GadgetType(Gadget) = #PB_GadgetType_Canvas 
      Dim Array_Screen_Letters.Point(GetSystemMetrics_(#SM_CXSCREEN)/10, GetSystemMetrics_(#SM_CYSCREEN)/10)
      For i = 0 To GadgetHeight(Gadget) /10
        For j = 0 To GadgetWidth(Gadget) /10
          With Array_Screen_Letters(j,i)
            \x = Random(250)
            \y = Random(222)+33
          EndWith
        Next j
      Next i 
    Else
      ProcedureReturn #False
    EndIf
  Else
    ProcedureReturn #False
  EndIf 

  Repeat
    
    If IsGadget(Gadget) 
      If GadgetType(Gadget) = #PB_GadgetType_Canvas
        
        *p = GetWindowLong_(GadgetID(Gadget),#GWL_USERDATA)
        If *p\halt = 1
          Break
        EndIf
        
        StartDrawing(CanvasOutput(Gadget))
        Box(0,0,GadgetWidth(Gadget),GadgetHeight(Gadget),0)
        For i = 0 To GadgetHeight(Gadget) /10
          For j = 0 To GadgetWidth(Gadget) /10
            With Array_Screen_Letters(j,i)
              DrawText(j*10,i*10,Chr(\y),RGB(0,\x,0),0)
            EndWith
          Next j
        Next i
        
        If Len(*p\text)>0
                    
          DrawingMode(#PB_2DDrawing_Default|#PB_2DDrawing_Transparent)
          If IsFont(*p\font)
            DrawingFont(FontID(*p\font))
          EndIf
          If *p\fontcolor = -1
            FontFarbe = #White
          EndIf
          
          DrawText(Center(TextWidth(*p\Text), GadgetWidth(Gadget)),Center(TextHeight(*p\Text), GadgetHeight(Gadget)),*p\Text,FontFarbe)
          
        EndIf
        
        For i = GadgetHeight(Gadget)/10 To 0 Step -1
          For j = GadgetWidth(Gadget)/10 To 0 Step -1
            If i And Random(1)=0
              scrollletter.c = Array_Screen_Letters(j,i-1)\y
              Green.c = Array_Screen_Letters(j,i-1)\x
              With Array_Screen_Letters(j,i)
                If Random(3)<>1
                  Letter = scrollletter
                Else
                  Letter = Random(222)+33
                EndIf
                \x = Green - Random(1)
                If \x <= 0
                  \x = Random(250)
                  \y = Random(222)+33
                EndIf
              EndWith
            ElseIf (Not i) And Random(1)=0
              With Array_Screen_Letters(j,i)
                \y = Random(222)+33
                \x = Random(250)
              EndWith
            EndIf
          Next j
        Next i      
        
        StopDrawing()
      Else
        Break
      EndIf
      
    Else
      Break      
    EndIf
    
    Repeat
      If ElapsedMilliseconds() - StartTime >= *p\refresh
        StartTime = ElapsedMilliseconds()
        Break
      EndIf
      Delay(1)
    ForEver
    
  ForEver
  
  FreeMemory(*p)
  FreeArray(Array_Screen_Letters())

EndProcedure
Procedure MatrixGadget(Gadget, x, y, w, h, Refresh = 60, Text.s = "", Font = 0, FontColor = -1)
  
  Protected Result, GadNr, Thread
  Protected *p.MatrixGadget_Structure
  
  If #PB_Compiler_Version<460
    MessageRequester("","Es wird PB 4.6 benötigt")
    End  
  EndIf
  
  If Gadget = #PB_Any
    Result = CanvasGadget(#PB_Any, x, y, w, h)
    GadNr = Result  
  Else
    Result = CanvasGadget(Gadget, x, y, w, h)
    GadNr = Gadget
  EndIf
  
  *p = AllocateMemory(SizeOf(MatrixGadget_Structure))
  ;InitializeStructure(*p, MatrixGadget_Structure)
  *p\text = Text
  *p\refresh = refresh
  Thread = CreateThread(@UpdateMatrixGadgetThread(),GadNr)
  *p\thread = Thread
  *p\font = Font
  *p\fontcolor = FontColor
  
  SetWindowLong_(GadgetID(GadNr),#GWL_USERDATA,*p)
  
  ProcedureReturn Result

EndProcedure
Procedure SetMatrixGadgetRefresh(Gadget, Refresh)
  
  Protected *p.MatrixGadget_Structure
  
  If IsGadget(Gadget)
    *p.MatrixGadget_Structure = GetWindowLong_(GadgetID(Gadget),#GWL_USERDATA)
    If *p
      If IsThread(*p\thread)
        *p\refresh = Refresh
        SetWindowLong_(GadgetID(Gadget),#GWL_USERDATA,*p)
      EndIf
    EndIf
  EndIf
  
EndProcedure
Procedure SetMatrixGadgetText(Gadget, Text.s = "", Font = 0, FontColor = -1)
  
  Protected *p.MatrixGadget_Structure
  
  If IsGadget(Gadget)
    *p.MatrixGadget_Structure = GetWindowLong_(GadgetID(Gadget),#GWL_USERDATA)
    If *p
      If IsThread(*p\thread)
        *p\text = text
        If IsFont(Font)
          *p\font = Font
        EndIf
        If FontColor>-1
          *p\fontcolor = FontColor
        EndIf
        
        SetWindowLong_(GadgetID(Gadget),#GWL_USERDATA,*p)
      EndIf
    EndIf
  EndIf
  
EndProcedure
Procedure FreeMatrixGadget(Gadget)
  
  Protected *p.MatrixGadget_Structure
  
  If IsGadget(Gadget)
    *p.MatrixGadget_Structure = GetWindowLong_(GadgetID(Gadget),#GWL_USERDATA)
    If *p
      If IsThread(*p\thread)
        *p\halt = 1
        WaitThread(*p\thread)
        FreeGadget(Gadget)
      EndIf
    EndIf
  EndIf  
  
EndProcedure

DisableExplicit

;##### Testlauf

FontNummer = LoadFont(#PB_Any, "Comic Sans MS",18)
Window = OpenWindow(#PB_Any, 0, 0, 640, 260, "MatrixGadget Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
mGadget = MatrixGadget(#PB_Any, 0, 0, 640, 200, 60, "Das MatrixGadget", FontNummer)
tracker = TrackBarGadget(#PB_Any, 10, 220, 300, 30, 10, 200, #PB_TrackBar_Ticks)
text    = TextGadget(#PB_Any, 320, 225, 50, 20, "60 ms")
button  = ButtonGadget(#PB_Any, 380, 225, 100, 20, "RandomSize")
GadgetToolTip(tracker, "Refreshrate einstellen")
SetGadgetState(tracker, 60)

Repeat : 
  
  Event=WaitWindowEvent(25)  
  
  If Event =#PB_Event_Gadget
    Select EventGadget()
      Case button
        w = Random(640) : h = Random(200)
        x = Center(w, 640) : y = Center(h, 200)
        ResizeGadget(mGadget, x, y, w, h)
      Case tracker
        SetMatrixGadgetRefresh(mGadget, GetGadgetState(tracker))
        SetGadgetText(text, Str(GetGadgetState(tracker))+" ms")
      Case mGadget
        Select EventType()
          Case #PB_EventType_MouseEnter            
            SetMatrixGadgetText(mGadget, "nich klicken... nein nicht")
          Case #PB_EventType_MouseLeave
            SetMatrixGadgetText(mGadget, "Das MatrixGadget")
          Case #PB_EventType_LeftButtonDown 
            SetMatrixGadgetText(mGadget, "AUA !!")
      EndSelect
    EndSelect
 
  EndIf
  
Until Event = #PB_Event_CloseWindow
FreeMatrixGadget(mGadget)
End
Ich weiss... kann man auch mit ImageGadget machen.
Wenn man SetGadgetData() nicht braucht, kann das ganze auch auf anderen Systemen laufen.
(da ist ein Stück WindowAPI drin)

Einzige Haken, wenn man das Programm beenden will muss man das Gadget explizit freigeben,
damit es nicht zu einer Fehlermeldung ala Gadget ist nicht initialisert kommt, wobei ich doch Abfrage
ob das Gadget da ist oder nicht... wenn jemand da nen Tipp hat...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: MatrixGadget

Beitrag von STARGÅTE »

:angry: Irgendwie hatte ich gerade an eine andere Matrix gedacht.

Aber trotzdem nett anzusehen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: MatrixGadget

Beitrag von RSBasic »

Sieht gut aus. :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: MatrixGadget

Beitrag von rolaf »

STARGÅTE hat geschrieben::angry: Irgendwie hatte ich gerade an eine andere Matrix gedacht.
:lol: ick och, "MatrixGadget" hat sich so seriös angehört.
Aber cool ist es, möge Neo mit uns sein...
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
Bisonte
Beiträge: 2470
Registriert: 01.04.2007 20:18

Re: MatrixGadget

Beitrag von Bisonte »

/ot
Ihr habt wohl nur noch 3D im Kopp ? :lol:
ot/

Hat denn vielleicht einer ne Idee wie man das Problem des nicht initialisierten Gadgets in einem Thread löst ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: MatrixGadget

Beitrag von DarkDragon »

Ist es normal, dass sich die Buchstaben nur in der ersten Zeile ändern?
Bisonte hat geschrieben:/ot
Ihr habt wohl nur noch 3D im Kopp ? :lol:
ot/
Wieso? Lineare Algebra beschränkt sich nicht auf die dritte Dimension.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Bisonte
Beiträge: 2470
Registriert: 01.04.2007 20:18

Re: MatrixGadget

Beitrag von Bisonte »

DarkDragon hat geschrieben:Ist es normal, dass sich die Buchstaben nur in der ersten Zeile ändern?
Äh ja. Wenn das anders wäre, dann wäre es ein unendliches Gezappel ...
Die Erste Zeile soll ja nur den "Farbeffekt" grafisch einläuten.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten