'############################################################################################################## Type Form_Type V_Next as Form_Type Ptr V_Prev as Form_Type Ptr V_WinID as UInteger V_PosX As Integer V_PosY As Integer V_Width As UInteger V_Height As UInteger End Type '-------------------------------------------------------------------------------------------------------------- Dim Shared G_Form_First As Form_Type Ptr Dim Shared G_Form_Last As Form_Type Ptr Dim Shared G_FormC As Uinteger Dim Shared G_FormIDC As Uinteger '############################################################################################################## Function F_Form_Add(V_PosX As Integer, V_PosY As Integer, V_Width As UInteger, V_Height as UInteger) as UInteger 'Ein Neues Fenster muss an das ende der Liste anhängt werden. If G_Form_Last <> 0 Then G_Form_Last->V_Next = CAllocate(SizeOf(Form_Type)) G_Form_Last->V_Next->V_Prev = G_Form_Last G_Form_Last = G_Form_Last->V_Next Else G_Form_Last = CAllocate(SizeOf(Form_Type)) G_Form_First = G_Form_Last End If 'fenster-id hoch zählen G_FormIDC += 1 'parameter in die typenstruktur eintragen With *G_Form_Last .V_WinID = G_FormIDC .V_PosX = V_PosX .V_PosY = V_PosY .V_Width = V_Width .V_Height = V_Height End With Return G_FormIDC End Function '############################################################################################################## Sub F_Form_SetFocus(V_FID As Uinteger) Dim TPtr as Form_Type Ptr = G_Form_First 'Zuerst muss der Pointer des Fensters gesucht werden, welches ganznach oben muss 'Die Suchreihenfolge (vorwerts, rückwerts) ist hier egal. Hier geht es nur um die Fenster-ID Do Until TPtr = 0 If TPtr->V_WinID = V_FID Then Exit Do TPtr = TPtr->V_Next Loop If TPtr = 0 Then Exit Sub 'Wenn kein Pointer gefunden wurde, dann kann die sub verlassen werden If TPtr->V_Next = 0 Then Exit Sub 'Wenn das Fenster bereits ganz oben ist, brauchen wir es nicht verschieben -> sub verlassen 'Den Pointer aus der LinkedList heraus nehmen If TPtr->V_Prev <> 0 Then TPtr->V_Prev->V_Next = TPtr->V_Next If TPtr->V_Next <> 0 Then TPtr->V_Next->V_Prev = TPtr->V_Prev If G_Form_First = TPtr Then G_Form_First = TPtr->V_Next 'Ausgeschnittenen Pointer am ende wieder einfügen G_Form_Last->V_Next = TPtr TPtr->V_Prev = G_Form_Last TPtr->V_Next = 0 G_Form_Last = TPtr End Sub '############################################################################################################## Sub F_Form_Redraw() ScreenLock() CLS() Dim TPtr as Form_Type Ptr = G_Form_First 'Hier muss die LL vorwerts durchlaufen werden Do Until TPtr = 0 With *TPtr 'füllung / rahmen / text Line(.V_PosX, .V_PosY)-(.V_PosX + .V_Width, .V_PosY + .V_Height), &HFFFFFF, BF Line(.V_PosX, .V_PosY)-(.V_PosX + .V_Width, .V_PosY + .V_Height), &H0000FF, B Draw String (.V_PosX + 5, .V_PosY + 5), Str(.V_WinID), &H000000 End With TPtr = TPtr->V_Next Loop ScreenUnLock() End Sub '############################################################################################################## Sub F_Form_CheckMouse() Dim MX As Integer Dim MY As Integer Dim MZ As Integer Dim MB As Integer Dim BV As Integer BV = Getmouse(MX, MY, MZ, MB) If BV <> 0 Then Exit Sub 'unbekannter Fehler If MB = -1 Then Exit Sub 'Keine Maus gefunden If MB = 0 Then Exit Sub 'wenn kein Button gedrückt 'liste RÜCKWÄRTS!!! durchlaufen Dim TPtr as Form_Type Ptr = G_Form_Last Do Until TPtr = 0 With *TPtr 'ist maus im fenster? If (MX >= .V_PosX) and (MX <= .V_PosX + .V_Width) Then If (MY >= .V_PosY) and (MY <= .V_PosY + .V_Height) Then 'dann fokusieren F_Form_SetFocus(.V_WinID) 'und sub verlassen, da fertig exit sub End If End If End With TPtr = TPtr->V_Prev Loop End Sub '############################################################################################################## Screenres 1024, 768, 24 '10 fenster erzeugen For X as UInteger = 1 to 10 F_Form_Add(X * 25, X * 25, 100, 100) Next 'hauptschleife Do until InKey() = Chr(27) 'auf ESC warten F_Form_CheckMouse() 'mausereignisse prüfen F_Form_Redraw() 'neuzeichnen Sleep 10, 1 Loop Screen 0 End