Contrôle PointToClient () vs PointToScreen()

Le MSDN ne fournit pas, à mon humble avis, une nette différence entre Contrôle.PointToScreen(lien) et Contrôler.PointToClient(lien) méthodes.

Y a-t-il quelqu'un qui pourrait expliquer en quelques mots simples Quelle est la différence entre ces méthodes? Surtout n'est pas clair pour moi la notion de "Client".

Je comprends PointToScreen la coordonnée de l'écran réel (avec [0, 0] dans le coin supérieur gauche de l'écran) de la donnée point.

Par exemple, déboguer du code que j'ai

?click.Location 
{X = 3 Y = 9}

?shapeSender.PointToClient(click.Location)
{X = -470 Y = -565}

?shapeSender.PointToScreen(click.Location)
{X = 476 Y = 583}

Merci.

30
demandé sur serhio 2009-12-16 13:18:14

4 réponses

La meilleure façon d'y penser est: coordonnées relatives vs absolution. Où la coordonnée relative est relative à partir du coin supérieur gauche de la zone client d'une fenêtre. La zone cliente d'une fenêtre est une fenêtre moins de ses frontières. Les coordonnées relatives sont utiles car elles ne changent pas lorsque l'utilisateur déplace une fenêtre et ne dépendent pas de la taille de la bordure et de la légende de la fenêtre.

La plupart des coordonnées dans Winforms sont des coordonnées relatives, MouseEventArgs.Emplacement par exemple. Certains sont absolue, Curseur.Position par exemple. Si vous passez une coordonnée relative à PointToClient, vous obtiendrez des déchets, comme vous l'avez vu dans votre session de débogage. Ce doit être une coordonnée absolue.

Certaines propriétés de coordonnées peuvent apparemment être à la fois, Contrôle.Emplacement par exemple. Sur un contrôle enfant, il représente l'emplacement relatif du contrôle à partir de son conteneur. L'emplacement d'un formulaire est absolu. Cette contradiction apparente disparaît quand vous pensez à un contrôle.Emplacement relatif d'un contrôle Parent. Le Parent d'un formulaire est le bureau.

Une utilisation courante consiste à mapper une coordonnée relative à un contrôle à un autre contrôle. Mappez d'abord les coordonnées absolues de l'écran avec control1.PointToScreen(), puis mappez le résultat à l'autre contrôle avec control2.PointToClient(). La valeur du Point change en fonction du décalage entre les contrôles, quels que soient leurs parents. Faire toute autre manière est très douloureux.

Évitez les problèmes en ne passant qu'une coordonnée absolue à PointToClient et un relatif coordonner à PointToScreen.

41
répondu Hans Passant 2013-07-22 10:02:31

Le PointToClient méthode est l'inverse de la PointToScreen méthode.

(Si ce n'était pas si long et répétitif, ils seraient nommés ScreenPointToClientPoint et ClientPointToScreenPoint.)

Vous utilisez les conversions lorsque vous avez une sorte de coordonnées et avoir besoin de l'autre, par exemple si vous avez les coordonnées d'un clic de souris par rapport à l'écran, et ont besoin de savoir où dans le contrôle de l'utilisateur a cliqué.

Si vous convertissez un point d'écran qui est en dehors de la zone client, vous obtiendrez des composants de coordonnées qui sont négatif ou supérieur à la taille de la zone client de contrôle.

9
répondu Guffa 2009-12-16 11:46:37

Les coordonnées "client" sont relatives à la partie supérieure gauche de la zone client d'un contrôle. Les coordonnées "écran" sont relatives à la partie supérieure gauche du moniteur (principal).

La "zone client" est la zone d'un contrôle dans laquelle les contrôles enfants peuvent être placés. Le rectangle client d'un formulaire est la zone à l'intérieur du formulaire, à l'exclusion des bordures et de la barre de titre. Pour la plupart des autres contrôles, la zone client est la même que la zone que le contrôle occupe à l'écran.

PointToScreen convertit le client coordonnées pour afficher les coordonnées. {[1] } fait l'inverse: il convertit les coordonnées de l'écran en coordonnées du client.

4
répondu Thomas 2009-12-16 10:27:04

Supposons qu'un écran soit de 800x600 et qu'une fenêtre soit de 50,50 ayant une taille de 200x200 pixels. Si le point P se trouve à 10,10 par rapport à la partie supérieure gauche de la fenêtre, alors PointToScreen (P) retournera 60,60. Si ce P est donné à PointToClient (P) avec la poignée de fenêtre, nous obtiendrons à nouveau 10,10.

J'espère que cela efface la confusion

3
répondu A9S6 2009-12-16 10:33:25