Obtener Coordenadas X e Y Dentro de un Panel o Canvas (C#)

Iniciado por poyson1, 20 Mayo 2010, 22:44 PM

0 Miembros y 1 Visitante están viendo este tema.

poyson1

Hola a todos, quisiera por favor que alguien me ayude con una respuesta que necesito, quiero obtener las coodenadas x e y de cualquier punto determinado al cual haga clic desde dentro de un panel o canvas contenido en un form, si me salgo del panel o canvas x e y seran cero (0).

Actualmente lo tengo hecho utilizando la Clase Point de System.Drawing y las coordenadas que he estado capturando  son las de cualquier parte de la pantalla completa del monitor y las que quiero es desde dentro de un panel o canvas de un form.

No se como especificarle a una instancia de Point que su espacio total sera el size del panel o canvas.

Agradecera cualquier ayuda.

poyson1

#1
Bueno parece que el tema no solo se me hace a mi dificil...
Aqui les pegare un codigo que he resuelto a ver si el mismo les da alguna idea y me pueden ayudar.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace PosicionCursor
{
   public partial class frmMain : Form
   {
       
       [DllImport("user32.dll")]
       // GetCursorPos()hace todo posible
       static extern bool GetCursorPos(ref Point lpPoint);
       // Variable que necesitaremos para contar los pixeles viajados
       static protected long totalPixels = 0;
       static protected int currX;
       static protected int currY;
       static protected int diffX;
       static protected int diffY;

       public frmMain()
       {
           InitializeComponent();
       }

       private void tmrDef_Tick(object sender, EventArgs e)
       {          
           //Nuevo punto el cual sera actualizado por la funcion con las coordenadas actuales
           Point defPnt = new Point();          
           //Llama la funcion y pasa el Punto, dfPnt
           GetCursorPos(ref defPnt);            
           // Ahora despues de llamar la funcion, defPnt conteniendo las coordenadas las cuales podemos leer
           lblCoordX.Text = "X = " + defPnt.X.ToString();
           lblCoordY.Text = "Y = " + defPnt.Y.ToString();
           // Si el cursor se mueve para donde sea
           if (diffX != defPnt.X | diffY != defPnt.Y)
           {
               // Calcula la distancia del movimiento (horizontal y verticalmente)
               diffX = (defPnt.X - currX);
               diffY = (defPnt.Y - currY);
               // La diferencia sera negativa si el cursor fue movido a la izquierda o arriba
               // y si eso sucede, hara el numero positivo
               if (diffX < 0)
               {
                   diffX *= -1;
               }
               if (diffY < 0)
               {
                   diffY *= -1;
               }
               // Agregar a los pixeles viajados un contador
               totalPixels += diffX + diffY;
               // y mostrar en el label los pixeles viajadas
               //lblTravel.Text = "Viajaste " + totalPixels + " pixeles";
           }
           // Necesitamos esto para ver la diferencia de pixeles entre dos movimientos de dos mouses
           currX = defPnt.X;
           currY = defPnt.Y;
       }

       private void btnReset_Click(object sender, EventArgs e)
       {
           totalPixels = 0;
       }
   }
}

Si pegan ese codigo el cual esta en un simple form con tres label, un timer y un button, si lo prueban se daran cuenta de que puedo capturar las coordenadas X e Y de cualquier parte de la pantalla donde se mueva el Mouse, y mi Incognita esta en tomar esas mismas coordenadas (X,Y) pero dentro de un Formulario o dentro de un panel o canvas o cualquier otro control, lo que quiero es especificarle a POINT que no sera la screen completa sino solo un control y si se sale de ahi sera 0,0.

43H4FH44H45H4CH49H56H45H

Puedes añadir que en el evento MouseMove de un picturebox por ejemplo inicie el timer y en el resto del formulario (evento MouseMove) que detenga dicho timer y coloque a 0 las coordenadas, asi solo mostrará los cambios de posicion cuando este sobre el picturebox.
Para el timer seria bueno colocar un intervalo de 100 aproximandamente.

Escribiste muchas lineas de code para algo tan simple...

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W