سؤال

أقوم بتطوير تطبيق لنظام التشغيل Windows Mobile (Framework Framework 2.0). لديها winforms مع صورة صورة.

أريد أن نقل صورة صورة Picture لكنني لا أعرف كيفية القيام بذلك، لذلك اخترت نقل ثقب الصور.

للقيام بذلك، استخدم هذا الحدث:

private void imagenMapa_MouseMove(object sender, MouseEventArgs e)
{
      imagenMapa.Left = e.X;
      imagenMapa.Top = e.Y;
      this.Refresh();
}

ولكن عندما أقوم بتحريك وصياغة وينقل كل مكان.

ماذا أفعل الخطأ؟

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

المحلول

ال e.X و e.Y نسبة إلى المربع الصورة (على سبيل المثال إذا كان الماوس في الجزء العلوي الأيسر من المربع الصورة، فهذا هو 0،0).

القيم ل imagenMapa.Left و imagenMapa.Top هي نسبة إلى النموذج (أو أي عنصر تحكم يحتوي imagenMapa)

إذا حاولت مزج القيم من هذين النظامين دون تحويل، فستحصل على القفزات (مثل رؤيتك).

ربما تكون أفضل حالا حول تحويل موقع الماوس إلى نفس نظام الإحداثيات المستخدمة من قبل الشيء الذي يحتوي على مربع الصورة.

يمكنك استخدام imagenMapa.PointToScreen للحصول على إحداثيات الماوس في إحداثيات الشاشة (أو Cursor.Position للحصول على الموقف مباشرة)، و yourForm.PointToClient للحصول عليها مرة أخرى في إحداثيات النموذج.

لاحظ أنه اعتمادا على احتياجاتك، يمكنك إنجاز "نقل صورة داخل عنصر تحكم" عن طريق تجاوز / التعامل مع Paint حدث من عنصر تحكم ورسم الصورة بنفسك. إذا قمت بذلك، فيمكنك الاحتفاظ بكل شيء في إحداثيات PictureBox، لأن تلك من المحتمل أن تستخدمها عندما اتصلت graphicsObject.DrawImage.

نصائح أخرى

الرمز الفعلي (يتطلب .NET Framework 3.5 وما بعده، لست متأكدا مما إذا كان هذا متاحا في الإطار المضغوط) ...

// Global Variables
private int _xPos;
private int _yPos;
private bool _dragging;

// Register mouse events
pictureBox.MouseUp += (sender, args) =>
{
    var c = sender as PictureBox;
    if (null == c) return;
    _dragging = false;
};

pictureBox.MouseDown += (sender, args) =>
{
    if (args.Button != MouseButtons.Left) return;
    _dragging = true;
    _xPos = args.X;
    _yPos = args.Y;
};

pictureBox.MouseMove += (sender, args) =>
{
    var c = sender as PictureBox;
    if (!_dragging || null == c) return;
    c.Top = args.Y + c.Top - _yPos;
    c.Left = args.X + c.Left - _xPos;
};

EX & EY موجود في مساحة الإحداثيات لصور الصورة، ImageShenmapa.left & imagenmapa.top موجود في مساحة الإحداثيات من النموذج. :-)

أيضا لا تنس أن تحدد النموذج الخاص بك بمثابة مزدوج مؤقتا، مما قد يساعد في الخفقان، ولكن لتحديد المواقع الفعلية منه، أحب اقتراح دانيال L

احتضان الرياضيات!

control.Left = control.Left - (_lastMousePos.X - currentMousePos.X);
control.Top = control.Top - (_lastMousePos.Y - currentMousePos.Y);

Explanation السريع: يمكنك الحصول على الفرق من مراكز الماوس وتطبيقه على الكائن الذي تريد نقله.

مثال: إذا كان موضع الفأر القديم X هو 382، والآخر هو 385، ثم الفرق هو -3. إذا كانت الضوابط الحالية X Position هي 10 ثم 10 - (-3) = 13

لماذا: إنه يعمل من أجل أي شيء، وهو أرخص بكثير من الإحداثيات باستمرار الإحداثيات ذهابا وإيابا.

في الواقع ما قمت به هو الصحيح. لكنك قدمت خاصية Mousemove إلى PictureBox. يجب أن تعطي هذه الخاصية إلى النموذج (الخلفية).

السابق:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
  imagenMapa.Left = e.X;
  imagenMapa.Top = e.Y;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top