bon ça fait plusieurs soirée que je sèche sur le sujet, alors de dépit je vous soumet le problème :
l'appli : il s'agit de l'ébauche d'un "visual designer"

l'action recherchée : je veux que le curseur de la souris se déplace en suivant une grille:
après compilation:
aller dans option / grille / utiliser la grille / pas de 20 (ou 10)
le curseur se balade avec le "pas" sélectionné , mais avec difficulté ou alors ça gigote beaucoup ( utilisation de windowmouseX() à la place de getcursor.... )
de plus il y a un gros écart entre le pointeur et le gadget "flottant"
le code malicieux : ligne 217 à 243 ( extrait )
Code : Tout sélectionner
Case #WM_MOUSEMOVE ;{
If begin_drag
GetCursorPos_(CursorPos.POINT)
;Debug Taille_Fenetre\left
; position du curseur par rapport au haut gauche du bureau
info_gadget\gdt_coord_x = CursorPos\x
info_gadget\gdt_coord_y = CursorPos\y
; info_gadget\gdt_coord_x = WindowMouseX()
; info_gadget\gdt_coord_y = WindowMouseY()
SetWindowTitle(#WIN_MAIN,Str(info_gadget\gdt_coord_x)+","+Str(info_gadget\gdt_coord_y))
;{- gérer la grille ici
If grid_use = #True
If grid_size=0:grid_size=10:EndIf
info_gadget\gdt_coord_x = info_gadget\gdt_coord_x - (info_gadget\gdt_coord_x % grid_size)
info_gadget\gdt_coord_y = info_gadget\gdt_coord_y - (info_gadget\gdt_coord_y % grid_size)
;info_gadget\gdt_coord_x & grid_size
;info_gadget\gdt_coord_y & grid_size
;DebugPT(info_gadget\gdt_coord_x,info_gadget\gdt_coord_y)
;UpdateWindow_(WindowID())
EndIf
;Delay(50)
SetCursorPos_(info_gadget\gdt_coord_x,info_gadget\gdt_coord_y)
;}
Code : Tout sélectionner
#largeur_fenetre = 640
#hauteur_fenetre = 480
Structure STRU_INFO_GADGET
gdt_Id.l
gdt_name.s
gdt_coord_x.w
gdt_coord_y.w
gdt_width.w
gdt_height.w
gdt_Title.s
gdt_option.l
EndStructure
Structure STRU_COMPTEUR_GADGET
nb_ButtonGadget.l
nb_TextGadget.l
nb_StringGadget.l
nb_ListIconGadget.l
EndStructure
NewList liste_gadget.STRU_INFO_GADGET()
Global info_gadget.STRU_INFO_GADGET
Global compteur_gadget.STRU_COMPTEUR_GADGET
Procedure DebugPT(X1,y1)
Debug "X: "+Str(X1)+" , Y: "+Str(y1)
EndProcedure
Procedure AddToListe_Gadget()
AddElement(liste_gadget())
liste_gadget()\gdt_Id = info_gadget\gdt_Id
liste_gadget()\gdt_name = info_gadget\gdt_name
liste_gadget()\gdt_coord_x = info_gadget\gdt_coord_x
liste_gadget()\gdt_coord_y = info_gadget\gdt_coord_y
liste_gadget()\gdt_width = info_gadget\gdt_width
liste_gadget()\gdt_height = info_gadget\gdt_height
liste_gadget()\gdt_Title = info_gadget\gdt_Title
liste_gadget()\gdt_option = info_gadget\gdt_option
EndProcedure
Procedure FEN_PRINCIPALE()
Enumeration
#WIN_MAIN
#MENU_WIN_MAIN
#Mnu_New_Project
#Mnu_New_Window
#Mnu_Terminer
; ----------------
#Mnu_Add_ButtonGadget
#Mnu_Add_TextGadget
#Mnu_Add_StringGadget
#Mnu_Add_ListIconGadget
#Mnu_Add_StringGadget_extended
#Mnu_Add_ListIconGadget_extended
; -----------------
#Mnu_Grid_Use
#Mnu_Grid_View
#Mnu_Grid_5
#Mnu_Grid_10
#Mnu_Grid_20
EndEnumeration
;{ variables locales
quit.b = 0
EventID.l = 0
type_gadget.b = 0
begin_drag.b = #False
grid_use.b = #False
grid_view.b = #False
grid_size.b=0
compteur_gadget\nb_ButtonGadget = 1
compteur_gadget\nb_TextGadget = 1
compteur_gadget\nb_StringGadget = 1
compteur_gadget\nb_ListIconGadget = 1
;}
If OpenWindow(#WIN_MAIN,0,0,#largeur_fenetre,#hauteur_fenetre,#PB_Window_SystemMenu,"RAD")
If CreateMenu(#MENU_WIN_MAIN,WindowID(#WIN_MAIN)) ;{
MenuTitle("Fichier")
OpenSubMenu("Nouveau")
MenuItem(#Mnu_New_Project,"Projet...")
MenuItem(#Mnu_New_Window,"Fenetre...")
CloseSubMenu()
MenuBar()
MenuItem(#Mnu_Terminer,"Terminer")
MenuTitle("Gadgets")
MenuItem(#Mnu_Add_ButtonGadget,"ButtonGadget")
MenuItem(#Mnu_Add_TextGadget,"TextGadget")
MenuItem(#Mnu_Add_StringGadget,"StringGadget")
MenuItem(#Mnu_Add_ListIconGadget,"ListIconGadget")
MenuBar()
OpenSubMenu("Gadgets étendu")
;MenuItem(#Mnu_Add_ButtonGadget,"ButtonGadget")
;MenuItem(#Mnu_Add_TextGadget,"TextGadget")
MenuItem(#Mnu_Add_StringGadget_extended,"StringGadget")
MenuItem(#Mnu_Add_ListIconGadget_extended,"ListIconGadget")
CloseSubMenu()
MenuTitle("Options")
OpenSubMenu("Grille")
MenuItem(#Mnu_Grid_Use,"Utiliser la Grille")
MenuItem(#Mnu_Grid_View,"Voir la Grille")
MenuBar()
MenuItem(#Mnu_Grid_5,"pas de 5")
MenuItem(#Mnu_Grid_10,"pas de 10")
MenuItem(#Mnu_Grid_20,"pas de 20")
CloseSubMenu()
EndIf ;}
If CreateGadgetList(WindowID(#WIN_MAIN))
EndIf
; GetWindowRect_(WindowID(), @Taille_Fenetre.RECT)
; largeur_Bordure_Fenetre.b = (WindowWidth() - (Taille_Fenetre\Right - Taille_Fenetre\left))/2
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_Event_Menu
Select EventMenuID() ;{
Case #Mnu_Terminer
quit = 1
Case #Mnu_Add_ButtonGadget
type_gadget = #Mnu_Add_ButtonGadget
begin_drag = #True
info_gadget\gdt_width = 80
info_gadget\gdt_height = 20
Case #Mnu_Add_TextGadget
type_gadget = #Mnu_Add_TextGadget
begin_drag = #True
info_gadget\gdt_width = 80
info_gadget\gdt_height = 20
Case #Mnu_Add_StringGadget
type_gadget = #Mnu_Add_StringGadget
begin_drag = #True
info_gadget\gdt_width = 80
info_gadget\gdt_height = 20
Case #Mnu_Add_ListIconGadget
type_gadget = #Mnu_Add_ListIconGadget
begin_drag = #True
info_gadget\gdt_width = 100
info_gadget\gdt_height = 100
Case #Mnu_Add_StringGadget_extended
type_gadget = #Mnu_Add_StringGadget_extended
begin_drag = #True
info_gadget\gdt_width = 160
info_gadget\gdt_height = 20
Case #Mnu_Add_ListIconGadget_extended
type_gadget = #Mnu_Add_ListIconGadget_extended
begin_drag = #True
info_gadget\gdt_width = 100
info_gadget\gdt_height = 120
;{ Gestion de la grille
Case #Mnu_Grid_Use
If GetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_Use)=1
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_Use,0)
grid_use = #False
Else
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_Use,1)
grid_use = #True
EndIf
Case #Mnu_Grid_View
If GetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_View)=1
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_View,0)
grid_view = #False
Else
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_View,1)
grid_view = #True
EndIf
Case #Mnu_Grid_5
If GetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_5)=1
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_5,0)
grid_size = 0
Else
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_5,1)
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_10,0)
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_20,0)
grid_size = 5
EndIf
Case #Mnu_Grid_10
If GetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_10)=1
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_10,0)
grid_size = 0
Else
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_5,0)
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_10,1)
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_20,0)
grid_size = 10
EndIf
Case #Mnu_Grid_20
If GetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_20)=1
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_20,0)
grid_size = 0
Else
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_5,0)
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_10,0)
SetMenuItemState(#MENU_WIN_MAIN,#Mnu_Grid_20,1)
grid_size = 20
EndIf ;}
EndSelect ;}
Case #WM_MOUSEMOVE ;{
If begin_drag
GetCursorPos_(CursorPos.POINT)
;Debug Taille_Fenetre\left
; position du curseur par rapport au haut gauche du bureau
info_gadget\gdt_coord_x = CursorPos\x
info_gadget\gdt_coord_y = CursorPos\y
; info_gadget\gdt_coord_x = WindowMouseX()
; info_gadget\gdt_coord_y = WindowMouseY()
SetWindowTitle(#WIN_MAIN,Str(info_gadget\gdt_coord_x)+","+Str(info_gadget\gdt_coord_y))
;{- gérer la grille ici
If grid_use = #True
If grid_size=0:grid_size=10:EndIf
info_gadget\gdt_coord_x = info_gadget\gdt_coord_x - (info_gadget\gdt_coord_x % grid_size)
info_gadget\gdt_coord_y = info_gadget\gdt_coord_y - (info_gadget\gdt_coord_y % grid_size)
;info_gadget\gdt_coord_x & grid_size
;info_gadget\gdt_coord_y & grid_size
;DebugPT(info_gadget\gdt_coord_x,info_gadget\gdt_coord_y)
;UpdateWindow_(WindowID())
EndIf
;Delay(50)
SetCursorPos_(info_gadget\gdt_coord_x,info_gadget\gdt_coord_y)
;}
If StartDrawing(WindowOutput())
DrawingMode(2|4)
Box(info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height,RGB(255,0,0))
Delay(10)
Box(info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height,RGB(255,0,0))
StopDrawing()
EndIf
EndIf ;}
Case #WM_LBUTTONUP ;{
Select type_gadget
Case #Mnu_Add_ButtonGadget
info_gadget\gdt_option = 0
info_gadget\gdt_Title = "Button"+Str(compteur_gadget\nb_ButtonGadget)
Id_Gadget = ButtonGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height, info_gadget\gdt_Title)
info_gadget\gdt_Id = Id_Gadget
info_gadget\gdt_name = "ButtonGadget("
AddToListe_Gadget()
compteur_gadget\nb_ButtonGadget+1
type_gadget=0
begin_drag = #False
Case #Mnu_Add_TextGadget
info_gadget\gdt_option = #PB_Text_Border
info_gadget\gdt_Title = "Text"+Str(compteur_gadget\nb_TextGadget)
Id_Gadget = TextGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height, info_gadget\gdt_Title, info_gadget\gdt_option)
info_gadget\gdt_Id = Id_Gadget
info_gadget\gdt_name = "TextGadget("
AddToListe_Gadget()
compteur_gadget\nb_TextGadget+1
type_gadget=0
begin_drag = #False
Case #Mnu_Add_StringGadget
info_gadget\gdt_option = 0
info_gadget\gdt_Title = "String"+Str(compteur_gadget\nb_StringGadget)
Id_Gadget = StringGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height, info_gadget\gdt_Title, info_gadget\gdt_option)
info_gadget\gdt_Id = Id_Gadget
info_gadget\gdt_name = "StringGadget("
AddToListe_Gadget()
compteur_gadget\nb_StringGadget+1
type_gadget=0
begin_drag = #False
Case #Mnu_Add_ListIconGadget
info_gadget\gdt_option = 0
info_gadget\gdt_Title = "ListIcon"+Str(compteur_gadget\nb_ListIconGadget)
Id_Gadget = ListIconGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, info_gadget\gdt_height, info_gadget\gdt_Title,100,info_gadget\gdt_option)
info_gadget\gdt_Id = Id_Gadget
info_gadget\gdt_name = "ListIconGadget("
AddToListe_Gadget()
compteur_gadget\nb_ListIconGadget+1
type_gadget=0
begin_drag = #False
;{- gadgets étendu
Case #Mnu_Add_StringGadget_extended
info_gadget\gdt_option = #PB_Text_Border
info_gadget\gdt_Title = "Text"+Str(compteur_gadget\nb_TextGadget)
Id_Gadget = TextGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width/2, info_gadget\gdt_height, info_gadget\gdt_Title, info_gadget\gdt_option)
info_gadget\gdt_Id = Id_Gadget
info_gadget\gdt_name = "TextGadget("
AddToListe_Gadget()
compteur_gadget\nb_TextGadget+1
info_gadget\gdt_option = 0
info_gadget\gdt_Title = "Button"+Str(compteur_gadget\nb_ButtonGadget)
Id_Gadget = StringGadget(#PB_Any,info_gadget\gdt_coord_x+(info_gadget\gdt_width/2), info_gadget\gdt_coord_y, info_gadget\gdt_width/2, info_gadget\gdt_height, info_gadget\gdt_Title, info_gadget\gdt_option)
info_gadget\gdt_Id = Id_Gadget
info_gadget\gdt_name = "StringGadget("
AddToListe_Gadget()
compteur_gadget\nb_StringGadget+1
type_gadget=0
begin_drag = #False
Case #Mnu_Add_ListIconGadget_extended
info_gadget\gdt_option = #PB_Text_Border
info_gadget\gdt_Title = "Text"+Str(compteur_gadget\nb_TextGadget)
Id_Gadget = TextGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y, info_gadget\gdt_width, 20, info_gadget\gdt_Title, info_gadget\gdt_option)
info_gadget\gdt_Id = Id_Gadget
info_gadget\gdt_name = "TextGadget("
AddToListe_Gadget()
compteur_gadget\nb_TextGadget+1
info_gadget\gdt_option = 0
info_gadget\gdt_Title = "ListIcon"+Str(compteur_gadget\nb_ListIconGadget)
Id_Gadget = ListIconGadget(#PB_Any,info_gadget\gdt_coord_x, info_gadget\gdt_coord_y+20, info_gadget\gdt_width, info_gadget\gdt_height, info_gadget\gdt_Title,100,info_gadget\gdt_option)
info_gadget\gdt_Id = Id_Gadget
info_gadget\gdt_name = "ListIconGadget("
AddToListe_Gadget()
compteur_gadget\nb_ListIconGadget+1
type_gadget=0
begin_drag = #False
;}
EndSelect ;}
Case #PB_Event_CloseWindow
quit = 2
EndSelect
Until quit>0
EndIf
If CreateFile(0,"LISTE_GADGET.TXT")
ForEach liste_gadget()
;WriteStringN(Str(liste_gadget()\gdt_Id))
chaine$ = liste_gadget()\gdt_name+","+Str(liste_gadget()\gdt_coord_x)+","+Str(liste_gadget()\gdt_coord_y)+","
chaine$ = chaine$ + Str(liste_gadget()\gdt_width)+","+Str(liste_gadget()\gdt_height)+","+liste_gadget()\gdt_Title+","+Str(liste_gadget()\gdt_option)+")"
WriteStringN(chaine$)
Next
CloseFile(0)
EndIf
EndProcedure
FEN_PRINCIPALE()
End
mercix
pat