Como posso detectar um botão pressionado mouse sobre um PictureBox?
-
05-07-2019 - |
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.
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.