PDA

View Full Version : مبتدی: جابجا کردن موقعیت برنامه در صفحه با موس



ya30ien2
جمعه 08 مهر 1390, 07:50 صبح
چطوری میتونم با موس موقعیت برنامه رو تغییر بدم
یعنی به اینور و اونور بکشمش

Mahnet
جمعه 08 مهر 1390, 09:24 صبح
با سلام
شما می تونی از تابع drag توی زبان برنامه نویسی استفاده کنین و یا اگر مایل هستین خودتون برنامه نویسی کنین تا پایان این بخش با من باشین ...
الگوریتم برنامه :
1- از event های mousedown و mouseup و mousemove برای این برنامه استفاده کنین.
2- متغیری از نوع boolean تعریف کنین که اگر mousedown بود مقدارش true و اگر mouseup بود مقدارش false بشه.
3- زمانی که mousedown شد و متغیر boolean مقدارش false بود موقعیت X و Y ماوس رو از موقعیت left و top شی مورد نظر در صفحه کم کنین و در جایی ذخیره کنین.(این کار برای اینه که موقعیت ماوس رو زمانی که mousedown میشه نسبت به اون شی برای اولین لحظه داشته باشیم)
4- زمانی که می خواین یک شی رو جابجا کنین ابتدا متغیر boolean رو چک کنین که آیا mousedown هست یا نه اگر بود و اگر mousemove شد اونوقت موقعیت X و Y ماوس فعلی رو از مقدارهای ذخیره شده در مرحله سوم کم کنین تا موقعیت left و top فعلی شی مورد نظر به دست بیاد و اون ها رو set کنین ...
5- این الگوریتم با jquery به شکل زیر هست....

var isMouseDown = false;
var X,Y;
$(document).ready(function() {
$('.window').mousedown(function(e){
if(!isMouseDown){
isMouseDown = true;
var objPos = $(this).offset();
X = (e.pageX - objPos.left);
Y = (e.pageY - objPos.top);
}
});

$('body').mousemove(function(e){
if(isMouseDown){
var objX = e.pageX-X;
var objY = e.pageY-Y;
$('.window').offset({ left: objX, top: objY });
}
});

$('.window').mouseup(function(e){
if(isMouseDown){
isMouseDown = false;
}
});

});

6- دقت کنین که اگر برنامه تون تحت وب هست حتما position شی مورد نظر از نوع absolute یا fixed باشه که در اینجا شی من یک div از کلاس window هست.

.window {
position : absolute;
}

7- این هم یک demo از این الگوریتم با jquery ....
احتمالا الگوریتم های مناسب تری هم وجود داره ...
موفق باشین...

nilmil_nil
جمعه 08 مهر 1390, 10:17 صبح
اینم کد سی شارپ با توجه به الگوریتم دوستمون

private bool CanMove = false;
private int CurrentX, CurrentY;

private void Form2_MouseDown(object sender, MouseEventArgs e)
{
CanMove = true;
CurrentX = e.X - this.Left;
CurrentY = e.Y - this.Top;

}

private void Form2_MouseMove(object sender, MouseEventArgs e)
{
if (CanMove == true)
{
this.Left = e.X-CurrentX;
this.Top = e.Y-CurrentY;
}
}

private void Form2_MouseUp(object sender, MouseEventArgs e)
{
CanMove = false;
}

ya30ien2
جمعه 08 مهر 1390, 14:32 عصر
دوستان خیلی جالب بود اما یکم سرعتش کم هستش
یعنی اگه چند لحظه موس رو بکشیم صفحه میلرزه
راه حل بهتری ندارید ؟

wolf_majid
جمعه 08 مهر 1390, 15:22 عصر
این تاپیک می تونه کمکتون کنه

http://barnamenevis.org/showthread.php?303833-%D8%A7%D8%AC%D8%B1%D8%A7-%D9%86%D8%B4%D8%AF%D9%86-%D8%B1%D9%88%DB%8C%D8%AF%D8%A7%D8%AF-%DB%8C%DA%A9-UserControl-%DA%A9%D9%87-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%81%D8%B1%D9%85-%D9%87%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B3%D8%A7%D8%AE%D8%AA%D9%87-%D8%A7%D9%85

استفاده از یوزینگ زیر هم فراموش نکنید
using System.Runtime.InteropServices;
و همچنین رخداد مورد نظر را به موس داون فرم اختصاص بدید

ya30ien2
جمعه 08 مهر 1390, 20:03 عصر
لطفا اگه میشه یک نمونه کار بزارید ممنون میشم

wolf_majid
جمعه 08 مهر 1390, 20:11 عصر
public Form1()
{
InitializeComponent();
AddEventToUserControl(this);
}

#region MoveForm
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;

[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd,
int Msg, int wParam, int lParam);

[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();

#endregion
private void Label_Or_OtherComponent_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}

private void AddEventToUserControl(Control _ctrl)
{
foreach (Control ctrl in _ctrl.Controls)
{
if (ctrl is GroupBox || ctrl is Panel)
{
ctrl.MouseDown += new MouseEventHandler(Label_Or_OtherComponent_MouseDow n);
AddEventToUserControl(ctrl);
}
}
}

ya30ien2
جمعه 08 مهر 1390, 23:15 عصر
دوست عزیز این خط واسه من ارور داره
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
بعد باید کجای کد بعد چطوری به اون کنترل نسبتش بدم؟

wolf_majid
جمعه 08 مهر 1390, 23:27 عصر
شما تابع Label_Or_OtherComponent_MouseDown رو به رویداد موس داون فرم اضافه کنید
در ضمن یادتون نره یوزینگ زیر را به کار ببرید
using System.Runtime.InteropServices;

دیگه فکر نمی کنم مشکلی پیش بیاد

ya30ien2
جمعه 08 مهر 1390, 23:39 عصر
داداش خیلی ممنون از کمکت اما اگه یک لطفی کنی و یک برنامه بزاری که این مثال رو روش انجام داده باشی خیلی خیلی ممنون میشم

ya30ien2
جمعه 08 مهر 1390, 23:40 عصر
چون من هنوز اون ارور بالایی رو دارم

wolf_majid
جمعه 08 مهر 1390, 23:56 عصر
این هم یک نمونه

vesall
شنبه 09 مهر 1390, 00:00 صبح
من توی فرمم یه پنل دارم، که یه لیبل توش هست، میخوام کاربر بتونه با استفاده از اون لیبل، پنل رو تکون بده.

با این کد چطوری میتونم اون کار رو بکنم ؟

wolf_majid
شنبه 09 مهر 1390, 00:10 صبح
public Form1()
{
InitializeComponent();
}

#region MoveForm
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;

[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();

#endregion

/*
private void Label_Or_OtherComponent_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}

* */

private void label1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(panel1.Handle , WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}

vesall
شنبه 09 مهر 1390, 00:16 صبح
چی شد الان ؟:لبخند:

مرسیییی. فقط، این با ویژوال 10 نوشته شده؟

wolf_majid
شنبه 09 مهر 1390, 00:21 صبح
چی شد الان ؟:لبخند:

چی چی شد ؟ :D

حل شد دیگه

vesall
شنبه 09 مهر 1390, 00:28 صبح
ببخشید، اگر لطف کنید کد رو خط به خط رشرح بدید و بگید چطور کار میکنه ممنون میشم. ( تا برای افراد مبتدی مثل من، جنبه ی آموزشی هم داشته باشه. الان من فقط ازش استفاده می کنم بدون اینکه بفهمم چی به چیه ! )

ya30ien2
شنبه 09 مهر 1390, 00:29 صبح
با استفاده از فایلی که قرار دادین کارم راه افتاد
فقط یک سوال با این که من فقط همین کدها رو کپی کردم اما روی همون ابزاری که میخواستم قرار بگیره قرار گرفت و هیچ کد دیگه ای هم اضافه نکردم و باید بگم که اون ابزار فرم نبود یک پنل بود چطوری این اتفاق افتاد

wolf_majid
شنبه 09 مهر 1390, 00:33 صبح
:لبخند:
من هم به کد کاملا" مسلط نیستم و این رو توی مباحث ویژه به صورت تقریبی یاد گرفتم

شاید این پی دی اف بتونه کمکتون کنه

wolf_majid
شنبه 09 مهر 1390, 00:36 صبح
با استفاده از فایلی که قرار دادین کارم راه افتاد
فقط یک سوال با این که من فقط همین کدها رو کپی کردم اما روی همون ابزاری که میخواستم قرار بگیره قرار گرفت و هیچ کد دیگه ای هم اضافه نکردم و باید بگم که اون ابزار فرم نبود یک پنل بود چطوری این اتفاق افتاد

دلیلش این تابعه
private void AddEventToUserControl(Control _ctrl)
{
foreach (Control ctrl in _ctrl.Controls)
{
if (ctrl is GroupBox || ctrl is Panel)
{
ctrl.MouseDown += new MouseEventHandler(Label_Or_OtherComponent_MouseDow n);
AddEventToUserControl(ctrl);
}
}