1

私はWindowsMo​​bileアプリケーション(C#、. Net Framework 2)を持っており、そのコードベースは現在Windows7とWindows8で実行するためにも使用されています。このアプリケーション用に作成したコントロールの1つは、署名をキャプチャするユーザー。このコントロールはWindowsMo​​bileで正常に機能し、署名をかなりうまくキャプチャするために使用できます。ただし、Windowsでは、OnMouseMoveパネルコントロールのオーバーライドメソッドが遅すぎるか、呼び出される頻度が低く、署名が非常に「ブロック」になります。したがって、たとえば、円をキャプチャしようとすると、Windows Mobileでは妥当な円が得られますが、Windowsでは、mousemove十分な頻度で呼び出されないため、正方形が得られます。パネルのOnMouseMoveオーバーライドメソッドは次のとおりです。

protected override void OnMouseMove(MouseEventArgs e)
{
    base.OnMouseMove(e);
    if (!_captureMouseCoordinates) { return; }
    LineToDraw line = new LineToDraw();
    line.StartX = _lastMouseCoordinates.X;
    line.StartY = _lastMouseCoordinates.Y;
    line.EndX = e.X;
    line.EndY = e.Y;
    _points.Add(line);
    _graphicsHandle.DrawLine(_scribblePen, line.StartX, line.StartY, line.EndX, line.EndY);            
    // Refresh rectangle for the line drawn
    Point leftCorner = new Point();
    Size rectangleSize = new Size();
    // Case 1: line down, right
    if (line.StartX <= line.EndX && line.StartY <= line.EndY) 
    {
        leftCorner.X = line.StartX;
        leftCorner.Y = line.StartY;
    }
    // Case 2: Line up, right
    if (line.StartX <= line.EndX && line.StartY >= line.EndY) 
    {
         leftCorner.X = line.StartX;
         leftCorner.Y = line.EndY;
    }
    // Case 3: Line up, left
    if (line.StartX >= line.EndX && line.StartY >= line.EndY) 
    {
        leftCorner.X = line.EndX;
        leftCorner.Y = line.EndY;
    }
    // Case 4: Line down, left
    if (line.StartX >= line.EndX && line.StartY <= line.EndY) 
    {
        leftCorner.X = line.EndX;
        leftCorner.Y = line.StartY;
    }
    rectangleSize.Height = Math.Abs(line.EndY-line.StartY)+1;
    rectangleSize.Width = Math.Abs(line.EndX-line.StartX)+1;
    // save last mouse co-ordinates
    _lastMouseCoordinates.X = line.EndX;
    _lastMouseCoordinates.Y = line.EndY;
    Invalidate(new Rectangle(leftCorner.X,leftCorner.Y, rectangleSize.Width, rectangleSize.Height));
}

上記のコードの_captureMouseCoordinatesブールメンバー変数は、「mousedown」イベントハンドラーに設定されています。

このメソッドでinvalidateをコメントアウトし、mouseupその署名のみを無効にすると、はるかにスムーズになりますが、描画中に署名が表示されないことに気付きました。この署名コントロールのパフォーマンスを向上させて、署名がよりスムーズになり、線が引かれているときにユーザーにフィードバックを提供できるようにする方法を誰かが知っていますか?

4

1 に答える 1

1

_graphicsHandleがどこにあるかはわかりませんが、通常、Graphicsオブジェクトを保存しないでください。すべてのレンダリングをInvalidate()にします。

2つのコレクションを作成します。

List<Point> _currentStroke
List<List<Point>> _allStrokes

MouseMove:

_currentStroke.Add(e.Location)

MouseUp

   _allStrokes.Add(_currentStroke)

各OnPaintで

   foreach(var stroke in _allStrokes)
       {g.DrawLines(pen, stroke.ToArray());}
   if(_currentStroke.Count > 1)
       g.DrawLines(pen, _currentStroke)

(明らかに、すべてのサポートコードを追加します)。

パフォーマンスの問題はないはずです。

于 2013-02-05T17:34:50.470 に答える