ShapeのCanRotateをFalseにすると、シートの右下隅での移動時にマウスカーソルへの追随が遅くなる

文書番号 : 37689     文書種別 : 不具合     登録日 : 2014/11/26     最終更新日 : 2014/12/15
文書を印刷する
対象製品
SPREAD for Windows Forms 7.0J
状況
修正済み
詳細
ShapeのCanRotateをFalseにすると、CanRotateをTrueに設定した場合と比べてシートの右下隅での移動時にマウスカーソルへの追随が遅くなります。

【手順】
1.新規フォームにSPREADを配置します
2.下記サンプルコードをコピーし、アプリケーションを実行します
3.青色のシェイプ(CanRotateがTrue)を移動します
4.赤色のシェイプ(CanRotateがFalse)を移動します
  --青色のシェイプに比べてマウスカーソルへの追随が遅くなります

【サンプルコード】
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim row As Integer = FpSpread1.ActiveSheet.RowCount - 1
    Dim col As Integer = FpSpread1.ActiveSheet.ColumnCount - 1

    ' シェイプの設定(1)
    Dim shape1 As FarPoint.Win.Spread.DrawingSpace.RectangleShape
    shape1 = New FarPoint.Win.Spread.DrawingSpace.RectangleShape()
    shape1.Name = "shape1"
    shape1.CanRotate = False
    shape1.BackColor = Color.Red
    FpSpread1.ActiveSheet.AddShape(shape1, row, col)

    ' シェイプの設定(2)
    Dim shape2 As FarPoint.Win.Spread.DrawingSpace.RectangleShape
    shape2 = New FarPoint.Win.Spread.DrawingSpace.RectangleShape()
    shape2.Name = "shape2"
    shape2.CanRotate = True
    shape2.BackColor = Color.Blue
    FpSpread1.ActiveSheet.AddShape(shape2, row - 2, col - 2)

    ' 表示位置と画面サイズの設定
    FpSpread1.Dock = DockStyle.Fill
    FpSpread1.SetViewportLeftColumn(0, col)
    FpSpread1.SetViewportTopRow(0, row)
    Me.WindowState = FormWindowState.Maximized
  End Sub
回避方法
Service Pack 4(v7.0.2016.2008)でパフォーマンスが改善されました。
Service Pack 4(v7.0.2016.2008)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

シェイプのMouseDownイベントでCanRotateプロパティをtrueに設定し、MouseUpイベントでCanRotateプロパティをfalseに戻します。

【サンプルコード】
  Private oldState As Boolean
  Private shape As FarPoint.Win.Spread.DrawingSpace.PSShape

  Private Sub FpSpread1_ShapeActivated(ByVal sender As Object, ByVal e As System.EventArgs) Handles FpSpread1.ShapeActivated
    shape = DirectCast(FpSpread1.ActiveWindowlessObject, FarPoint.Win.Spread.DrawingSpace.PSShape)
    If shape IsNot Nothing Then
      AddHandler shape.MouseDown, AddressOf shape_MouseDown
      AddHandler shape.MouseUp, AddressOf shape_MouseUp
    End If
  End Sub

  Private Sub FpSpread1_ShapeDeactivated(ByVal sender As Object, ByVal e As System.EventArgs) Handles FpSpread1.ShapeDeactivated
    If shape IsNot Nothing Then
      shape.CanRotate = oldState
      RemoveHandler shape.MouseDown, AddressOf shape_MouseDown
      RemoveHandler shape.MouseUp, AddressOf shape_MouseUp
      shape = Nothing
    End If
  End Sub

  Private Sub shape_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs)
    shape.CanRotate = oldState
  End Sub

  Private Sub shape_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
    If e.Button = System.Windows.Forms.MouseButtons.Left Then
      oldState = shape.CanRotate

      If shape.GetClientRectangle().Contains(e.Location) AndAlso e.Button = System.Windows.Forms.MouseButtons.Left Then
        shape.CanRotate = True
      End If
    Else
      shape.CanRotate = oldState
    End If
  End Sub