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

می‌توان از چندین رویداد خاص برای واکنش نشان دادن به اعمالی که با ماوس انجام می‌شود استفاده نمود. همانطور که می دانید رویداد کلیک زمانی اتفاق می افتد که بر روی ماوس کلیک شود. چندین رویداد پیشرفته برای اداره اعمال ماوس وجود دارد. برخی از این رویدادها دارای یک نماینده (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));
        }
    }
}