Pergunta

Então, pesquisei um pouco no Google para encontrar algum código para arrastar botões com o mouse. Encontrei muito, mesmo que nenhum deles realmente tenha funcionado para mim.

Então estou perguntando a você! :-)

O código que estou tentando trabalhar no meu formulário:

bool isDragged = false;
  Point ptOffset;
  private void button1_MouseDown( object sender, MouseEventArgs e )
  {
     if ( e.Button == MouseButtons.Left )
     {
        isDragged = true;
        Point ptStartPosition = button1.PointToScreen(new Point(e.X, e.Y));

        ptOffset = new Point();
        ptOffset.X = button1.Location.X - ptStartPosition.X;
        ptOffset.Y = button1.Location.Y - ptStartPosition.Y;
     }
     else
     {
        isDragged = false;
     }
  }

  private void button1_MouseMove( object sender, MouseEventArgs e )
  {
     if ( isDragged )
     {
        Point newPoint = button1.PointToScreen(new Point(e.X, e.Y));
        newPoint.Offset(ptOffset);
        button1.Location = newPoint;
     }
  }

  private void button1_MouseUp( object sender, MouseEventArgs e )
  {
     isDragged = false;
  }

É claro que mudei o PictureBox1 para Button1.

Mas eu simplesmente não consigo fazer isso funcionar.

Alguém que pode saber por quê?

Ah, e eu quero usar isso em todos os meus botões, então com o que devo substituir o botão1 para fazê -lo funcionar em todos os botões?

-Btw, eu uso o Visual Studio Express.

Agradeço antecipadamente!

Foi útil?

Solução

Mesmo que eu esteja realmente apenas copie a colagem quando se trata de formulários do Windows

O código que você postou não fará nada por si só!

Para trabalhar, os eventos de Mousedown () e MouseMove () do controle devem ser conectados a esses métodos:

  1. Selecione o controle no formulário (PictureBox1).
  2. No painel Propriedades (canto inferior direito por padrão), clique no ícone "Lightning Bolt" para obter uma lista dos eventos para esse controle.
  3. Encontre o MouseDown entrada e altere o menu suspenso à direita para pictureBox1_MouseDown.
  4. Encontre o MouseMove entrada e altere o menu suspenso à direita para pictureBox1_MouseMove.

Agora execute -o e arraste o PictureBox1.

EDIT: Aqui está como fazer o código funcionar para vários controles, conforme descrito no meu comentário abaixo.

    bool isDragged = false;
    Point ptOffset;

    private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            isDragged = true;
            Button btn = (Button)sender;
            ptOffset = new Point(btn.Location.X - Cursor.Position.X, btn.Location.Y - Cursor.Position.Y);
        }
        else
        {
            isDragged = false;
        }
    }

    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDragged)
        {
            Point newPoint = Cursor.Position;
            newPoint.Offset(ptOffset);
            Button btn = (Button)sender;
            btn.Location = newPoint;
        }
    }

    private void button1_MouseUp(object sender, MouseEventArgs e)
    {
        isDragged = false;
    }

Outras dicas

Ok, as boas notícias: espero que tenhamos um layout de desktop CSI quando terminar.

A notícia não tão boa: acho que você está tentando fazer a coisa errada.

Suponho que você esteja usando o WinForms, mas a ideia deve ser a mesma para o WPF. Quando você executa seu programa, o layout é definido (ou dinamicamente, por exemplo, ele muda quando você redimensiona a janela ou estaticamente, por exemplo, quando você o define com a posição absoluta x, y).

O que você quer fazer é meio: quero obter os benefícios deles criando todo o código da placa da caldeira, mas depois quero alterá -lo dinamicamente no tempo de execução ...

Eu acho que você precisa repensar sua abordagem e dar esse passo de cada vez (afinal, levou os anos da Microsoft para levar a GUI para onde está no momento ... levará algum tempo para conseguir o futurista legal GUI está fora).

Dê passos do bebê, mas lembre -se do quadro geral:

  • Comece com uma tela definida.
  • Então você pode colocar um botão nele.
  • Em seguida, brigue com a movimentação do botão na tela. (O código que você tem em sua pergunta deve funcionar para um objeto em uma tela).

A partir daí, continue tomando medidas que o aproximarão do seu destino ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top