2011-10-10 5 views
2

を押しながら:C#のループマウスダウンボタンは、私は、左マウス・ボタンを押している間、ループを使用したい

private void Loop_MouseDown(object sender, MouseEventArgs e) 
     { 
      while (e.Button==MouseButtons.Left) 
      { 
      //Loop 
      } 
     } 

私はこのスレッドからソリューションを使用することはできません:私はRS232経由で送信していますので
C# how to loop while mouse button is held down をデータとそれ自身の間隔でタイマーを使用することは機能しません。また、このトピックのどの解決策も私のためには機能しません。 また、ここのようなものを動作することはできません。

if (e.Button == MouseButtons.Left) 
    { 
     //loop 
    } 

このソリューションはまた、動作しません:

bool isLooping = false; 

//on mouse down 
private void myControl_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { 
    isLooping = true; 
    runLoop(); 
} 

//on mouse up event 
private void myControl_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { 
    isLooping = false; 
} 

//This is the main loop you care about. Put this in your application 
//This should go in its own thread 
void runLoop() { 
    while (isLooping) { 
     //do stuff 
    } 
} 

を実行ループを呼び出すと、スレッドをブロックし、そのためMouseUpイベントが発火することはないので。

正しく動作させるにはどうすればいいですか?

+0

なぜこれが欲しいですか? – TJHeuvel

+0

タイマーが動作しないのはなぜですか? – SLaks

+0

APIを使用してマウスボタンの現在の状態を取得することを検討しましたか? –

答えて

2

はBackgroundWorkerのを使用してください。あなたの問題に完璧です。

ループ機能をワーカーに配置し、マウスイベントでワーカーを開始/停止します。

+0

「停止」と言ったら、「[キャンセル](http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.cancelasync.aspx)」という意味ですか? – svick

+0

sryはRunWorkerAsync&CancelAsyncを意味しました – jrb

+0

簡単で素敵なソリューションです。 Tnx;) – Elfoc

0

タイマーを使用できない場合は、別のスレッドでデータを送信し、そのスレッドにMouseUpハンドラから信号を送る必要があります。

0

これを行う正しい方法は、rs-232 send関数を別のスレッドに入れてUIが反応し続けるようにすることです。マウスイベントが変化したときに開始して停止することができます。

このページでは、便利かもしれません:

http://www.yoda.arachsys.com/csharp/threads/winforms.shtml

0

これらのシナリオは実装するのが非常に複雑です。状態を格納するためのハンドラとブール変数を参照してください。

Reactive Extensionsを使用することをお勧めします。

編集:

これはおそらく、少し過剰設計(これはElfocが実装したいだけのシナリオであれば、私は知りません)になります。任意のマウスアップイベントがテイクを提起されるまで - Rxのでは、照会やイベントに

var leftMouseDown = from evt in mouseDown 
    where evt.LeftButton == MouseButtonState.Pressed 
    select evt; 

をフィルタリングおよびRxの演算子を使用して、それを構成するために使用LINQツーRxのイベント

var mouseDown = Observable.FromEvent<MouseButtonEventArgs>(source, "MouseDown"); 
var mouseUp = Observable.FromEvent<MouseButtonEventArgs>(image, "MouseUp"); 
var mouseMove = from evt in Observable.FromEvent<MouseEventArgs>(image, "MouseMove") 
    select evt.EventArgs.GetPosition(this); 

の観察可能なシーケンスを作成することができますすべての位置をマウスの左がダウンして最後に

var q = from position in leftMouseDown 
    from pos in mouseMove.Until(mouseUp) 
    select new { X = pos.X - imageOffset.X, Y = pos.Y - imageOffset.Y }; 

ありながら、位置の観察可能なシーケンスを購読すると、あなたのものを行う

q.Subsribe(value => { ... }); 

コードhereから少し変更されています。

関連する問題