基本的に、単純なカウンターを作成しているとしましょう。マウスをクリックすると、カウンターが上がります。私の質問は、マウスを押したままカウンターを流すことを可能にするイベントをどのようにプログラムすればよいかということです。これは基本的に、マウスのみで KeyPress イベント ハンドラーとまったく同じように機能します。
3 に答える
他の理由でタイマーを実行する必要がない場合は、タイマーを使用しません。何をしているかに応じて、クラス プロパティまたはグローバル変数を使用します。
private/public startTicks long = 0;
MouseDown イベントを発生させると、次のようになります。
startTicks = DateTime.Now.Ticks;
MouseUp イベントで、差を取り、必要な時間要素 (分、秒、時間) に変換します。
DoConversion(DateTime.Now.Ticks - startTicks);
Microsoft の Reactive Framework (Rx)を使用したソリューションを提案します。
MouseDown
&MouseUp
イベントはフォームのクリックに基づいておりNumericUpDown
、マウスが押されている間 0.1 秒ごとにインクリメントしたいコントロールがあると仮定しました。
ソリューションをコーディングする Reactive Framework の方法は次のとおりです。
var mouseDowns = Observable.FromEventPattern
<MouseEventHandler, MouseEventArgs>(
h => this.MouseDown += h,
h => this.MouseDown -= h);
var mouseUps = Observable.FromEventPattern
<MouseEventHandler, MouseEventArgs>(
h => this.MouseUp += h,
h => this.MouseUp -= h);
var intervals = Observable.Interval(TimeSpan.FromSeconds(0.1));
var query =
from md in mouseDowns
select intervals.TakeUntil(mouseUps);
query.Switch().ObserveOn(this).Subscribe(n => numericUpDown1.Value += 1);
The reactive query should be very easy to understand its purpose - basically it is "When you get a mouse down select the intervals until there is a mouse up."
The type of query
is IObservable<IObservable<long>>
so before the Subscribe
we need to call Switch
to turn the query into an IObservable<long>
.
The ObserveOn(this)
makes sure that the values of the observable are marshalled to the UI thread.
Rx can be a little tricky to learn, but once you've got it it is very powerful. I use it all the time.
イベントが発生したときにイベントの発生を開始するタイマーを定義しMouseDown
ます。次にMouseUp
、タイマーを一時停止または停止するようにイベントを設定します。タイマーが経過したときにトリガーしたいコードを実行します。