IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

aimanter le curseur de la souris


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut aimanter le curseur de la souris
    Bonjour,

    Je cherche a programmer une règle ( pour des dessins géométriques dans un autre logiciel).
    J'essaie de faire en sorte que quand la souris soit proche du bord de la règle , elle se colle dessus. Pour l'instant je le fais avec un timer , mais le rendu est pas terrible.

    merci

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Pour l'instant je le fais avec un timer , mais le rendu est pas terrible.
    ... j'ai pas pigé l'intérêt du Timer.
    ... pourquoi ne pas se contenter d'une procedure qui lors de l'évènement onMouseMove calcule la distance séparant la souris du bord de la règle et dès que la distance est inférieure à Delta colle le curseur de la souris sur la règle ?
    ... pas besoin de Timer.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Bonjour,


    ... j'ai pas pigé l'intérêt du Timer.
    ... pourquoi ne pas se contenter d'une procedure qui lors de l'évènement onMouseMove calcule la distance séparant la souris du bord de la règle et dès que la distance est inférieure à Delta colle le curseur de la souris sur la règle ?
    ... pas besoin de Timer.

    Citation Envoyé par hresh Voir le message
    Je cherche a programmer une règle ( pour des dessins géométriques dans un autre logiciel).
    Je ne pense pas qu'il ait accès au onMouseMove de "l'autre logiciel"...
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    oui c'est cela , je n'ai pas les sources du logiciel de dessin , il n'est pas libre.

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-bonjour,

    Je ne pense pas qu'il ait accès au onMouseMove de "l'autre logiciel"...
    ... effectivement.
    ... Par contre comme il dit "Je cherche a programmer une règle" on peut donc imaginer une règle qui comporte une zone formant la règle elle-même entourée d'une zone périphérique de quelques pixels de large formant bordure et comme ces deux zones font partie de ce qu'il programme il aura accès au onMouseMove relatif à ces deux zones et lors du MouseMove au-dessus du bord de la zone formant bordure il pourra faire sauter le curseur de la souris vers le centre de la règle ... bien entendu ceci n'est que ma façon de voir les choses en l'absence de davantage de précisions de la part de Hresh.

    A+.

    EDIT : Oups, nos messages se sont croisés.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Merci pour vos réponses

    ci-joint une image de ce que j'essaie de faire
    ( je l'ai mise en pièce jointe , j'espère qu'elle se voit )

    J'ai redirigé le onmousemove de la form1 sur le timer.OnTimer mais ca ne change pas grand chose.
    Le problème avec onmousemove , c'est que la souris doit être au dessus de ma règle , et dans ce cas le logiciel de dessin ne reçoit plus l'ordre de dessiner. Il existe peut-être un onmousemove général, ou alors , si je pouvais bloquer la souris sur une droite.
    Le but c'est de simuler une vraie règle pour des élèves , à utiliser avec une sorte de crayon optique.
    Le logiciel que j'utilise est très bien , à l'exception des instruments de géométrie.
    Images attachées Images attachées  

  7. #7
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par hresh Voir le message
    Il existe peut-être un onmousemove général
    Oui, mais ce n'est pas simple car pour intercepter les événements généraux du pointeur, il faut passer par une fonction Callback et celle-ci doit être dans une DLL. Regarde ici pour un exemple.
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    merci , je crois que ca devrait marcher avec ca.
    De nombreuses heures en perspective pour comprendre comment ca fonctionne pour moi

  9. #9
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Salut,

    J'utilise une technique plus simple pour récupérer la position globale du curseur et pour travailler sur d'autres applications.
    Sous XP et D7, il est facile de cliquer sur ce qui se trouve derrière un TForm (hélas, je n'ai pas la possibilité de tester sous d'autres environnements).

    Un exemple simple, à tester pour piger :
    Une fiche avec
    - 1 TButton (pour quitter)
    - 1 TShape (pour symboliser la règle en mouvement. Mais un TPaintBox serait mieux)
    - 1 Edit (pour afficher les coordonnées curseur)
    - 1 Timer (interval = 100)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    IMPLEMENTATION
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      BorderStyle           := bsNone;
      WindowState           := wsMaximized;
      TransparentColor      := true;
      TransparentColorValue := 36000;
      Color                 := 36000;
      FormStyle             := fsStayOnTop;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    var Pt : Tpoint;
    begin
      GetCursorPos(Pt);
      Edit1.Text := Format('X = %.4d  Y = %.4d', [Pt.X, Pt.Y]);
    end;
     
    procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var Regle : TShape absolute Sender;
        Pt    : TPoint;
    begin
      repeat
        GetCursorPos(Pt);
        Regle.Top  := Pt.Y-Y;
        Regle.Left := Pt.X-X;
        Application.ProcessMessages;
      until (GetAsyncKeyState(VK_LBUTTON) = 0);//On teste l'état du bouton gauche.
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Close;
    end;
     
    END.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Rebonjour ,

    En copiant collant à tout va , j'ai réussi à avoir un dll hook souris
    qui envoie un sendmessage à ma form principale quand la souris se déplace n'importe où sur l'écran.
    Ma form replace alors le curseur comme je le souhaite.

    C'est déjà pas mal ( bien mieux qu'avec le timer ) , mais pour ce que je veux faire le résultat n'est pas encore parfait.
    Je voudrais faire en sorte de coincer le curseur sur une seule droite d'équation donnée.

    J'ai 3 questions:
    Quand mon hook-dll intercepte le message WM_ONMOUSEMOVE ,
    le curseur n'a pas encore bougé ? sinon c'est trop tard.

    Dans le cas où il n'a pas bougé , je dois modifier le message et le faire suivre.
    Je n'ai pas bien compris comment modifier le Lparam ( ou wparam ).

    Enfin , pour modifier le message , ma dll doit obtenir des infos de ma form principale. ( c'est elle qui connaît les équations de la droite sur laquelle aimanter le curseur ). Je peux tester un sendmessage , mais je ne sais pas si une dll a un handle.

    EDIT: nos messages se sont croisés, je vais tester ( pour Caribensila )
    alors j'ai testé , mais ca ne convient pas , j'ai les mêmes problèmes
    que sur l'exemple.jpg ( 6e message ).

  11. #11
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Sur Paint avec l'outil Ligne sélectionné et le code du TTimer modifié comme ci-dessous, j'arrive très bien à tracer des lignes horizontales avec le curseur qui s'aimante sur le TShape :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Timer1Timer(Sender: TObject);
      var Pt : Tpoint;
    begin
      GetCursorPos(Pt);
      //Edit1.Text := Format('X = %.4d  Y = %.4d', [Pt.X, Pt.Y]);
      if (Pt.Y > Shape1.Top-10) and (Pt.Y < Shape1.Top+10) and (Pt.Y <> Shape1.Top-1)
        then SetCursorPos(Pt.X , Shape1.Top-1);
    end;
    Je pense qu'avec quelques calculs astucieux on peut, de la même façon, tracer n'importe quelle oblique...

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Oui c'est vrai , mais si j'utilise l'outil ligne , la règle n'a plus vraiment d'importance en elle-même.

    L'idée c'est que l'élève utilise cette règle au tableau comme une règle sur un cahier.


    Finalement j'y suis arrivé
    le résultat n'est pas merveilleux , mais quand même très correct


    en faisant un hook sur wh_mousell ( qui ne s'écrit pas comme ca mais correspond au 14 )

    pour envoyer les coordonnées de la souris j'ai utilisé Tmousedatastruct

    et pour correspondre entre la dll et la form principale , j'ai utilisé
    sendmessage(handle de ma form, WM_COPYDATA,cx,cy);
    ( où cx et cy sont les (futurs) coordonnées de la souris )
    c'est pratique parceque la procedure
    onwmcopydata de ma form a un msg en paramètre auquel on peut modifier le
    msg.result , ce qui permet à ma dll de choisir de bloquer ou non le hook


    j'avais fait un hook sur le wh_mouse au départ , mais ca marchait moins bien
    et je ne pouvais plus glisser-déposer

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CSS] Curseur de la souris
    Par Furius dans le forum Mise en page CSS
    Réponses: 8
    Dernier message: 19/11/2005, 11h53
  2. Curseur de la souris
    Par dynobremo dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/09/2004, 15h26
  3. reposition du curseur de la souris!
    Par bakonu dans le forum Windows
    Réponses: 2
    Dernier message: 09/06/2004, 19h17
  4. [TP][FAQ]Curseur de la souris
    Par nounetmasque dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 30/06/2003, 00h22
  5. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 19h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo