كيف يمكنني اكتشاف زر الماوس الذي تم الضغط عليه باستمرار فوق PictureBox؟

StackOverflow https://stackoverflow.com/questions/169590

  •  05-07-2019
  •  | 
  •  

سؤال

أحتاج إلى إطلاق حدث عندما يكون الماوس فوق PictureBox مع النقر فوق زر الماوس بالفعل مع الاستمرار.

مشاكل:

لا تعمل معالجات الأحداث MouseDown وMouseEnter معًا بشكل جيد.

على سبيل المثال، بمجرد النقر على زر الماوس مع الاستمرار، سيطلق C# معالج الحدث MouseDown، ولكن عندما يتحرك المؤشر فوق PictureBox، لا يتم إطلاق الحدث MouseEnter، حتى يتم تحرير زر الماوس.

هل كانت مفيدة؟

المحلول

عند الضغط على الماوس لأسفل معظم الضوابط سوف ثم <م> Control.Capture مدخل الماوس. وهذا يعني أن جميع <م> MouseMove ترسل أحداث لسيطرة الأصلية التي استولت بدلا من السيطرة على الماوس يحدث أن تكون قد انتهت. استمر هذا الوضع حتى يفقد الماوس التقاط والذي يحدث عادة على الماوس لأعلى.

إذا كنت حقا بحاجة الى معرفة متى الماوس فوق التحكم الخاصة بك حتى عندما استولت عنصر تحكم آخر مساهمة الماوس فإنك لا تملك إلا حقا اتجاه واحد. تحتاج إلى تحري الرسائل النوافذ المخصصة لعناصر التحكم الأخرى داخل التطبيق الخاص بك. للقيام بذلك تحتاج إضافة عامل تصفية رسالة ...

Application.AddMessageFilter(myFilterClassInstance);

وبعد ذلك تحتاج إلى تنفيذ IMessageFilter على فئة مناسبة ...

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

وبعد أن تراقب الأحداث الخطوة الماوس ومعرفة ما اذا كانوا فوق مربع صورتك والقيام بكل ما هو أنت تريد القيام به.

نصائح أخرى

أحداث الماوس

استخدم حدث MouseDown لاكتشاف الضغط لأسفل على زر الماوس وضبط هذا. الالتقاط على "صحيح" حتى تتمكن بعد ذلك من الحصول على أحداث الماوس الأخرى، حتى عندما يترك الماوس عنصر التحكم (أي.لن تحصل على حدث MouseLeave لأنك التقطت الماوس).قم بتحرير الالتقاط عن طريق تعيين this.Capture على false عند حدوث MouseUp.

مجرد التحقق من حالة الماوس

قد لا يكون هذا ذا صلة، ولكن يمكنك التحقق منه System.Windows.Control.MousePosition ومعرفة ما إذا كان في PictureBox.ClientRectangle, ، ثم تحقق من Control.MouseButtons خاصية ثابتة قد تكون أزرارها معطلة في أي وقت.

كما في:

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

وإعداد الحدث MouseMove داخل تحكم PictureBox:

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

وبعد ذلك، في الخاص بك معالج الحدث MouseMove، تحقق لمعرفة ما إذا كان زر الماوس الأيسر (أو أيا كان) الضغط:

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

إذا كنت تحاول تنفيذ عملية سحب وإفلات من نوع ما، السحب...الأحداث (DragEnter وDragDrop وما إلى ذلك) في مربع الصورة المتلقية هي ما تريد استخدامه.بشكل أساسي، تبدأ عملية السحب باستخدام أسلوب DoDragDrop لعنصر التحكم المصدر، ومن ثم فإن أي عنصر تحكم تقوم بالسحب فوقه سيكون له سحب...اثارت الأحداث.

ابحث عن "DoDragDrop" على MSDN لمعرفة كيفية تنفيذ ذلك.

وأفضل وسيلة لنقل نموذج يستند إلى موقف الماوس ومراقبة الوضع النسبي مشابهة لما نشر ايان كامبل.

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

    }

وأين imgMoveWindow هو عنصر تحكم PictureBox.

وبرونو Ratnieks

والشم الشبكات

وتعيين إشارة أو دولة على الماوس لأسفل. الإفراج عنها على الماوس لأعلى. عندما على الماوس فوق النار لمربع الصورة تحقق دولتكم. الآن يمكنك الكشف عن عندما يكون الشخص يجر شيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top