私はWindowsMobileアプリケーション(C#、. Net Framework 2)を持っており、そのコードベースは現在Windows7とWindows8で実行するためにも使用されています。このアプリケーション用に作成したコントロールの1つは、署名をキャプチャするユーザー。このコントロールはWindowsMobileで正常に機能し、署名をかなりうまくキャプチャするために使用できます。ただし、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
その署名のみを無効にすると、はるかにスムーズになりますが、描画中に署名が表示されないことに気付きました。この署名コントロールのパフォーマンスを向上させて、署名がよりスムーズになり、線が引かれているときにユーザーにフィードバックを提供できるようにする方法を誰かが知っていますか?