Basic Mouse Gesture

Share your advanced PureBasic knowledge/code with the community.
Nico
Enthusiast
Enthusiast
Posts: 274
Joined: Sun Jan 11, 2004 11:34 am
Location: France

Basic Mouse Gesture

Post by Nico »

Simple example to create a basic Mouse Gesture.


Download at first the image here:trace.png, and save as to "c:\trace.png"

Compile, then you can try the various proposed figures.

To begin a figure, a click left of the button of the mouse pushed and maintained during the duration of the plan in the aera client window.

Code: Select all

 UsePNGImageDecoder()

 Global HookMouse.l,mouvement.s
 
 Procedure Compare(Chaine_Decripte.s)
    Select Len(Chaine_Decripte)
        Case 4
            Select Chaine_Decripte
                Case "GGGG":MessageRequester("Find"," Trace N°1")
                Case "DDDD":MessageRequester("Find"," Trace N°2")
                Case "HHHH":MessageRequester("Find"," Trace N°3")
                Case "BBBB":MessageRequester("Find"," Trace N°4")
            EndSelect 
               
        Case 8
            Select Chaine_Decripte
                Case "HHHHGGGG":MessageRequester("Find"," Trace N°5")
                Case "HHHHDDDD":MessageRequester("Find"," Trace N°6")
                Case "BBBBGGGG":MessageRequester("Find"," Trace N°7")
                Case "BBBBDDDD":MessageRequester("Find"," Trace N°8")
                Case "DDDDHHHH":MessageRequester("Find"," Trace N°9")
                Case "GGGGHHHH":MessageRequester("Find"," Trace N°10")
                Case "DDDDBBBB":MessageRequester("Find"," Trace N°11")
                Case "GGGGBBBB":MessageRequester("Find"," Trace N°12")
            EndSelect 
            
        Case 12
            Select Chaine_Decripte
                Case "DDDDBBBBGGGG":MessageRequester("Find"," Trace N°13")
                Case "BBBBGGGGHHHH":MessageRequester("Find"," Trace N°14")
                Case "GGGGHHHHDDDD":MessageRequester("Find"," Trace N°15")
                Case "HHHHDDDDBBBB":MessageRequester("Find"," Trace N°16")
                Case "DDDDHHHHGGGG":MessageRequester("Find"," Trace N°17")
                Case "BBBBDDDDHHHH":MessageRequester("Find"," Trace N°18")
                Case "GGGGBBBBDDDD":MessageRequester("Find"," Trace N°19")
                Case "HHHHGGGGBBBB":MessageRequester("Find"," Trace N°20")

                Case "DDDDHHHHDDDD":MessageRequester("Find"," Trace N°21")
                Case "GGGGBBBBGGGG":MessageRequester("Find"," Trace N°22")
                Case "DDDDBBBBDDDD":MessageRequester("Find"," Trace N°23")
                Case "GGGGHHHHGGGG":MessageRequester("Find"," Trace N°24")
                Case "HHHHDDDDHHHH":MessageRequester("Find"," Trace N°25")
                Case "BBBBGGGGBBBB":MessageRequester("Find"," Trace N°26")
                Case "HHHHGGGGHHHH":MessageRequester("Find"," Trace N°27")
                Case "BBBBDDDDBBBB":MessageRequester("Find"," Trace N°28")
            
            EndSelect 
    EndSelect    
 EndProcedure
 
 Procedure Decript()
    Protected Doublon.l,Caractere.s,Caractere_precedent.s
    Protected Chaine_Decripte.s
    
    Doublon=0
    Chaine_Decripte=""
    Caractere_precedent=""
    
    If Len(mouvement)>3
      For a=1 To Len(mouvement)
        Caractere.s=Mid(mouvement, a, 1)
        
        If Caractere_precedent=Caractere
          Doublon=Doublon+1
        Else
          Doublon=0
        EndIf
  
        If Doublon<4
          Chaine_Decripte=Chaine_Decripte+Caractere
        EndIf 
      
        Caractere_precedent=Caractere
      Next a
      
      Debug Chaine_Decripte
    
      Compare(Chaine_Decripte)
    EndIf 
 EndProcedure
 
 
 Procedure MouseGesture(x.l,y.l,reset.l)
    Protected signeX.l,signeY.l,Diff_x.l,Diff_y.l
    Static xp.l,yp.l
    
    If reset
       xp=x
       yp=y
       mouvement=""
      ProcedureReturn 1
    EndIf
   
    signeX=0 : signeY=0
   
    Diff_x=x-xp : Diff_y=y-yp

    If Diff_x<0 :Diff_x= -Diff_x:signeX=1:EndIf
    If Diff_y<0 :Diff_y= -Diff_y:signeY=1:EndIf
   
    If Diff_x >10 Or Diff_y >10
;         Debug Diff_x
;         Debug Diff_y
;         Debug signe
       
        If Diff_x >Diff_y
           If signeX
              mouvement=mouvement+"G"
           Else
              mouvement=mouvement+"D"
           EndIf
        Else
           If signeY
              mouvement=mouvement+"H"
           Else
              mouvement=mouvement+"B"
           EndIf
        EndIf
        xp=x
        yp=y
    EndIf

    ProcedureReturn 1
 EndProcedure
 
 

ProcedureDLL HookMouse(nCode, wParam, lParam)
  Static Start.l

  If nCode < 0
    ProcedureReturn CallNextHookEx_(HookMouse, nCode, wParam, lParam)
  EndIf
  
   *MOUSESTRUCT.MOUSEHOOKSTRUCT = lParam
   *position.POINT=*MOUSESTRUCT\pt

   Select wParam
        Case #WM_MOUSEMOVE
            If Start
              MouseGesture(*position\x,*position\y,0)
            EndIf 
            
         Case #WM_LBUTTONDOWN
            Start=1
            MouseGesture(*position\x,*position\y,1)
            
         Case #WM_LBUTTONUP
            Start=0
            Decript()
   EndSelect
   
   ProcedureReturn CallNextHookEx_(HookMouse, nCode, wParam, lParam)
EndProcedure 


LoadImage(0,"c:\trace.png")

If OpenWindow(0, 100, 200, 600, 600, "Basic Mouse Gesture", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  lpdwProcessId = GetWindowThreadProcessId_(WindowID(0), @processus) 
  HookMouse=SetWindowsHookEx_(#WH_MOUSE   , @HookMouse(), 0, lpdwProcessId) 
  
  CreateGadgetList(WindowID(0))
  ImageGadget(0,0,0,600,600,ImageID(0))
  
  Repeat
    EventID = WaitWindowEvent()

    Select  EventID
        Case #PB_Event_CloseWindow
          Quit = 1
    EndSelect

  Until Quit = 1
UnhookWindowsHookEx_(HookMouse) 
EndIf
User avatar
Comtois
Addict
Addict
Posts: 1431
Joined: Tue Aug 19, 2003 11:36 am
Location: Doubs - France

Post by Comtois »

Work fine, nice job .
Please correct my english
http://purebasic.developpez.com/
Post Reply