Как установить событие на клик мышки?
-
Tuesday, April 03, 2012 1:19 PM
На поле есть элемент 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
Скриншот:
Цель: при нажатии на любой элемент 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
Добрый день.
Давайте уточним, правильно ли я вас понял:
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
> есть событие 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 PMModerator
Может быть проще будет обработать на 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
Просто невозможно чтоб я понял (я вид не прошёл много чего), но я пока читаю книгу и надеюсь там этому будет описание, и если это простая задача то я рад, значит в дальнейшем пойму, тоесть в книге мне встретиться.То что вы ничего не поняли - это плохо, лучше будет разобраться, иначе дальше будет хуже. Подпись на событие - простая задача.
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
- Edited by Doctor Gordon Wednesday, April 04, 2012 11:02 AM

