سؤال

لذلك بحثت قليلاً على Google للعثور على بعض التعليمات البرمجية لسحب الأزرار مع الماوس. لقد وجدت الكثير ، على الرغم من أن أيا من هؤلاء كان يعمل بالفعل بالنسبة لي.

لذلك أنا أسألك! :-)

الرمز الذي أحاول الحصول عليه في النموذج الخاص بي:

bool isDragged = false;
  Point ptOffset;
  private void button1_MouseDown( object sender, MouseEventArgs e )
  {
     if ( e.Button == MouseButtons.Left )
     {
        isDragged = true;
        Point ptStartPosition = button1.PointToScreen(new Point(e.X, e.Y));

        ptOffset = new Point();
        ptOffset.X = button1.Location.X - ptStartPosition.X;
        ptOffset.Y = button1.Location.Y - ptStartPosition.Y;
     }
     else
     {
        isDragged = false;
     }
  }

  private void button1_MouseMove( object sender, MouseEventArgs e )
  {
     if ( isDragged )
     {
        Point newPoint = button1.PointToScreen(new Point(e.X, e.Y));
        newPoint.Offset(ptOffset);
        button1.Location = newPoint;
     }
  }

  private void button1_MouseUp( object sender, MouseEventArgs e )
  {
     isDragged = false;
  }

لقد قمت بالطبع بتغيير PictureBox1 إلى Button1.

لكنني لا أستطيع الحصول على هذا للعمل.

أي شخص قد يعرف لماذا؟

أوه ، وأريد استخدام هذا في جميع الأزرار الخاصة بي ، فما الذي يجب أن أستبدله Button1 لجعله يعمل في جميع الأزرار؟

-BTW ، أستخدم Visual Studio Express.

شكرا لكم مقدما!

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

المحلول

على الرغم من أنني في الحقيقة مجرد نسخ لصق عندما يتعلق الأمر بأشكال Windows

الكود الذي نشرته لن يفعل أي شيء في حد ذاته!

للعمل ، يجب أن تكون أحداث Mousedown () و mousemove () من السيطرة على هذه الطرق:

  1. حدد عنصر التحكم في النموذج (PictureBox1).
  2. في جزء الخصائص (أسفل اليمين بشكل افتراضي) ، انقر فوق أيقونة "Lightning Bolt" للحصول على قائمة بالأحداث لهذا التحكم.
  3. أعثر على MouseDown الدخول وتغيير المنسدلة إلى يمينها pictureBox1_MouseDown.
  4. أعثر على MouseMove الدخول وتغيير المنسدلة إلى يمينها pictureBox1_MouseMove.

الآن قم بتشغيله واسحب PictureBox1.

تحرير: هنا هو كيفية جعل الرمز يعمل لضوابط متعددة ، كما هو موضح في تعليقي أدناه.

    bool isDragged = false;
    Point ptOffset;

    private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            isDragged = true;
            Button btn = (Button)sender;
            ptOffset = new Point(btn.Location.X - Cursor.Position.X, btn.Location.Y - Cursor.Position.Y);
        }
        else
        {
            isDragged = false;
        }
    }

    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDragged)
        {
            Point newPoint = Cursor.Position;
            newPoint.Offset(ptOffset);
            Button btn = (Button)sender;
            btn.Location = newPoint;
        }
    }

    private void button1_MouseUp(object sender, MouseEventArgs e)
    {
        isDragged = false;
    }

نصائح أخرى

حسنًا ، الأخبار السارة: نأمل أن يكون لدينا تخطيط لسطح المكتب CSI بمجرد الانتهاء من ذلك.

الأخبار غير السارة: أعتقد أنك تحاول أن تفعل الشيء الخطأ.

أفترض أنك تستخدم WinForms ، ولكن يجب أن تكون الفكرة هي نفسها بالنسبة إلى WPF. عندما تقوم بتشغيل البرنامج ، يتم تعيين التخطيط (إما ديناميكيًا ، على سبيل المثال ، يتغير عند تغيير حجم النافذة ، أو بشكل ثابت ، على سبيل المثال عند تعيينه مع موضع X ، Y المطلق).

ما تريد القيام به هو نوع من: أريد أن أحصل على فوائدهم في إنشاء جميع رمز لوحة المرجل ، ولكن بعد ذلك ، أريد تغييره ديناميكيًا في وقت التشغيل ...

أعتقد أنك بحاجة إلى إعادة التفكير في نهجك ، واتخاذ هذه الخطوة الواحدة في كل مرة (بعد كل شيء ، استغرق الأمر سنوات من Microsoft للحصول على واجهة المستخدم الرسومية إلى حيث يوجد في الوقت الحالي ... سيستغرق الأمر بعض الوقت للحصول على مستقبلي رائع واجهة المستخدم الرسومية خارج).

خذ خطوات الطفل ، ولكن ضع في اعتبارك الصورة الكبيرة:

  • ابدأ بتعريف قماش.
  • ثم يمكنك وضع زر عليه.
  • ثم تخدع حول نقل هذا الزر على قماش. (يجب أن تعمل الرمز الذي لديك في سؤالك لكائن على قماش).

من هناك ، استمر في اتخاذ خطوات ستجعلك أقرب إلى وجهتك ...

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