マルチモニタ環境で右のディスプレイに表示されるべきツールチップが左のディスプレイに表示される場合がある
対象製品
SPREAD for Windows Forms 7.0J
状況
修正済み
詳細
マルチモニタ環境で右のセカンダリディスプレイに表示されるべき
ツールチップが左のメインディスプレイに表示される場合があります。
【手順】
1.新規フォームにSPREADを配置します
2.下記サンプルコードをコピーし、アプリケーションを実行します
3.マルチモニタ環境で左のメインディスプレイの画面中央より左を起点に右のセカンダリディスプレイの画面中央より左までフォームを広げます
4.右のセカンダリディスプレイのセルにマウスを移動します
--ツールチップが左のメインディスプレイに表示されます
【サンプルコード】
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' データの設定
For i As Integer = 0 To FpSpread1.ActiveSheet.RowCount - 1
For j As Integer = 0 To FpSpread1.ActiveSheet.ColumnCount - 1
FpSpread1.ActiveSheet.SetValue(i, j, String.Format("Row={0} Col={1}", i, j))
Next
Next
' TextTipの設定
FpSpread1.TextTipPolicy = FarPoint.Win.Spread.TextTipPolicy.Floating
FpSpread1.Dock = DockStyle.Fill
End Sub
ツールチップが左のメインディスプレイに表示される場合があります。
【手順】
1.新規フォームにSPREADを配置します
2.下記サンプルコードをコピーし、アプリケーションを実行します
3.マルチモニタ環境で左のメインディスプレイの画面中央より左を起点に右のセカンダリディスプレイの画面中央より左までフォームを広げます
4.右のセカンダリディスプレイのセルにマウスを移動します
--ツールチップが左のメインディスプレイに表示されます
【サンプルコード】
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' データの設定
For i As Integer = 0 To FpSpread1.ActiveSheet.RowCount - 1
For j As Integer = 0 To FpSpread1.ActiveSheet.ColumnCount - 1
FpSpread1.ActiveSheet.SetValue(i, j, String.Format("Row={0} Col={1}", i, j))
Next
Next
' TextTipの設定
FpSpread1.TextTipPolicy = FarPoint.Win.Spread.TextTipPolicy.Floating
FpSpread1.Dock = DockStyle.Fill
End Sub
回避方法
Service Pack 4(v7.0.2016.2008)で修正済み。
Service Pack 4(v7.0.2016.2008)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
SPREADのテキストチップの機能の代わりに標準のツールチップを使います。
【サンプルコード】
Private tt As New ToolTip()
Private pos As Point
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' データの設定
For i As Integer = 0 To FpSpread1.ActiveSheet.RowCount - 1
For j As Integer = 0 To FpSpread1.ActiveSheet.ColumnCount - 1
FpSpread1.ActiveSheet.SetValue(i, j, String.Format("Row={0} Col={1}", i, j))
Next
Next
'' TextTipの設定
'FpSpread1.TextTipPolicy = FarPoint.Win.Spread.TextTipPolicy.Floating
End Sub
Private Sub FpSpread1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles FpSpread1.MouseMove
' マウスポインタ位置の情報の取得
Dim htInfo As FarPoint.Win.Spread.HitTestInformation = FpSpread1.HitTest(e.X, e.Y)
' マウスポインタがセル上にある場合
If Not htInfo Is Nothing AndAlso htInfo.Type = FarPoint.Win.Spread.HitTestType.Viewport Then
' セル番号の取得
Dim row As Integer = htInfo.ViewportInfo.Row
Dim col As Integer = htInfo.ViewportInfo.Column
' 同一セル上でのツールチップの繰り返し表示の禁止
If Not pos = New Point(row, col) Then
' セル領域の取得
Dim rect As Rectangle = FpSpread1.GetCellRectangle(0, 0, row, col)
' セルの文字列の取得
Dim value As String = FpSpread1.ActiveSheet.GetText(htInfo.ViewportInfo.Row, htInfo.ViewportInfo.Column)
' セルのフォントの取得
Dim f As Font = FpSpread1.ActiveSheet.Cells(row, col).Font
If f Is Nothing Then f = FpSpread1.Font
' 文字列の幅の取得
Dim textWidth As Integer = TextRenderer.MeasureText(value, f).Width
' セルの幅の取得
Dim cellWidth As Integer = rect.Width
' 文字列がセル内に表示しきれない場合
If textWidth > cellWidth Then
' セルの左下隅にツールチップを1秒間表示します。
tt.Show(value, FpSpread1, rect.Left, rect.Bottom, 1000)
End If
' 現在のセル番号の保存
pos = New Point(row, col)
End If
End If
End Sub
Service Pack 4(v7.0.2016.2008)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
SPREADのテキストチップの機能の代わりに標準のツールチップを使います。
【サンプルコード】
Private tt As New ToolTip()
Private pos As Point
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' データの設定
For i As Integer = 0 To FpSpread1.ActiveSheet.RowCount - 1
For j As Integer = 0 To FpSpread1.ActiveSheet.ColumnCount - 1
FpSpread1.ActiveSheet.SetValue(i, j, String.Format("Row={0} Col={1}", i, j))
Next
Next
'' TextTipの設定
'FpSpread1.TextTipPolicy = FarPoint.Win.Spread.TextTipPolicy.Floating
End Sub
Private Sub FpSpread1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles FpSpread1.MouseMove
' マウスポインタ位置の情報の取得
Dim htInfo As FarPoint.Win.Spread.HitTestInformation = FpSpread1.HitTest(e.X, e.Y)
' マウスポインタがセル上にある場合
If Not htInfo Is Nothing AndAlso htInfo.Type = FarPoint.Win.Spread.HitTestType.Viewport Then
' セル番号の取得
Dim row As Integer = htInfo.ViewportInfo.Row
Dim col As Integer = htInfo.ViewportInfo.Column
' 同一セル上でのツールチップの繰り返し表示の禁止
If Not pos = New Point(row, col) Then
' セル領域の取得
Dim rect As Rectangle = FpSpread1.GetCellRectangle(0, 0, row, col)
' セルの文字列の取得
Dim value As String = FpSpread1.ActiveSheet.GetText(htInfo.ViewportInfo.Row, htInfo.ViewportInfo.Column)
' セルのフォントの取得
Dim f As Font = FpSpread1.ActiveSheet.Cells(row, col).Font
If f Is Nothing Then f = FpSpread1.Font
' 文字列の幅の取得
Dim textWidth As Integer = TextRenderer.MeasureText(value, f).Width
' セルの幅の取得
Dim cellWidth As Integer = rect.Width
' 文字列がセル内に表示しきれない場合
If textWidth > cellWidth Then
' セルの左下隅にツールチップを1秒間表示します。
tt.Show(value, FpSpread1, rect.Left, rect.Bottom, 1000)
End If
' 現在のセル番号の保存
pos = New Point(row, col)
End If
End If
End Sub