PDA

View Full Version : سوال: جابجا کردن فرم با کلیک بر روی هر قسمت از آن - بدون استفاده از توابع API



babak1
پنج شنبه 30 دی 1389, 23:23 عصر
چندتا سوال داشتم از این برنامه که به عنوان مثال در سایت گذاشته شده .(بخشهای ستاره دار)



private bool dragging;
private Point pointchecked;

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
dragging = true;
pointchecked = new Point(e.X, e.Y);
}
else
dragging = false;
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (dragging)
{
Point movePoint;
movePoint = this.PointToScreen(new Point(e.X, e.Y)); **
movePoint.Offset(-pointchecked.X, -pointchecked.Y); **
this.Location = movePoint; **
}

}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
dragging = false;
}


1- چرا از pointToscreen استفاده کردیم و مستقیما e.x و e.y رو کپی نکردیم ؟ یعنی movepoint =new point (e.x,e.y)
2- خط دوم رو اگه کامل برام توضیح بدید ممنون میشم.
3- در خط سوم چه چیری از movePoint در location ریخنه میشود؟ دقیقا x وy مشخص نشده ؟؟

prankster
جمعه 01 بهمن 1389, 00:07 صبح
1- در وقفه های Mouse از هر کنترل (از جمله form) مقادیر e.X و e.Y مختصات نقطه نسبت به همان کنترل است. که در اینجا مختصات نسبت به نقطه بالا-سمت چپ form است. برای تبدیل آن به مختصات screen از PointToScreen استفاده می شود
2- مختصات بدست آمده از بالا را در صورتی که به Form نسبت دهیم، نقطه بالا-سمت چپ Form به نقطه مورد نظر منتقل خواهد شد، برای حفظ موقعیت قبلی، باید مختصات بدست آمده از مرحه قبل را از مختصات نقطه کیک شده روی فرم کم کنید که با Offset انجام شده است، این کار فقط تصحیح موقعیت است
3- movePoint دقیقا مختصات بدست آمده از دو مرحله قبل است که به Location فرم نسبت داده می شود. X و Y کلیک شده روی فرم به مختصات صفحه تبدیل شده برای حفظ موقعیت تصحیح شده است.

babak1
جمعه 01 بهمن 1389, 10:29 صبح
دوست عزیز من یه خرده گیج شدم !! منظور از تصحیح موقعیت چیست ؟ اگه ما با pointToScreen موقعیت فرم نسبت به کل صفحه رو بدست می آریم دیگه چه نیازی به offset و موقعیت اول است. خوب یک دفعه pointToscreen رو به location اختصاص می دیم که بره به نقطه جدید نسبت به screen.
در ضمن من چطور می تونم این برنامه رو تست کنم ؟ چون خود ویندوز این کار رو انجام میده
با تشکر.

prankster
جمعه 01 بهمن 1389, 11:26 صبح
با استفاده از pointToScreen موقعیت نقطه را نسبت به کل صفحه بدست می آورید، اما در صورتی که این نقطه را به Location فرم نسبت دهید از آنجایی که Location مکان بالا-سمت چپ فرم است، فرم به نقطه مورد نظر منتقل می شود امانقطه بالا-سمت چپ آن به آن نقطه منتقل می شود! برای تصحیح مکانی نقطه کلیک شدن از Offset استفاده شده است
برای تست کد بالا را دقیقا درون کد فرم کپی کنید. این خطوط را هم برای register کردن event ها درون Constructor قرار دهید:


public Form1()
{
InitializeComponent();
this.MouseDown += new MouseEventHandler(Form1_MouseDown);
this.MouseUp += new MouseEventHandler(Form1_MouseUp);
this.MouseMove += new MouseEventHandler(Form1_MouseMove);
}

babak1
شنبه 02 بهمن 1389, 15:52 عصر
بهتر هستش سوالم رو این طور بپرسم که چطور میشه یک پنجره رو بی حرکت کرد. (که بعدش با به کار بردن این توابع پنجره من movable بشه)

shuriken
یک شنبه 03 بهمن 1389, 08:46 صبح
شما میتونید استایل فورمتون رو بدون boarder کنید اینطوری دیگه نمیشه حرکتش داد
بعدش بکمک همین توابع میتونید فرم رو تکون بدید.
برای کنترل اینکه کی باید اجازی حرکت بش داده بشه هم خودتون براحتی میتونین کنترل کنین.