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 :

Position réelle de la souris sur un Canvas "scrollé"


Sujet :

Composants VCL Delphi

  1. #1
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 308
    Points
    4 308
    Par défaut Position réelle de la souris sur un Canvas "scrollé"
    Bonjour,

    Je rencontre un problème bête mais handicapant... Dans un composant possédant des Scrollbars, où le Canvas est plus large que la vue Client, je souhaiterais récupérer les coordonnées de la souris (dans un OnMouseUp, où X et Y sont passés en paramètre) mais exprimées par rapport à l'origine du Canvas et non pas par rapport à l'origine de la vue Client du composant.

    J'espère avoir été clair Merci de l'aide !
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Personnellement, je triche en utilisant un ScrollBox
    J'ai récemment utilisé un TPaintBox qui dessine l'ensemble des connexions entre des Panneaux (genre UML), lorsque je défile dans mon ScrollBox et que je double-clic, j'utilise PaintBox.ScreenToClient(Mouse.CursorPos); et cela "surligne" la connexion cliqué sans problème de localisation parce que le ClientOrigin du TPaintBox change lors l'on se déplace dans TScrollBox

    C'est plutôt la Zone visible du Canvas qui a changé que son Origine

    Voir InvalidateRect et GetUpdateRect qui permettent respectivement de définir et récupérer la zone devant être redessiné dans un TWinControl

    Si c'est un TGraphicControl, je pense qu'il est toujours redessiné en entier, à confirmer

    Enfin, si c'est un dérivé de TScrollingWinControl, il te suffit de décaler X et Y de HorzScrollBar.Position et VertScrollBar.Position pour retrouver le point haut gauche visible et non le point haut gauche d'origine de la zone cliente

    Si c'est un dérivé de TWinControl, il te suffit de décaler X et Y avec GetScrollPos

    Dans la cas de ScrollBar automatiquement géré par Windows, j'ignore si cela a un impact sur ClientOrigin
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 308
    Points
    4 308
    Par défaut
    Merci pour les infos. C'est un TDrawGrid, donc dérivé de TWinControl. J'avais vu le GetSrollPos/GetScrollInfo mais je me demandais si il n'y avait pas quelque chose de plus simple...

    Je teste dès que possible
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Pense aussi à TopRow et LeftCol pour la première Cellule Visible

    D'ailleurs, pense que MouseToCell utilise des Coordonnées Ecran donc Mouse.CursorPos !
    Si tu veux récupérer la Cellule sous le curseur, c'est le plus pratique !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 308
    Points
    4 308
    Par défaut
    A priori, MouseToCell utilise des coordonnées locales au composant, c'est MouseCoord qui utilise des coordonnées écrans. Néanmoins avec les évènements onMouseUp et onMouseDown, les coordonnées locales de la souris sont transmises, et on peut les traiter avec MouseToCell pour obtenir la cellule cliquée.

    Avec l'utilisation de GetScrollInfo et en soustrayant la position de la ScrollBar, j'obtiens bien les coordonnées de la souris relative au coin supérieur gauche lorsqu'il n'est pas affiché dans le composant.

    Merci ShaiLeTroll !!

    Voici une partie du code, pour info:
    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
    procedure TFolderRepMainForm.FilesDrawGridMouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
      Column, Row: Longint;
      DisplayedFile: TDisplayedFile;
      I, ChildCount, ButtonLeftPosition: Integer;
      CurrentLeaf: PTreeLeaf;
      CellRect: TRect;
      ScrollInfo: tagSCROLLINFO;
    begin
      FilesDrawGrid.MouseToCell(X, Y, Column, Row);
      CellRect := FilesDrawGrid.CellRect(Column, Row);
      if Row <= 0 then Exit;
     
      DisplayedFile := TDisplayedFile(DisplayedFiles.Items[Row - 1]);
     
      ScrollInfo.fMask := SIF_POS;
      GetScrollInfo(FilesDrawGrid.Handle, SB_HORZ, ScrollInfo);
      ButtonLeftPosition := CellRect.Left + SelectedFolderPair.Items.GetLeafLevel(DisplayedFile.Leaf) * FileDrawGridIndent - ScrollInfo.nPos;
      if ((not DoubleClick) and ((X < ButtonLeftPosition) or (X >  ButtonLeftPosition + FileDrawGridIndent))) then Exit;
    end;
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/09/2006, 00h49
  2. [DHTML]position de la souris sur une image
    Par Daï2 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 18/05/2006, 16h57
  3. Position souris sur un bouton
    Par had182 dans le forum MFC
    Réponses: 5
    Dernier message: 14/01/2006, 12h41

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