Coment avoir les coordonnées écran d'une fenêtre

Coment avoir les coordonnées écran d'une fenêtre - C++ - Programmation

Marsh Posté le 28-07-2003 à 13:43:23    

Bonjour,
 
Je voudrais avoir les coordonnées écran de ma fenêtre, car j'ai des problèmes pour l'affichage de mais popup.
 
En fait je veux qu'en cliquant sur un bouton, un popup s'affiche là où est ma souris.  
 
  Cependant dans C++ Builder la fonction popup :  
nompoppuMenu->popup (X,Y) fait référence à des coordonnées écran et dans l'événements OnMouseDown, les coordonnées sont celles de la fenêtre client, soit (0,0)en dessous de la barre de menu en haut à gauche. De ce fait mon popup n'apparaît jamais à l'endroit désiré.
 
Auriez-vous une idées pour récupérer les coordonnées écrans de ma fenêtre au chargement de la fenêtre ainsi que lorsque celle-ci est déplacée ?
 
Merci d'avance.

Reply

Marsh Posté le 28-07-2003 à 13:43:23   

Reply

Marsh Posté le 28-07-2003 à 13:45:00    

Y'a des fonctions de conversions
 
ClientToScreen et ScreenToClient je crois (c fou comme j'oublie tout...)

Reply

Marsh Posté le 28-07-2003 à 13:45:05    

Y a une méthode des TForm qui converti les coordonnées (ClientToScreen me semble) si je em souvient bien.
 
EDIT: Arf [:benou_grilled]


Message édité par LetoII le 28-07-2003 à 13:46:30

---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 13:45:35    

C bien ca les fonctions (en tout cas sous MFC, membre de CWnd)

Reply

Marsh Posté le 28-07-2003 à 13:46:35    

Merci je test de suite.

Reply

Marsh Posté le 28-07-2003 à 13:47:43    

VisualC++ a écrit :

C bien ca les fonctions (en tout cas sous MFC, membre de CWnd)


 
bah au pire c'est des fonctions de l'api w32, ca doit se retrouver partout sous la meme forme (ou peut s'en faut)

Reply

Marsh Posté le 28-07-2003 à 13:52:49    

Apparemment il est impossible de faire çà :
 
PpMnmatos->Popup(ScreenToClient(X),ScreenToClient(Y));
 
Les deux fonctions semblent marcher ensemble dans l'exemple :
P = TargetControl->ScreenToClient(SourceControl->ClientToScreen(P));
 
convertit P des coordonnées de SourceControl à celles de TargetControl.

Reply

Marsh Posté le 28-07-2003 à 13:52:53    

Chrisbk > Oui tout a fait


Message édité par VisualC++ le 28-07-2003 à 13:53:09
Reply

Marsh Posté le 28-07-2003 à 13:54:22    

Nickola a écrit :

Apparemment il est impossible de faire çà :
 
PpMnmatos->Popup(ScreenToClient(X),ScreenToClient(Y));
 
Les deux fonctions semblent marcher ensemble dans l'exemple :
P = TargetControl->ScreenToClient(SourceControl->ClientToScreen(P));
 
convertit P des coordonnées de SourceControl à celles de TargetControl.


 
C'est par ce qu'elles prennent un TPoint en argument.


Message édité par LetoII le 28-07-2003 à 13:54:32

---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 13:55:34    

Et je peux convertir mon int en Tpoint ? (nOObie inside :D )


Message édité par nickola le 28-07-2003 à 13:56:40
Reply

Marsh Posté le 28-07-2003 à 13:55:34   

Reply

Marsh Posté le 28-07-2003 à 13:58:26    

Tpoint toto;
toto.x = TonX
toto.y = TonY
 
ScreenToClient(toto)
menu->popup(toto.x, toto.y)
 
 
Edit : tu as le droit de lire la doc de la fonction ou google ;)


Message édité par VisualC++ le 28-07-2003 à 13:58:45
Reply

Marsh Posté le 28-07-2003 à 14:03:52    

Mon popup est toujours en haut vers la gauche bien loin de ma fenêtre cliente.
 
TPoint coord;
 coord.x= X;
 coord.y= Y;
 ScreenToClient (coord);
 PpMnmatos->Popup(coord.x,coord.y);
 
J'avais pas vu dans l'aide de la fonction le Gros TPoint souligné en haut:). Autant pour moi. Mais le problème persiste.


Message édité par nickola le 28-07-2003 à 14:05:14
Reply

Marsh Posté le 28-07-2003 à 14:08:43    

Ben essaye avec ClientToScreen alors [:ddr555]

Reply

Marsh Posté le 28-07-2003 à 14:12:02    

Déjà fait :D
 
En fait çà reste fixe. Malgré la manip (voir le code) le popup apparaît en haut à gauche. Donc il applique les coordonnées client aux coordonnées écran
 
 
 
 
 TPoint coord;
 coord.x= X;
 coord.y= Y;
 ScreenToCLient (coord);
 Coordms->Caption="La souris est en "+IntToStr(X)+", "+IntToStr(Y);
 PpMnmatos->Popup(coord.x,coord.y);


Message édité par nickola le 28-07-2003 à 14:12:23
Reply

Marsh Posté le 28-07-2003 à 14:16:27    

A mon avis c comme avec les MFC, il prend les coordonnee via le parent declare.
 
Essaye un PpMnmatos->ClientToScreen ou PpMnmatos->ScreenToClient

Reply

Marsh Posté le 28-07-2003 à 14:18:37    

X et Y ils viennet d'où?


---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 14:20:18    

çà ne marche pas. Le ClientToScreen n'est pas dans la liste ni l'inverse.
 
LETOII X et Y viennent du MouseDown
void __fastcall TFenPRinc::BtaddperifMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
 TPoint coord;
 coord.x= X;
 coord.y= Y;
 ClientToScreen(coord);
 PpMnmatos->Popup(coord.x,coord.y);
}


Message édité par nickola le 28-07-2003 à 14:21:14
Reply

Marsh Posté le 28-07-2003 à 14:23:50    

L'aide de TPoint dit ceci
 
Unité
 
Windows
 
struct TPoint
 
{
  TPoint() {}
  TPoint(int _x, int _y) : x(_x), y(_y) {}
  TPoint(POINT& pt)
  {
    x = pt.x;
    y = pt.y;
  }
  operator POINT() const
  {
    POINT pt;
    pt.x = x;
    pt.y = y;
    return pt;
  }
  int  x;
  int  y;
 
};

Reply

Marsh Posté le 28-07-2003 à 14:25:55    

operator POINT() const
  {
    POINT pt;
    pt.x = x;
    pt.y = y;
    return pt;
  }
 
 
 
 :non: quel interet d'ecrire des constructeurs si on en s'en sert pas
 
return POINT(x, y);
 
et si ton compilo est pas mauvais, tu économiseras meme un objet temporaire

Reply

Marsh Posté le 28-07-2003 à 14:27:50    

Les coordonnees doivent etre efin je suppose de type ClientCoordinate (vis a vis de la fenetre active qui a recu le mousedown) et Popup doit prendre des coordonnees en ScreenCoordinate, donc pour moi (enfin jsuis pas du tout ds prog via Borland) ca devrait etre bon

Reply

Marsh Posté le 28-07-2003 à 14:28:18    

Taz a écrit :

operator POINT() const
  {
    POINT pt;
    pt.x = x;
    pt.y = y;
    return pt;
  }
 
 
 
 :non: quel interet d'ecrire des constructeurs si on en s'en sert pas
 
return POINT(x, y);
 
et si ton compilo est pas mauvais, tu économiseras meme un objet temporaire


 
Sauf que c juste l aide de Borland qu il cite la et en rien son code ;)


Message édité par VisualC++ le 28-07-2003 à 14:28:39
Reply

Marsh Posté le 28-07-2003 à 14:30:32    

Ca ça marche super:

Code :
  1. TrayPopUp->Popup(MousePos.x, MousePos.y);


 
:D


---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 14:32:47    

LETOII : Merci je vais essayer

Reply

Marsh Posté le 28-07-2003 à 14:46:28    

heu... tu fais comment pour qu'il reconnaisse MousePos.x et MousePos.y tu refais une structure de type TPoint ?

Reply

Marsh Posté le 28-07-2003 à 14:47:27    

Nickola a écrit :

heu... tu fais comment pour qu'il reconnaisse MousePos.x et MousePos.y tu refais une structure de type TPoint ?


 
 :heink: Oups, je retourne voi le code, j'ai du en oublier un bout :D


---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 14:51:00    

Ca ça marche super:  

Code :
  1. TPoint mousePos;
  2. GetCursorPos(&mousePos);
  3. TrayPopUp->Popup(mousePos.x, mousePos.y);

 
 
Un truc du genre :D


---------------
Le Tyran
Reply

Marsh Posté le 28-07-2003 à 14:56:58    

Merci beaucoup LetoII çà marche !!!!
Désolé j'ai pas de truitesse sous la main, pour un Syanocq digne de ce nom afin de te remercier :D .

Reply

Marsh Posté le 28-07-2003 à 14:59:06    

Nickola a écrit :

Merci beaucoup LetoII çà marche !!!!
Désolé j'ai pas de truitesse sous la main, pour un Syanocq digne de ce nom afin de te remercier :D .


 
 [:grinking]


---------------
Le Tyran
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed