2

基本的に、単純なカウンターを作成しているとしましょう。マウスをクリックすると、カウンターが上がります。私の質問は、マウスを押したままカウンターを流すことを可能にするイベントをどのようにプログラムすればよいかということです。これは基本的に、マウスのみで KeyPress イベント ハンドラーとまったく同じように機能します。

4

3 に答える 3

2

他の理由でタイマーを実行する必要がない場合は、タイマーを使用しません。何をしているかに応じて、クラス プロパティまたはグローバル変数を使用します。

private/public startTicks long = 0;

MouseDown イベントを発生させると、次のようになります。

startTicks = DateTime.Now.Ticks;

MouseUp イベントで、差を取り、必要な時間要素 (分、秒、時間) に変換します。

DoConversion(DateTime.Now.Ticks - startTicks);
于 2012-10-27T21:44:48.390 に答える
1

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.

于 2012-10-28T00:33:21.777 に答える
0

イベントが発生したときにイベントの発生を開始するタイマーを定義しMouseDownます。次にMouseUp、タイマーを一時停止または停止するようにイベントを設定します。タイマーが経過したときにトリガーしたいコードを実行します。

于 2012-10-27T21:13:15.520 に答える