رویدادهای ماوس
میتوان از چندین رویداد خاص برای واکنش نشان دادن به اعمالی که با ماوس انجام میشود استفاده نمود. همانطور که می دانید رویداد کلیک زمانی اتفاق می افتد که بر روی ماوس کلیک شود. چندین رویداد پیشرفته برای اداره اعمال ماوس وجود دارد. برخی از این رویدادها دارای یک نماینده (delegate) از نوع MouseEventHandler میباشند که آن نیز به نوبه خود دارای پارامتر MouseEventArgs که شامل جزییاتی در مورد اعمال ماوس است، میباشد. در زیر رویدادهای ماوس که میتوانید از آنها استفاده کنید آمده است :
رویداد | توضیح | |
MouseClick | وقتی روی میدهد که با ماوس بر روی کنترل کلیک شود. | |
MouseDoubleClick | وقتی روی میدهد که با ماوس بر روی کنترل دو بار کلیک شود. | |
MouseDown | وقتی روی میدهد که اشاره گر ماوس بر روی کنترل قرار گرفته و دکمه ماوس به سمت پایین فشار داده شود. | |
MouseEnter | وقتی روی میدهد که ماوس وارد کنترل شود. | |
MouseHover | وقتی روی میدهد که با ماوس بر روی کنترل مکث کنیم. | |
MouseLeave | وقتی روی میدهد که ماوس کنترل را ترک کند. | |
MouseMove | وقتی روی میدهد که ماوس بر روی کنترل حرکت کند. | |
MouseUp | وقتی روی میدهد که ماوس بر روی کنترل قرار دارد و دکمه آن رها میشود. | |
MouseWheel | وقتی روی میدهد که دکمه وسط ماوس که با شکل چرخ است به سمت بالا یا پایین حرکت کند. |
حال اجازه بدهید با برخی از این رویدادها بیشتر آشنا شویم. یک فرم ویندوزی جدید ایجاد کرده و یک کنترل دکمه (button) را در وسط آن قرار دهید (شکل زیر).
دو کنترل کننده رویداد را به رویدادهای MouseEnter و MouseLeave دکمه اضافه کنید. میخواهیم کاری کنیم که با ورود ماوس به محدوده کنترل دکمه، اندازه دکمه بزرگ شده و با دور شدن از آن اندازه دکمه به حالت اول برگردد. کنترل دکمه را انتخاب کرده و سپس به پنجره Properties رفته و بر روی آیکون رعد و برق که پنجره رویدادهای کنترل مذکور است کلیک میکنیم. در پنجره رویدادها، رویداد MouseEnter را پیدا کرده و بر روی آن دو بار کلیک میکنیم تا کنترل کننده رویدادی برای آن ایجاد شود. کد زیر را وارد میکنیم.
private void button1_MouseEnter(object sender, EventArgs e) { button1.Height += 30; button1.Width += 30; button1.Top -= 15; button1.Left -= 15; }
وقتی که ماوس وارد کنترل میشود طول و عرض کنترل به اندازه 30 پیکسل افزایش مییابد. در این حالت برنامه را اجرا کنید و در حالت اجرا چندین بار با ماوس بر روی کنترل بروید مشاهده میکنید که کنترل فقط بزرگ و بزرگتر میشود و به حالت اول بر نمیگردد. اگر فقط خطوط 3 و 4 را درج میکردیم دکمه با هر بار تغییر اندازه میدهد دیگر در وسط فرم قرار نمیگرفت ولی اضافه کردن خطوط 5 و 6 باعث میشود که این کنترل با هر بار تغییر اندازه در وسط فرم قرار بگیرد. حال نوبت آن رسیده که با خروج ماوس از کنترل اندازه آن به حالت اول برگردد. در پنجره رویدادها، رویداد MouseLeave را پیدا کرده و بر روی آن دو بار کلیک میکنیم تا کنترل کننده رویدادی برای آن ایجاد شود. کد زیر را وارد میکنیم.
private void button1_MouseLeave(object sender, EventArgs e) { button1.Height -= 30; button1.Width -= 30; button1.Top += 15; button1.Left += 15; }
کد بالا برعکس رویداد MouseEnter عمل میکند. رویداد MouseClick نسخه بهبود یافته رویداد Click است. این رویداد به شما اجازه میدهد جزییاتی در مورد رویداد click از جمله مکان کنترلی که با ماوس بر روی آن کلیک شده است را به دست آورید. اجازه بدهید که یک کنترل کننده رویداد به رویداد MouseClick کنترل دکمه اضافه کنیم. ابتدا از پنجره Properties به قسمت رویدادها رفته و رویداد MouseClick پیدا کنید و بر روی آن دو بار کلیک کنید. با استفاده از کد زیر طول و عرض مکانی که شما بر روی آن کلیک میکنید نسبت به کوشه سمت چپ بالای کنترل در اختیار شما قرار داده میشود :
private void button1_MouseClick(object sender, MouseEventArgs e) { MessageBox.Show(String.Format("Clicked at point ({0}, {1})", e.X, e.Y)); }
کنترل کننده رویداد با استفاده از شی MouseEventArgs به مختصات X و Y نقطهای که شما بر روی آن کلیک کردهاید دست مییابد. حال با هر بار کلیک بر رو دکمه یک پیغام که نشان دهنده مختصات مکانی است که کلیک کردهاید به شما نشان داده میشود.
برای روشن شدن عملکرد این رویداد یک کنترل کننده رویداد به رویداد MouseDown اضافه میکنیم. فقط به یاد داشته باشید که رویداد MouseClick با رویداد MouseDown تداخل دارد پس رویداد MouseClick را یا حذف کنید و یا به حالت توضیحات در آورید. کد زیر را به کنترل کننده رویداد MouseDown اضافه کنید :
private void button1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) MessageBox.Show("Left Click"); else if (e.Button == MouseButtons.Right) MessageBox.Show("Right Click"); else MessageBox.Show("Middle Click"); }
کد بالا از شی MouseEventArgs برای دسترسی به خاصیتهای کنترل Button استفاده میکند و شامل جزییاتی است که نشان میدهد کاربر بر روی کدام دکمه ماوس کلیک کرده است، راست یا چپ؟ نوع شمارشی MouseButton دارای سه مقدار Left ،Right و Middle که نشان دهنده سه دکمه ماوس هستند، میباشد. از رویداد MouseWheel برای تشخیص اینکه آیا دکمه وسط ماوس (که غالباً با شکل یک چرخ با سمت بالا و پایین حرکت میکند) حرکت کرده است یا نه استفاده میشود. این رویداد در پنجره Properties موجود نیست و برای دسترسی به آن باید کد نوشت. در سازنده فرم، درست زیر متد InitializeComponent کد زیر را تایپ کنید. دقیقاً بعد از تایپ += دو بار کلید tab را فشار دهید تا کنترل کننده رویداد مربوط به MouseWheel برای شما تولید شود.
public Form1() { InitializeComponent(); button1.MouseWheel += new MouseEventHandler(button1_MouseWheel); }
کد زیر را نیز برای رویداد MouseWheel بنویسید :
void button1_MouseWheel(object sender, MouseEventArgs e) { button1.Height += e.Delta / 60; button1.Width += e.Delta / 60; button1.Top -= e.Delta / 120; button1.Left -= e.Delta / 120; }
در کد بالا از خاصیت Delta از کلاس MouseEventArgs استفاده کردهایم. فرض کنید که کلیک وسط ماوس دارای چرخ دنده است که به سمت عقب و جلو حرکت میکنند و مقدار هر یک از آنها برابر با ثابت WHEEL_DATA و 120 است. ما مقدار Delta را بر 60 تقسیم کرده یام بنابراین با هر بار حرکت دکمه وسط ماوس، طول و عرص کنترل به جای 120 پیکسل، 2 پیکسل افزایش مییابد. با حرکت دکمه ماوس به بالا مقادیر مثبت و با حرکت به پایین آن مقادیر منفی اعمال میشوند. دو خط آخر هم برای این است که مکان دکمه در وسط صفحه حفظ شود. در این دو خط مقدار Delta بر 120 تقسیم شده است در نتیجه با هر بار چرخش چرخ دندهها، قسمت بالا و چپ دکمه 1 پیکسل حرکت میکند. برنامه را اجرا کنید، از آنجاییکه فوکوس بر روی کنترل button است با حرکت دکمه وسط ماوس به جول اندازه کنترل بزرگ و با حرکت آن به سمت عقب اندازه آن کوچک میشود.
کل کد :
using System; using System.Windows.Forms; namespace WindowsFormsApplication4 { public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.MouseWheel+=new MouseEventHandler(button1_MouseWheel); } void button1_MouseWheel(object sender, MouseEventArgs e) { button1.Height += e.Delta / 60; button1.Width += e.Delta / 60; button1.Top -= e.Delta / 120; button1.Left -= e.Delta / 120; } private void button1_MouseEnter(object sender, EventArgs e) { button1.Height += 30; button1.Width += 30; button1.Top -= 15; button1.Left -= 15; } private void button1_MouseLeave(object sender, EventArgs e) { button1.Height -= 30; button1.Width -= 30; button1.Top += 15; button1.Left += 15; } private void button1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) MessageBox.Show("Left Click"); else if (e.Button == MouseButtons.Right) MessageBox.Show("Right Click"); else MessageBox.Show("Middle Click"); } private void button1_MouseClick(object sender, MouseEventArgs e) { MessageBox.Show(String.Format("Clicked at point ({0}, {1})", e.X, e.Y)); } } }
خیلی عالی بود واقعا متشکرم
سلام ببخشید کدی میخوام که زمانی که موس روی جعبه تصویر رفت تصویر زمینه فرم مثل اون جعبه متن شه راهمایی کنین سپاس گذار میشم
سلام، سوالتونو تو لینک زیر مطرح بفرمایید تا دوستان راهنمایی کنن
w3-farsi.com/forum
چطور میشه همین کد بزرگ شدن دکمه را در کلاس دیگه نوشت و برای دکمه های زیادی که دارم صدا کرد؟برای تک تک دکمه ها باید کد نویسی بشه ؟