Domanda

Devo lanciare un evento quando il mouse si trova sopra un PictureBox con il pulsante del mouse già premuto e tenuto premuto.

Problemi:

I gestori di eventi MouseDown e MouseEnter non funzionano molto bene insieme.

Ad esempio, quando si fa clic e si tiene premuto un pulsante del mouse, C # genererà il gestore eventi MouseDown, ma quando il cursore si sposta su PictureBox l'evento MouseEnter non si attiva, fino a quando il pulsante del mouse non viene rilasciato.

È stato utile?

Soluzione

Quando il mouse viene premuto, la maggior parte dei controlli Control.Capture sarà l'input del mouse. Ciò significa che tutti gli eventi MouseMove vengono inviati al controllo originale acquisito anziché al controllo su cui si trova il mouse. Questo continua fino a quando il mouse perde l'acquisizione, che di solito avviene al passaggio del mouse.

Se hai davvero bisogno di sapere quando il mouse è sotto il tuo controllo anche quando un altro controllo ha catturato l'input del mouse, allora hai davvero solo un modo. È necessario curvare i messaggi di Windows destinati ad altri controlli all'interno dell'applicazione. Per fare ciò è necessario aggiungere un filtro messaggi ...

Application.AddMessageFilter(myFilterClassInstance);

Quindi devi implementare IMessageFilter su una classe adatta ...

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;
    }
}

Quindi osservi gli eventi di spostamento del mouse e controlli se si trovano sopra la tua casella immagine e fai qualunque cosa tu voglia fare.

Altri suggerimenti

Eventi del mouse

Usa l'evento MouseDown per rilevare semplicemente una pressione del pulsante del mouse e impostalo. Cattura su true in modo da ottenere altri eventi del mouse, anche quando il mouse lascia il controllo (ovvero non otterrai un evento MouseLeave perché hai catturato il mouse). Rilascia l'acquisizione impostando this.Capture su false quando si verifica MouseUp.

Basta controllare lo stato del mouse

Potrebbe non essere pertinente, ma puoi controllare System.Windows.Control.MousePosition e vedere se si trova in PictureBox.ClientRectangle , quindi controllare Control.MouseButtons proprietà statica per la quale i pulsanti potrebbero essere inattivi in ??qualsiasi momento.

Come in:

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

Imposta un evento MouseMove nel controllo PictureBox:

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

Quindi, all'interno del gestore eventi MouseMove, controlla se viene premuto il pulsante sinistro del mouse (o qualsiasi altra cosa):

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

Se stai tentando di implementare un'operazione di trascinamento della selezione di qualche tipo, gli eventi Trascina ... (DragEnter, DragDrop ecc.) nella casella dell'immagine ricevente sono ciò che desideri usare. Fondamentalmente, si avvia l'operazione di trascinamento utilizzando il metodo DoDragDrop del controllo del codice sorgente, quindi qualsiasi controllo trascinato avrà i suoi eventi di trascinamento ...

Cerca " DoDragDrop " su MSDN per vedere come implementarlo.

Il modo migliore per spostare un modulo basato sulla posizione del mouse e controllare la posizione relativa è simile a quello pubblicato da Ian Campbell.

    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); 
        }

    }

Dove imgMoveWindow è un controllo PictureBox.

Bruno Ratnieks

Reti sniffer

imposta una bandiera o uno stato al passaggio del mouse. rilascialo al passaggio del mouse. Quando si passa il mouse sopra gli incendi per la casella immagine, controllare il proprio stato. Ora puoi rilevare quando una persona sta trascinando qualcosa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top