رویدادهای ماوس

می توان از چندین رویداد خاص برای واکنش نشان دادن به اعمالی که با ماوس انجام می شود استفاده نمود. همانطور که می دانید رویداد کلیک زمانی اتفاق می افتد که بر روی ماوس کلیک شود. چندین رویداد پیشرفته برای اداره اعمال ماوس وجود دارد. برخی از این رویدادها دارای یک نماینده (delegate) از نوع MouseEventHandler می باشند که آن نیز به نوبه خود دارای پارامتر MouseEventArgs که شامل جزییاتی در مورد اعمال ماوس است، می باشد. در زیر رویدادهای ماوس که می توانید از آنها استفاده کنید آمده است :

رویداد توضیح
MouseClick وقتی روی می دهد که با ماوس بر روی کنترل کلیک شود.
MouseDoubleClick وقتی روی می دهد که با ماوس بر روی کنترل دو بار کلیک شود.
MouseDown وقتی روی می دهد که اشاره گر ماوس بر روی کنترل قرار گرفته و دکمه ماوس به سمت پایین فشار داده شود.
MouseEnter وقتی روی می دهد که ماوس وارد کنترل شود.
MouseHover وقتی روی می دهد که با ماوس بر روی کنترل مکث کنیم.
MouseLeave وقتی روی می دهد که ماوس کنترل را ترک کند.
MouseMove وقتی روی می دهد که موس بر روی کنترل حرکت کند.
MouseUp وقتی روی می دهد که ماوس بر روی کنترل قرار دارد و دکمه آن رها می شود.
MouseWheel وقتی روی می دهد که دکمه وسط ماوس که با شکل چرخ است به سمت بالا یا پایین حرکت کند.

حال اجازه بدهید با برخی از این رویدادها بیشتر آشنا شویم. یک فرم ویندوزی جدید ایجاد کرده و یک کنترل دکمه (button) را در وسط آن قرار دهید (شکل زیر).
mouse-events-01
دو کنترل کننده رویداد را به رویدادهای 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));
        }
    }
}

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر و اگر سوالی دارید در بخش پرسش و پاسخ مطرح بفرمایید.

  1. حسین پاسخ دادن

    چطور میشه همین کد بزرگ شدن دکمه را در کلاس دیگه نوشت و برای دکمه های زیادی که دارم صدا کرد؟برای تک تک دکمه ها باید کد نویسی بشه ؟