Pergunta

Eu preciso acionar um evento quando o mouse está acima de um PictureBox com o botão do rato já clicado e pressionada.

Problemas:

Os manipuladores de evento MouseDown e MouseEnter não funcionam muito bem juntos.

Por exemplo, uma vez por botão do mouse é clicado e pressionada, C # dispara o manipulador de eventos MouseDown, mas quando o cursor se move sobre o PictureBox o evento MouseEnter não fogo, até que o botão do mouse é realeased.

Foi útil?

Solução

Quando o mouse é pressionado para baixo a maioria dos controles será então Control.Capture a entrada do mouse. Isto significa que todos MouseMove eventos são enviados para o controle original que capturou em vez do controle o mouse passa a ser mais. Isso continua até que o mouse perde captura que normalmente acontece no mouse para cima.

Se você realmente precisa saber quando o mouse está sobre seu controle mesmo quando outro controle tenha capturado entrada do mouse em seguida, você realmente só tem uma maneira. Você precisa bisbilhotar as mensagens do Windows destinados a outros controles dentro de sua aplicação. Para fazer isso você precisa adicionar um filtro de mensagens de ...

Application.AddMessageFilter(myFilterClassInstance);

Em seguida, você precisa implementar o IMessageFilter em uma classe adequada ...

public class MyFilterClass : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == WM_MOUSEMOVE)
            // Check if mouse is over my picture box!

        return false;
    }
}

Em seguida, você prestar atenção para eventos de movimentação do mouse e verifique se eles estão sobre sua caixa de imagem e fazer tudo o que é que você quer fazer.

Outras dicas

Eventos de mouse

Use o evento MouseDown para apenas detectar uma prensa para baixo de um botão do mouse e conjunto this.Capture como true para que você, em seguida, obter outros eventos de mouse, mesmo quando as folhas do mouse o controle (ou seja, você não terá um evento MouseLeave porque você capturado o mouse). captura de liberação, definindo this.Capture para false quando MouseUp ocorre.

Basta verificar o estado do mouse

Isto não pode ser relevante, mas você pode verificar System.Windows.Control.MousePosition e ver se ele está no PictureBox.ClientRectangle, em seguida, verificar a propriedade Control.MouseButtons estática para que os botões pode ser para baixo a qualquer momento.

Como em:

if  (pictureBox.ClientRectangle.Contains(pictureBox.PointToClient(Control.MousePosition)))
{
   if ((Control.MouseButtons & MouseButtons.Left) != 0)
   {
     // Left button is down.
   }
}

configurar um evento MouseMove dentro do controle PictureBox:

this.myPictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.myPictureBox_MouseMove);

Então, dentro de seu manipulador de eventos MouseMove, verifique se o botão esquerdo do mouse (ou qualquer outro) é pressionado:

private void myPictureBox_MouseMove(object sender, MouseEventArgs e)
{  
     if (e.Button == MouseButtons.Left)
         // Do what you want to do
}

Se você está tentando implementar uma operação drag-and-drop de algum tipo, Drag ... eventos (DragEnter, DragDrop etc.) na caixa de imagem de recepção são o que você quer usar. Basicamente, você começa a operação de arrastar usando o método DoDragDrop do controle de origem, e em seguida, qualquer controle que você arrasta ao longo terá o seu arrasto ... eventos levantada.

Pesquisar "DoDragDrop" na MSDN para ver como implementar isso.

A melhor maneira de mover um formulário com base na posição do mouse e controle relativo posição é semelhante ao que Ian Campbell publicado.

    private void imgMoveWindow_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            Form1.ActiveForm.Left = Control.MousePosition.X - imgMoveWindow.Left - (imgMoveWindow.Size.Width/2);
            Form1.ActiveForm.Top = Control.MousePosition.Y - imgMoveWindow.Top - (imgMoveWindow.Size.Height/2); 
        }

    }

Onde imgMoveWindow é um controle PictureBox.

de Bruno Ratnieks

farejadores Networks

definir um sinalizador ou um estado de mouse para baixo. liberá-lo no mouse para cima. Quando a seta do mouse sobre incêndios para a caixa de imagem verificar o seu estado. Agora você pode detectar quando uma pessoa está arrastando alguma coisa.

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