2014-01-15 3 views
1

Я пробовал весь день и искал всевозможные идеи ... без реальной помощи. Когда я нажимаю кнопку, например «JOG», которая будет перемещать ось станка с ЧПУ непрерывно, до тех пор, пока нажимается кнопка, а затем при отпускании она останавливается.Как я могу сделать кнопку winform «сделать что-нибудь», пока я нажимаю кнопку?

Чтобы проверить это, я использую «picuture/LED», который, когда я нажимаю и удерживаю, должен быть включен ... и когда я отпускаю, он должен отключиться.

Нажатая кнопка должна = только при нажатии, что-то делать. Выпуск той же кнопки = прекратите делать то, что вы делали сейчас.

Я уверен, что вы продвинутые люди, это, возможно, 101 ... но для меня ... он ест мой обед ... помогите?

+0

Это кнопка на форме окна? –

+0

Что-то вроде этого? http://stackoverflow.com/questions/3727715/repeatbutton-for-winforms – steveg89

+1

опубликуйте свой текущий код. –

ответ

3

Вы можете использовать события MouseDown и MouseUp. Когда удаляется событие MouseDown, вызовите метод, который будет цитировать и выполняет ваше действие. Как только MouseUp попадает в цель, остановите цикл.

private bool _run = false; 

public void button_MouseDown(object sender, EventArgs e) 
{ 
    _run = true; 
    MyAction(); 
} 

public void button_MouseUp(object sender, EventArgs e) 
{ 
    _run = false; 
} 

public void MyAction() 
{ 
    while(_run) 
    { 
     //You actions 
    } 
} 

Обратите внимание, что приведенный выше пример будет зависеть от потока пользовательского интерфейса. Вы должны запустить его в другом потоке, используя BackgroundWorker или что-то подобное.

+3

Без прошивки это может заблокировать ваш пользовательский интерфейс. Будьте осторожны. В противном случае хорошее решение. –

+0

Спасибо, ... Я попробую этот код мыши на кнопках, которые нуждаются в этой функции. Я отчитаю, что я могу сделать. – jeffserv

2

Как правило, взгляните на мышь вверх и вниз. Я хотел бы, чтобы он вызывал некоторые функции асинхронно (а не в потоке пользовательского интерфейса), когда мышь не работает. И остановите его, когда срабатывает событие mouse up. System.Threading имеет несколько хороших моделей для этого. Попробуйте погулять там.

Вы хотите запустить и остановить поток, в котором процедура завершает выполнение вашего действия.

1

я хотел бы сделать свой собственный подкласс, что-то вроде этого:

public class RepeatButton : Button 
{ 
    readonly Timer timer = new Timer(); 

    public event EventHandler Depressed; 

    public virtual TimeSpan Interval 
    { 
     get { return TimeSpan.FromMilliseconds(timer.Interval); } 
     set { timer.Interval = (int)value.TotalMilliseconds; } 
    } 

    public RepeatButton() 
    { 
     timer.Interval = 100; 
     timer.Tick += delegate { OnDepressed(); }; 
    } 

    protected override void OnMouseUp(MouseEventArgs e) 
    { 
     base.OnMouseUp(e); 
     timer.Stop(); 
    } 

    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     base.OnMouseDown(e); 
     timer.Start(); 
    } 

    protected virtual void OnDepressed() 
    { 
     var handler = this.Depressed; 

     if (handler != null) 
      handler(this, EventArgs.Empty); 
    } 
} 

Это позволяет ваш код быть асинхронными, но и Depressed событие будет вызываться в потоке пользовательского интерфейса до сих пор.

0

Спасибо всем, это примерно так же просто, как я мог его получить. Управление кнопками и мышью, смешанное togather, требует обработки мыши ... которое добавляется в свойствах кнопки, что добавит код дизайнеру.

private void button2_MouseDown(object sender, MouseEventArgs e) 
{ 
    led18.Show(); 
} 

private void button2_MouseUp(object sender, MouseEventArgs e) 
{ 
    led18.Hide(); 
} 

//below get automatically put into the design file... 

this.button1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.button1_MouseDown); 
this.button1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.button1_MouseUp); 
Смежные вопросы