Как установить событие на клик мышки?

Answered Как установить событие на клик мышки?

  • Tuesday, April 03, 2012 1:19 PM
     
      Has Code

    На поле есть элемент button, нужно чтобы при нажатии на любую кнопку мышки у элемента button текст менялся, знаю есть лёгкий способ, но мне нужно чтото вроде этого:

            protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                switch (keyData)
                {
                    case MouseButtons.Left: break;
                }
                return base.ProcessCmdKey(ref msg, keyData);
            }

    Но этот код не срабатывает, есть событие MouseDown на форму, но оно не срабатывает когда нажимаю на саму кнопку button, если интересно вабше в чём дело могу дать скрин проги и код.


    Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.

All Replies

  • Tuesday, April 03, 2012 1:49 PM
     
      Has Code

    Скриншот:

    Цель: при нажатии на любой элемент Label текст нажатого элемента Label менялся на текст "X".

    Вот код программы:

            private void Form1_MouseDown(object sender, MouseEventArgs e)
            {
                var labels = Controls.OfType<Label>().ToList();
                int X = MousePosition.X - Left;
                int Y = MousePosition.Y - Top;
                for (int i = 0; i < labels.Count; i++)
                    if ((X >= labels[i].Location.X) & (X <= labels[i].Location.X + labels[i].Width) & (Y >= labels[i].Location.Y) & (Y <= labels[i].Location.Y + labels[i].Height))
                        labels[i].Text = "X";
            }

    Код проходит компиляцию но не делает то что нужно, так как код работает когда я нажимаю на Form, а когда нажимаю на любой элемент Label код не срабатывает.

    Следующий код тоже не работает:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                switch (keyData)
                {
                    case MouseButtons.Left
                        {
                            var labels = Controls.OfType<Label>().ToList();
                            int X = MousePosition.X - Left;
                            int Y = MousePosition.Y - Top;
                            for (int i = 0; i < labels.Count; i++)
                                if ((X >= labels[i].Location.X) & (X <= labels[i].Location.X + labels[i].Width) & (Y >= labels[i].Location.Y) & (Y <= labels[i].Location.Y + labels[i].Height))
                                    labels[i].Text = "X";
                            break;
                        }
                }
                return base.ProcessCmdKey(ref msg, keyData);
            }

    Входит такая ошибка:


    Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.

  • Tuesday, April 03, 2012 1:55 PM
     
      Has Code

    Добрый день.

    Давайте уточним, правильно ли я вас понял:

    1. Вас интересует клик мышки в пределах формы? 

    2. Нужно ли что бы по нажатию на кнопку происходило какое либо другое событие, отличное от клика по форме, и надо ли при этом исполнять действие глобального клика?

    Вобщем если ответы "да" то можно так:

                this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.GlobalMegaClick);
                this.button1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.button1Click);
            

    private void GlobalMegaClick(object sender, MouseEventArgs e)         {             MessageBox.Show("GlobalMegaClick");         }         private void button1Click(object sender, MouseEventArgs e)         {

                GlobalMegaClick(sender, e);             MessageBox.Show("button1Click");         }

      

    • Marked As Answer by Doctor Gordon Tuesday, April 03, 2012 3:07 PM
    • Unmarked As Answer by Doctor Gordon Tuesday, April 03, 2012 3:30 PM
    • Unmarked As Answer by Doctor Gordon Tuesday, April 03, 2012 3:30 PM
    •  
  • Tuesday, April 03, 2012 2:08 PM
     
      Has Code

    > есть событие MouseDown на форму, но оно не срабатывает когда нажимаю на саму кнопку button
     
     
    чтобы перехватить любое нажатие на форме можно поключить IMessageFilter;
    в примере ниже перехватывается нажатие над кнопкой, вложенной в Panel.

     

    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form, IMessageFilter
        {
            public Form1()
            {
                Application.AddMessageFilter(this);
    
                _Label = new Label() { Parent = this, Dock = DockStyle.Top, BackColor = Color.Yellow };
                var p = new Panel { Padding = new Padding(20), Dock = DockStyle.Bottom, Parent = this };
                new Button { Parent = p, Text = "Test" };
            }
    
            Label _Label;
    
            public bool PreFilterMessage(ref Message m)
            {
                switch (m.Msg)
                {
                    case 0x0201:  // WM_LBUTTONDOWN
                        _Label.Text = "" + Control.FromHandle(m.HWnd);
                        break;
                }
                return false;
            }
        }
    }
    

       
             

    • Marked As Answer by Doctor Gordon Tuesday, April 03, 2012 3:11 PM
    • Unmarked As Answer by Doctor Gordon Tuesday, April 03, 2012 3:31 PM
    • Unmarked As Answer by Doctor Gordon Tuesday, April 03, 2012 3:31 PM
    • Unmarked As Answer by Doctor Gordon Tuesday, April 03, 2012 3:31 PM
    •  
  • Tuesday, April 03, 2012 2:42 PM
    Moderator
     
     Answered Has Code

    Может быть проще будет обработать на Click на всех Label? Например, добавить всем созданным меткам обработчик в том коде, где вы из создаете. Или сразу для всех, если метки уже лежат на форме в дизайнере:

            private void Form1_Load(object sender, EventArgs e)
            {
                Controls.OfType<Label>().ToList().ForEach(l => l.Click += OnLabelClick);
            }
    
            private void OnLabelClick(object sender, EventArgs eventArgs)
            {
                ((Label) sender).Text = "X";
            }
    

    • Marked As Answer by Doctor Gordon Tuesday, April 03, 2012 3:11 PM
    • Unmarked As Answer by Doctor Gordon Tuesday, April 03, 2012 3:31 PM
    • Marked As Answer by Doctor Gordon Tuesday, April 03, 2012 3:31 PM
    •  
  • Tuesday, April 03, 2012 3:32 PM
     
     
    Спасибо всем, но из всего я ничего не понял, но использовать могу, и я пожалуй использую короткий метод PashaPash.

    Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.

  • Wednesday, April 04, 2012 6:39 AM
     
     

    Спасибо что отметили ответ. То что вы ничего не поняли - это плохо, лучше будет разобраться, иначе дальше будет хуже. Подпись на событие - простая задача.


    Для связи [mail]

  • Wednesday, April 04, 2012 11:01 AM
     
     

    То что вы ничего не поняли - это плохо, лучше будет разобраться, иначе дальше будет хуже. Подпись на событие - простая задача.

    Просто невозможно чтоб я понял (я вид не прошёл много чего), но я пока читаю книгу и надеюсь там этому будет описание, и если это простая задача то я рад, значит в дальнейшем пойму, тоесть в книге мне встретиться.

    Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.