Vraag Hoe kan ik een ingedrukte muisknop detecteren via een PictureBox?


Ik moet een gebeurtenis activeren als de muis boven een PictureBox staat terwijl de muisknop al is ingedrukt en ingedrukt is gehouden.

Problemen:

De gebeurtenishandlers MouseDown en MouseEnter werken niet goed samen.

Wanneer bijvoorbeeld eenmaal op een muisknop wordt geklikt en ingedrukt wordt gehouden, zal C # de gebeurtenishandler MouseDown activeren, maar wanneer de cursor over de PictureBox beweegt, vuurt de MouseEnter-gebeurtenis niet af, totdat de muisknop is losgelaten.


11
2017-10-04 02:27


oorsprong


antwoorden:


Wanneer de muis wordt ingedrukt, zullen de meeste bedieningselementen dan worden gebruikt Control.Capture de muisinvoer. Dit betekent dat alles MouseMove gebeurtenissen worden verzonden naar het originele besturingselement dat is vastgelegd, in plaats van naar het besturingselement dat de muis overkomt. Dit gaat door totdat de muis het vastleggen verliest, wat meestal met de muis gebeurt.

Als je echt wilt weten wanneer de muis over je controle is, zelfs als een ander besturingselement muisinvoer heeft gemaakt, dan heb je eigenlijk maar één manier. U moet de Windows-berichten zoeken die bestemd zijn voor andere bedieningselementen in uw toepassing. Om dat te doen, moet je een berichtenfilter toevoegen ...

Application.AddMessageFilter(myFilterClassInstance);

Dan moet je het IMessageFilter op een geschikte klasse implementeren ...

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

Vervolgens kijk je naar bewegingsgebeurtenissen van de muis en controleer je of ze zich boven je afbeelding bevinden en doen wat je wilt.


14
2017-10-04 03:15



Muis evenementen

Gebruik de gebeurtenis MouseDown om een ​​neerwaartse druk op een muisknop te detecteren en stel deze in.Capture to true, zodat u vervolgens andere muisgebeurtenissen krijgt, zelfs wanneer de muis de besturing verlaat (dwz u krijgt geen MouseLeave-gebeurtenis omdat u hebt vastgelegd de muis). Maak capture vrij door deze.Capture in te stellen op false als MouseUp optreedt.

Gewoon de staat van de muis controleren

Dit is misschien niet relevant, maar u kunt het controleren System.Windows.Control.MousePosition en kijk of het in de PictureBox.ClientRectangle, controleer dan de Control.MouseButtons statische eigenschap waarvoor knoppen op elk gewenst moment kunnen worden uitgeschakeld.

Als in:

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

13
2017-10-04 02:39



Een MouseMove-gebeurtenis instellen in het PictureBox-besturingselement:

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

Controleer vervolgens in je event-handler van MouseMove of de linkermuisknop (of wat dan ook) is ingedrukt:

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

5
2017-11-29 16:43



Als je een of andere vorm van drag-and-drop wilt uitvoeren, de Drag ... -gebeurtenissen (DragEnter, DragDrop etc.) in het vakje voor het ontvangen van afbeeldingen zijn wat u wilt gebruiken. Kortom, u start de sleepbewerking met de DoDragDrop-methode van het bronbesturingselement en vervolgens worden de Drag ... -gebeurtenissen opgeheven voor elk besturingselement dat u sleept.

Zoek "DoDragDrop" op MSDN om te zien hoe dit te implementeren.


3
2017-10-04 05:02



De beste manier om een ​​formulier te verplaatsen op basis van de positie van de muis en de relatieve positie te bepalen is vergelijkbaar met wat Ian Campbell heeft gepost.

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

    }

Waar imgMoveWindow een PictureBox-besturingselement is.

Bruno Ratnieks

Sniffer-netwerken


0
2018-05-19 15:05



zet een vlag of een staat met de muis naar beneden. laat het los op de muis omhoog. Wanneer je met de muis over het vuur gaat voor het beeldvak, controleer dan je staat. Nu kunt u detecteren wanneer iemand iets sleept.


-1
2017-10-04 02:30