none
Problemas com posicionamento X e Y

    Question

  • Olá, 

    Estou aprendendo C# e gostaria que vocês me dessem uma solução para o problema seguinte:

    Em um formulário do Windows, o posicionamento X e Y se dá pela passagem e movimentação do mouse sobre o Form (Evento MouseMove). Até aí consigo obter o X e Y de todo o formulário. Quando adiciono um componente visual, como um botão, ele não lê X e Y do botão inserido no Form. Parece que há um "buraco" nas coordenadas em que o botão ocupa. Vocês podem solucionar essa questão? Gostaria que tudo fosse lido no Form, como se tudo estivesse mapeado as coordenadas.

    Monday, September 19, 2011 12:43 AM

Answers

  • Olá Cristian!

    O negócio é que funciona assim mesmo, essas coordenadas em relação ao formulário você consegue receber se o mouse estiver no formulário, uma vez que o mouse está sobre o botão, você consegue receber a coordenadas do botão...

    Uma alternativa seria você fazer mais ou menos o seguinte esquema: Imagino que você está pegando essas coordenadas no evento MouseMove do seu formulário, não é? Então crie um evento MouseMove também para o seu botão... Assim você se encontra no seguinte cenário: você possui as coordenadas do seu botão [Left e Top] em relação ao seu formulário e ainda as coordenadas do mouse em relação ao seu botão... Basta agora realizar um cálculo simples para você receber a posição do seu mouse como um todo [em relação ao formulário], acrescendo a posição do mouse em relação ao botão... Mais ou menos assim:

    // Define duas variáveis inteiras que receberão as cooredenadas em relação ao formulário
    int X = 0;
    int Y = 0;
    
    // Método MouseMove do formulário
    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
             // Atribui as coordenadas do formulário às variáveis X e Y
             X = e.X;
             Y = e.Y;
    }
    
    // Método MouseMove do botão
    private void button1_MouseMove(Object sender, MouseEventArgs e)
    {
            // Inicializa duas variáveis inteiras que recebem as cooredenadas em relação ao botão
            int x = e.X;
            int y = e.Y;
    
            // Acrescenta às coordenadas principais as coordenadas do botão
            X += x;
            Y += y;
    }
    

    Esse é um exemplo simples de como você poderia fazer, só para ter uma ideia mesmo de como funciona...

    Espero que ajude...

    Até mais, abraços...

    Monday, September 19, 2011 1:47 PM

All replies

  • Olá Cristian!

    O negócio é que funciona assim mesmo, essas coordenadas em relação ao formulário você consegue receber se o mouse estiver no formulário, uma vez que o mouse está sobre o botão, você consegue receber a coordenadas do botão...

    Uma alternativa seria você fazer mais ou menos o seguinte esquema: Imagino que você está pegando essas coordenadas no evento MouseMove do seu formulário, não é? Então crie um evento MouseMove também para o seu botão... Assim você se encontra no seguinte cenário: você possui as coordenadas do seu botão [Left e Top] em relação ao seu formulário e ainda as coordenadas do mouse em relação ao seu botão... Basta agora realizar um cálculo simples para você receber a posição do seu mouse como um todo [em relação ao formulário], acrescendo a posição do mouse em relação ao botão... Mais ou menos assim:

    // Define duas variáveis inteiras que receberão as cooredenadas em relação ao formulário
    int X = 0;
    int Y = 0;
    
    // Método MouseMove do formulário
    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
             // Atribui as coordenadas do formulário às variáveis X e Y
             X = e.X;
             Y = e.Y;
    }
    
    // Método MouseMove do botão
    private void button1_MouseMove(Object sender, MouseEventArgs e)
    {
            // Inicializa duas variáveis inteiras que recebem as cooredenadas em relação ao botão
            int x = e.X;
            int y = e.Y;
    
            // Acrescenta às coordenadas principais as coordenadas do botão
            X += x;
            Y += y;
    }
    

    Esse é um exemplo simples de como você poderia fazer, só para ter uma ideia mesmo de como funciona...

    Espero que ajude...

    Até mais, abraços...

    Monday, September 19, 2011 1:47 PM
  • Agradeço pela atenção ao responder a dada questão, 

    O princípio parte, em certa parte, disso. Porém, quando calculo as posições, ainda avalia e adiciona valores X e Y muito grandes, incondizentes com os valores cartográficos reais. Vou tentar arranjar outra solução, assim mesmo agradeço pelo raciocínio dado.


    Monday, September 19, 2011 3:41 PM
  • Consegui resolver esse problema. Utilizei um artifício semelhante ao seu raciocínio:

     // Define duas variáveis inteiras que receberão as cooredenadas em relação ao formulário 
    
      int X = 0;
      int Y = 0;
    
    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        // Atribui as coordenadas do formulário às variáveis X e Y
        X = e.X;
        Y = e.Y;
    }
    
    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        //Desta vez os resultados saíram mais consistentes
        X = button1.Location.X + e.X;
        Y = button1.Location.Y + e.Y;
    }
    


      Testei no formulário e deu certo. As posições X e Y saíram corretamente.

    Monday, September 19, 2011 3:59 PM
  • É isso aí Cristian,

    era extamente essa a ideia...

    Parabéns!

    Monday, September 19, 2011 4:33 PM