Oveeride MouseHover

abasfar

Member
سلام
مشکل من اینکه نمیتونم MouseEventArgs را به تابع MouseHover اضافه کنم
این کد را هم نوشتم اما درست نشد

PHP:
protected override void OnMouseHover(object sender, EventArgs e)
        {
            Console.WriteLine("OnMouseHover");
        }
 

the_king

مدیرکل انجمن
سلام
مشکل من اینکه نمیتونم MouseEventArgs را به تابع MouseHover اضافه کنم
این کد را هم نوشتم اما درست نشد

PHP:
protected override void OnMouseHover(object sender, EventArgs e)
        {
            Console.WriteLine("OnMouseHover");
        }

اگه دقیقا توضیح بدهید که با چه هدفی OnMouseHover رو override می کنید بهتر میشه راهنمایی تون کرد.
فرض کنید که شما در کد فرم تان یک تابع برای مدیریت رخداد های MouseHover مثلا با نام MyEvent دارید :
کد:
        private void MyEvent(object sender, EventArgs e)
        {
            MessageBox.Show("OnMouseHover");
        }

شما با کد های زیر این تابع رو به رخداد MouseHover در فرم و دکمه button1 متصل خواهید کرد :
کد:
            this.MouseHover += new EventHandler(MyEvent);
            button1.MouseHover += new EventHandler(MyEvent);
 

abasfar

Member
سلام
ممنون از جواب شما
من راستش چند تا لیبل دارم تو فرم ام حالا میخوام با کلیک کردن و کشیدن اونهایی که موس از روی انها کشیده میشه همراه با کلیک
رنگش تغییر کننه
 

the_king

مدیرکل انجمن
سلام
ممنون از جواب شما
من راستش چند تا لیبل دارم تو فرم ام حالا میخوام با کلیک کردن و کشیدن اونهایی که موس از روی انها کشیده میشه همراه با کلیک
رنگش تغییر کننه

شما چند تا کنترل Label رو روی فرم قرار دهید و کد های زیر رو به فرم اضافه و برنامه رو اجرا کنید.
هر زمانی که ماوس روی Label ها برود، تغییر ظاهر خواهند داشت :
کد:
        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (Control ctl in this.Controls)
            {
                if (ctl.GetType().Equals(typeof(Label)))
                {
                    ctl.MouseEnter += new EventHandler(OnMouseEnter);
                    ctl.MouseLeave += new EventHandler(OnMouseLeave);
                }
            }
        }

        void OnMouseEnter(object sender, EventArgs e)
        {
            Control label = (Label)sender;
            label.ForeColor = Color.Red;
            label.Font = new Font(label.Font, FontStyle.Bold | FontStyle.Underline);
        }

        void OnMouseLeave(object sender, EventArgs e)
        {
            Control label = (Label)sender;
            label.ForeColor = Color.Black;
            label.Font = new Font(label.Font, FontStyle.Regular);
        }

توجه داشته باشید که در رخداد Form1_Load یک حلقه foreach داریم که کنترل های Label داخل this.Controls
رو پیدا می کند. به همین جهت فرضا اگر Label ها داخل یک GroupBox باشند، این حلقه آنها را نمی یابد.
 

abasfar

Member
ممنون من این کارو کردم اما نمیتونم کنترل بر روی کلیک داشته باشم
مثلا در تابع OnMouseEnter که شما ساختید
میشه یک شرط هم اضافه کنید مبنی بر اینکه کلید چپ موس درحال فشرده شدن است یا نه

این کد را میخوام بنویسم اما نمیشه

PHP:
 private void label1_MouseEnter(object sender, MouseEventArgs e)
        {

        }
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون من این کارو کردم اما نمیتونم کنترل بر روی کلیک داشته باشم
مثلا در تابع OnMouseEnter که شما ساختید
میشه یک شرط هم اضافه کنید مبنی بر اینکه کلید چپ موس درحال فشرده شدن است یا نه

کد:
        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (Control ctl in this.Controls)
            {
                if (ctl.GetType().Equals(typeof(Label)))
                {
                    ctl.MouseEnter += new EventHandler(OnMouseEnter);
                    ctl.MouseLeave += new EventHandler(OnMouseLeave);
                    ctl.MouseDown += new MouseEventHandler(OnMouseDown);
                    ctl.MouseUp += new MouseEventHandler(OnMouseUp);
                    ctl.MouseClick += new MouseEventHandler(OnMouseClick);
                }
            }
        }

        void OnMouseDown(object sender, MouseEventArgs e)
        {
            Control label = (Label)sender;
            label.ForeColor = Color.OrangeRed;
            label.Font = new Font(label.Font, FontStyle.Bold | FontStyle.Underline | FontStyle.Italic);
        }

        void OnMouseUp(object sender, MouseEventArgs e)
        {
            Control label = (Label)sender;
            label.ForeColor = Color.Red;
            label.Font = new Font(label.Font, FontStyle.Bold | FontStyle.Underline);
        }

        void OnMouseClick(object sender, MouseEventArgs e)
        {
            Control label = (Label)sender;
            label.Text += "*";
        }

        void OnMouseEnter(object sender, EventArgs e)
        {
            Control label = (Label)sender;
            label.ForeColor = Color.Red;
            label.Font = new Font(label.Font, FontStyle.Bold | FontStyle.Underline);
        }

        void OnMouseLeave(object sender, EventArgs e)
        {
            Control label = (Label)sender;
            label.ForeColor = Color.Black;
            label.Font = new Font(label.Font, FontStyle.Regular);
        }

یکی از ویژگی های مثبت ویرایشگر Visual Studio تکمیل سریع و ساده کدی است که می نویسید، شما کافی است
که مثلا کد =+ ctl.MouseClick رو بنویسید. خودش برای فشردن کلید Tab و تکمیل خودکار سطر کد شما پیغام
می دهد و اگر فشار دهید سطر را کامل می کند. اگر باز هم کلید Tab را فشار دهید حتی تابع رخداد را هم
برایتان ایجاد می کند.
 

abasfar

Member
ممنون از جواب شما
اما مشکل من این نبود مشکل من
PHP:
 private void[B] label1_MouseEnter[/B](object sender,[B] MouseEventArgs[/B] e) 
        { 
if(e.Button==StyleButton.Left)
//شرط من
        }
مشکل من ایت است که MouseEnter چیزی به نام MouseEventArgs نداره
 

the_king

مدیرکل انجمن
ممنون از جواب شما
اما مشکل من این نبود مشکل من
PHP:
 private void[B] label1_MouseEnter[/B](object sender,[B] MouseEventArgs[/B] e) 
        { 
if(e.Button==StyleButton.Left)
//شرط من
        }
مشکل من ایت است که MouseEnter چیزی به نام MouseEventArgs نداره

اینطور که به نظر می رسه شما می خواهید ابتدا کلید ماوس رو پایین نگه دارید و بعد ماوس رو روی Label ببرید
و این رخداد رو در MouseEnter مدیریت کنید، در حالی که چنین اتفاقی اصلا رخ نمی ده. امتحان کردنش هم خیلی
ساده است، شما کلید چپ ماوس رو روی فرم در یک قسمت خالی پایین نگه داشته و در همان حال روی Label هایی
که در مثال قبلی ایجاد کرده اید ببرید، هیچکدام از آن تغییر رنگ ها رخ نمی دهند. چرا؟ چون وقتی روی یک پنجره ای
(فرم یا کنترل) کلید ماوس فشرده می شود آن پنجره ماوس رو Capture می کند و تا زمانی که Release نشده
رخداد های ماوس در هیچ پنجره دیگری فعال نیست.

دقیقا به همین علت است که خود Framework برای رخداد های MouseEnter از MouseEventArgs استفاده نکرده،
چون اگر قرار می داد هم بی فایده بودند، چون اگر کلید های ماوس فشرده شده بودند اصلا رخداد فراخوانی نمی شد.

من می توانم به شما کدی را پیشنهاد کنم که در همه حال بتوانید متوجه شوید که کلید های ماوس فشرده شده اند
یا خیر، اما طبیعتا اگر بخواهید در MouseEnter فراخوانی شان کنید اول باید در نظر بگیرید که اصلا رخداد MouseEnter
اجرا می شود یا خیر. اگر دقیقا توضیح بدهید که برای چه منتظر فشرده بودن کلید در رخداد MouseEnter هستید
می توانم مشکل تون رو حل کنم.
 
آخرین ویرایش:

abasfar

Member
ممنون از جواب شما
کلید ماوس فشرده می شود آن پنجره ماوس رو Capture می کند و تا زمانی که Release نشده
رخداد های ماوس در هیچ پنجره دیگری فعال نیست.
فرم من به این شکل است
attachment.php

خط کشی ها لیبل هستند یعنی نمیتوانیم نقطه ی پیدا کنیم و کلیک کنیم که مربوط به فرم باشد
حالا من میخوام روی اینها نقاشی کنم
یعنی با نگهداشتن موس وحرکت کردن روی فرم رنگ لیبل تغیر کنند
حالا من نتونستم کد بالایی را بنویسم کد زیر را نوشتم
PHP:
void OnMouseEnter(object sender, EventArgs e)
        {
            if (tf)
                if (!EasMenu.Checked)
                {
                    ((Label)sender).BackColor = Color.Black;
                }
                else
                {
                    ((Label)sender).BackColor = Color.White;
                }
        }    
        private void OnMouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
                tf = true;
        }
        private void OnMouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
                tf = false;
        }

تو این کد کلیک میکنی و رها میکنی شروع میکننه به تغییرات خودش وبعد از ان با کلیک چپ میتونی پایان دهی
 

پیوست ها

  • 1.png
    1.png
    2.2 کیلوبایت · بازدیدها: 12

the_king

مدیرکل انجمن
روال کار رو اینطوری در نظر بگیرید :

1) روی خود فرم و روی همه کنترل های روی فرم زمانی که رخداد MouseDown اتفاق می افته بایستی ماوس
رو Release کنیم تا اگه ماوس در حالت فشرده بودن کلید هایش روی سایر کنترل ها رفت رخداد ها فعال باشند.
برای اینکار یک تابع API ویندوز به اسم ()ReleaseCapture رو Import می کنیم :
کد:
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern int ReleaseCapture();

2) برای اینکه در هر زمان (مثلا داخل رخداد MouseEnter) بدانیم که در این لحظه کلید های ماوس (یا صفحه کلید)
فشرده شده اند یا خیر یک تابع API ویندوز به اسم ()GetKeyState رو Import می کنیم :
کد:
        [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, ExactSpelling = true)]
        private static extern short GetKeyState(int keyCode);

برای ساده تر شدن کار با این تابع یک تابع با همان نام می سازیم که کلیدی از مجموعه Keys دریافت کند و اگر
آن کلید فشرده باشد True و اگر فشرده نباشد False برگرداند :
کد:
        private static bool GetKeyState(Keys key)
        {
            short state = GetKeyState((int)key);
            return ((state & 0x8000) == 0x8000);
        }

به عنوان نمونه کلید سمت چپ ماوس Keys.LButton و کلید سمت راست ماوس Keys.RButton است.

توجه داشته باشید که رنگ آمیزی Label ها در رخداد OnMouseEnter انجام می شود و نیازی به OnMouseLeave
یا OnMouseUp نیست. من در رخداد OnMouseDown رخداد OnMouseEnter را هم فراخوانی کردم، چون زمانی که
ماوس روی یک کنترل قرار دارد، تا زمانی که از روی آن کنترل خارج نشده و برنگشته OnMouseEnter مجددا
اجرا نخواهد شد، پس اگر بخواهیم همان لحظه که ماوس کلیک کرد رنگ Label تغییر کند باید خودمان
OnMouseEnter را فراخوانی کنیم.

کد های زیر رو جایگزین کد های قبلی کنید.
کد:
        [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, ExactSpelling = true)]
        private static extern short GetKeyState(int keyCode);

        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern int ReleaseCapture();

        private static bool GetKeyState(Keys key)
        {
            short state = GetKeyState((int)key);
            return ((state & 0x8000) == 0x8000);
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (Control ctl in this.Controls)
            {
                if (ctl.GetType().Equals(typeof(Label)))
                {
                    ctl.MouseEnter += new EventHandler(OnMouseEnter);
                    ctl.MouseDown += new MouseEventHandler(OnMouseDown);
                }
            }
            this.MouseDown += new MouseEventHandler(OnFormMouseDown);
        }

        void OnFormMouseDown(object sender, MouseEventArgs e)
        {
            ReleaseCapture();
        }

        void OnMouseDown(object sender, MouseEventArgs e)
        {
            ReleaseCapture();
            OnMouseEnter(sender, e);
        }

        void OnMouseEnter(object sender, EventArgs e)
        {
            Control label = (Label)sender;
            if (GetKeyState(Keys.LButton))
            {
                label.BackColor = Color.Black;
            }
            if (GetKeyState(Keys.RButton))
            {
                label.BackColor = Color.White;
            }
        }
 

جدیدترین ارسال ها

بالا