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.
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.
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...