Hi again, ...
wie gesagt hat mich das Thema interessiert (da ich's ja vermutlich selber bei uns einsetzen werde).
Also hab ich mich mal hingesetzt und was Kleines zusammengestrickt.
Das "Look & Feel" gefällt mir soweit ganz gut und ist eigentlich wie man es von einem normalen Touch-Handy kennt:
- Durch Touch und bewegen rauf/runter kann individuell gescrollt werden
- AutoScrolling starten durch Touch+Bewegen+Loslassen während der Bewegung
- AutoScrolling stoppen durch nochmaligen Touch
- Ein einfacher Touch (ohne Bewegung) bedeutet "anklicken" einer Zeile
Vielleicht gefällt's ja dem ein oder anderen.
Code: Alles auswählen
EnableExplicit
Define AnzIMG = 120
Define IMGWidth = 350
Define IMGHeight = 40
Dim image(AnzIMG-1)
Dim IGadget(AnzIMG-1)
Define n.i, Event.i, EGadget.i, Quit.l
Define MBDown.l = #False
Define MBYDown.i, MBXDown.i, SelectedLine.i
Define MBDownYScrollPos.l, LastYScrollPos.l, LastYMousePos.l
Define YScrollSpeed.f, ActAutoScrollMSec.i, LastAutoScrollMSec.i, ScrolledYDistance.f, AutoScrolling.l, ScrollStopped.l
Define MMoveYPos1.l, MMoveYPos2.l, MMoveMSec1.i, MMoveMSec2.i
Structure MMove
XPos.l
YPos.l
MSec.i
EndStructure
NewList MouseMove.MMove()
#WinMain = 0
#Scr_Gadget01 = 0
#STB_Main = 0
#PB_Event_MouseMove = 512
#PB_Event_LMBDown = 513
#PB_Event_LMBUp = 514
For n = 0 To AnzIMG-1
image(n) = CreateImage(#PB_Any, IMGWidth, IMGHeight)
If image(n)
If StartDrawing(ImageOutput(image(n)))
Box(0,0,ImageWidth(image(n)),ImageHeight(image(n)),$FFFFFF-(n%2)*$22222)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(20,10,"Zeile "+Str(n+1),0)
StopDrawing()
EndIf
EndIf
Next n
If OpenWindow(#WinMain,100,100,400,600,"Touch-Scrolling")
If CreateStatusBar(#STB_Main, WindowID(#WinMain))
AddStatusBarField(WindowWidth(#WinMain))
StatusBarText(#STB_Main, 0, "Waiting for Touch")
EndIf
ScrollAreaGadget(#Scr_Gadget01,10,10,WindowWidth(#WinMain)-20, WindowHeight(#WinMain)-20-StatusBarHeight(#STB_Main), IMGWidth, AnzIMG*IMGHeight)
For n = 0 To AnzIMG-1
IGadget(n) = ImageGadget(#PB_Any,0,n*IMGHeight,IMGWidth,IMGHeight,ImageID(image(n)))
Next n
Quit = #False
Else
Quit = #True
EndIf
While Not Quit
If AutoScrolling
Event = WaitWindowEvent(AutoScrolling*2)
If AutoScrolling <> #True
If WindowMouseX(#WinMain) < GadgetX(#Scr_Gadget01) Or WindowMouseX(#WinMain) > GadgetX(#Scr_Gadget01)+GadgetWidth(#Scr_Gadget01) Or WindowMouseY(#WinMain) < GadgetY(#Scr_Gadget01) Or WindowMouseY(#WinMain) > GadgetY(#Scr_Gadget01)+GadgetHeight(#Scr_Gadget01)
Event = #PB_Event_LMBUp
ScrollStopped = #True
EndIf
EndIf
Else
Event = WaitWindowEvent()
EndIf
EGadget = EventGadget()
; Debug Str(Event)+" "+Str(EGadget)
Select Event
Case #PB_Event_CloseWindow
Quit = #True
Case #PB_Event_Gadget
ScrollStopped = AutoScrolling
AutoScrolling = #False
For n = 0 To AnzIMG-1
If EGadget = IGadget(n)
MBDown = #True
MBXDown = WindowMouseX(#WinMain)
MBYDown = WindowMouseY(#WinMain)
MBDownYScrollPos = GetGadgetAttribute(#Scr_Gadget01,#PB_ScrollArea_Y)
SelectedLine = n
LastYScrollPos = MBDownYScrollPos
LastYMousePos = MBYDown
StatusBarText(#STB_Main, 0, "You've touched Line "+Str(n+1))
Break
EndIf
Next n
Case #PB_Event_MouseMove
If MBDown
SetGadgetAttribute(#Scr_Gadget01,#PB_ScrollArea_Y, LastYScrollPos-WindowMouseY(#WinMain)+LastYMousePos)
LastElement(MouseMove())
AddElement(MouseMove())
MouseMove()\XPos = WindowMouseX(#WinMain)
MouseMove()\YPos = WindowMouseY(#WinMain)
MouseMove()\MSec = ElapsedMilliseconds()
If ListSize(MouseMove()) > 20
FirstElement(MouseMove())
DeleteElement(MouseMove(),1)
EndIf
AutoScrolling = 20
StatusBarText(#STB_Main, 0, "Touch-Scrolling ...")
EndIf
Case #PB_Event_LMBUp
If MBDown
MBDown = #False
If Abs(MBYDown - WindowMouseY(#WinMain)) < 4 And ListSize(MouseMove()) < 4 And Not ScrollStopped
; Eine Zeile wurde angeklickt !!!
Debug "Zeile "+Str(SelectedLine+1)+" wurde angeklickt."
StatusBarText(#STB_Main, 0, "===> You've selected Line "+Str(SelectedLine+1)+ "<===")
Else
AutoScrolling = #False
ScrollStopped = #False
If ListSize(MouseMove())
FirstElement(MouseMove())
MMoveYPos1 = MouseMove()\YPos
MMoveMSec1 = MouseMove()\MSec
LastElement(MouseMove())
MMoveYPos2 = MouseMove()\YPos
MMoveMSec2 = MouseMove()\MSec
YScrollSpeed = 0
If MMoveMSec1 <> MMoveMSec2
YScrollSpeed = (MMoveYPos1 - MMoveYPos2) / (MMoveMSec2 - MMoveMSec1)
EndIf
If Abs(YScrollSpeed) > 0.1 And ElapsedMilliseconds() - MMoveMSec1 < 200
LastAutoScrollMSec = ElapsedMilliseconds()
LastYScrollPos = GetGadgetAttribute(#Scr_Gadget01,#PB_ScrollArea_Y)
ScrolledYDistance = 0
AutoScrolling = #True
EndIf
EndIf
EndIf
ClearList(MouseMove())
EndIf
EndSelect
If AutoScrolling = #True
ActAutoScrollMSec = ElapsedMilliseconds()
If ActAutoScrollMSec <> LastAutoScrollMSec
ScrolledYDistance = ScrolledYDistance + (ActAutoScrollMSec - LastAutoScrollMSec) * YScrollSpeed
SetGadgetAttribute(#Scr_Gadget01,#PB_ScrollArea_Y, LastYScrollPos + ScrolledYDistance)
YScrollSpeed = YScrollSpeed * 0.98 - Sign(YScrollSpeed)/1000
LastAutoScrollMSec = ActAutoScrollMSec
StatusBarText(#STB_Main, 0, "AutoScrolling at Speed: "+StrF(YScrollSpeed*1000,1)+" Pixel / Second")
If Abs(YScrollSpeed) < 0.04 Or LastYScrollPos + ScrolledYDistance < 0 Or LastYScrollPos + ScrolledYDistance > GetGadgetAttribute(#Scr_Gadget01,#PB_ScrollArea_InnerHeight)-GadgetHeight(#Scr_Gadget01)
YScrollSpeed = 0
AutoScrolling = #False
StatusBarText(#STB_Main, 0, "AutoScrolling has stopped.")
EndIf
EndIf
EndIf
Wend
Bei Fragen : Einfach fragen.
Gruß, PL.
[Edit:]
Kiffi hat geschrieben:Top!

VIELEN DANK !!!
[Edit2] Hab noch ein paar "Debug"s rausgelöscht.
[Edit3] Hab's nochmal ein wenig verfeinert um den Verlust des MBUp-Events beim Verlassen des Fensters abzufangen (siehe Post von STARGÅTE weiter unten).