Frage

Ich brauche ein Ereignis ausgelöst, wenn die Maus über einen PictureBox mit der Maustaste ist bereits geklickt und gehalten wird.

Probleme:

Die MouseDown- und MouseEnter- Event-Handler nicht funktionieren sehr gut zusammen.

Zum Beispiel, wenn eine Maustaste gedrückt und gehalten wird, C # wird die MouseDown- Event-Handler ausgelöst, aber wenn der Cursor über das PictureBox bewegt sich das Mouseenter-Ereignis wird nicht ausgelöst, bis die Maustaste realeased wird.

War es hilfreich?

Lösung

Wenn die Maus dann die meisten Kontrollen nach unten gedrückt wird, wird Control.Capture die Mauseingabe. Dies bedeutet, dass alle Mouse Ereignisse werden auf die ursprüngliche Steuerung gesendet, die nicht der Kontrolle erfasst die Maus über sein geschieht. Dies setzt sich fort, bis die Mausauswahl verliert die in der Regel auf der Maus nach oben passiert.

Wenn Sie wirklich wissen müssen, wenn die Maus über das Steuerelement ist, selbst wenn eine andere Steuermauseingaben erfasst hat man dann wirklich nur eine Art und Weise haben. Sie müssen die Windows-Nachrichten für andere Steuerelemente in Ihrer Anwendung bestimmt herumzuschnüffeln. Dazu müssen Sie einen Nachrichtenfilter müssen hinzufügen ...

Application.AddMessageFilter(myFilterClassInstance);

Dann müssen Sie die IMessageFilter auf einer geeigneten Klasse implementieren ...

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

Dann schauen Sie für Mausbewegungsereignisse und überprüfen, ob sie über das Bildfeld sind und tun, was immer Sie tun wollen.

Andere Tipps

Mausereignisse

, um das Ereignis Mousedown Verwenden Sie nur eine nach unten Drücken einer Maustaste zu erkennen und this.Capture auf true gesetzt, so dass Sie dann andere Mausereignisse erhalten, auch wenn die Maus die Steuerung verlässt (dh es werden keine Mouseleave-Ereignis erhalten weil man mit der Maus) erfasst. Lassen Sie Capture durch this.Capture auf false gesetzt, wenn MouseUp auftritt.

Sie einfach den Status der Maus Überprüfung

Dies kann nicht relevant sein, aber Sie können System.Windows.Control.MousePosition überprüfen und sehen, ob es in der PictureBox.ClientRectangle ist, dann überprüfen Sie die Control.MouseButtons statische Eigenschaft, für die Tasten nach unten jederzeit sein könnten.

Wie in:

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

ein Mousemove-Ereignis innerhalb des Picture-Steuerelement ein:

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

Dann in Ihren Move-Ereignishandler, überprüfen, ob die linke Maustaste (oder was auch immer), um zu sehen gedrückt wird:

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

Wenn Sie versuchen, einen Drag-and-Drop-Vorgang von einer Art zu implementieren, Drag ... Ereignisse (Dragenter, Dragdrop etc.) auf dem Empfangsbildfeld sind, was Sie wollen benutzen. Grundsätzlich Sie die Drag-Operation beginnen die DoDragDrop Methode der Quellcodeverwaltung verwenden, und dann jede Kontrolle, die Sie ziehen über wird seinen Drag ... Ereignisse ausgelöst.

Search "DoDragDrop" auf MSDN, um zu sehen, wie diese umzusetzen.

Der beste Weg, ein Formular basierend auf der Mausposition und steuern relative Position zu bewegen, ist ähnlich zu dem, was Ian Campbell geschrieben.

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

    }

Wo imgMoveWindow ist ein PictureBox-Steuerelement.

Bruno Ratnieks

Sniffer Networks

einen Flag oder einen Zustand auf der Maus nach unten. lassen Sie ihn auf Maus nach oben. Wenn auf der Maus über Feuer für das Bildfeld Ihres Zustand überprüfen. Jetzt können Sie erkennen, wenn eine Person etwas ziehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top