Windows 8 でタッチ操作でグリッドをスクロールしたときに描画がズレる。(最後が隠れる)
.NET Framework 標準の DataGridView を使って WindowsFormApplication を作成し、 Windows 8 搭載のタブレット端末で実行したところ、グリッドの一番下が見えない現象が発生しました。
画面のグリッドには50行ありますが45行目までしか見えていないのにスクロールバーは最後までいっています。
クリックで拡大
スクロールバーが表示される程度の行数がありそれをタッチ操作でスクロールさせるときです。
ゆっくり最後までスクロールした場合には大丈夫なのですが、たくさんスクロールしたいときなどにサッサッとスクロールしようとするとグリッドの最後まで表示されないままにスクロールバーだけ最後に到達した状態になってしまいます。
上へスクロールしたときも同じことが起こります。
この現象についてConnect に投稿がありました。
しかし、不具合(バグ)と認識されつつも「解決策: 修正しない」とのこと。。。
https://connect.microsoft.com/VisualStudio/feedback/details/775102/windows8
諦めかけていたのですが何かないかと調べていたところ、
Visual Studio サポートチーム blog に回避方法が投稿されていました。
http://blogs.msdn.com/b/jpvsblog/archive/2014/08/19/datagridview.aspx
掲載されたサンプルを試してみたところ問題なく最後までスクロールできたのですが、今回はVB.NETで書かれたDataGridViewのカスタムコントロールを使用していたためこの回避策もVB.NETで書いてみました。
Private Const WM_VSCROLL As Integer = &H115
Private Const SB_THUMBPOSITION As Integer = &H4
Private Const SB_THUMBTRACK As Integer = &H5
<System.Runtime.InteropServices.DllImport("user32")> _
Private Shared Function PostMessage(hWnd As IntPtr, Msg As Integer, wParam As IntPtr, lParam As IntPtr) As Integer
End Function
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
MyBase.WndProc(m)
If m.Msg = WM_VSCROLL Then
If Me.LoWord(CLng(m.WParam)) = Me.LoWord(CLng(SB_THUMBPOSITION)) Then
MyBase.BeginInvoke(New Action(Of IntPtr, IntPtr)(Sub(WParam As IntPtr, LParam As IntPtr)
Dim testWParam As IntPtr = New IntPtr(5)
DataGridviewEx.PostMessage(MyBase.Handle, 277, testWParam, LParam)
End Sub), New Object() {m.WParam, m.LParam})
End If
End If
End Sub
Protected Function LoWord(input As Long) As Short
Return CShort((CInt(input) And 65535))
End Function
クリックで拡大
Visual Studio サポートチーム blog にも書かれていますがこの回避方法についてはよく検証してください。
採用にあたってはご自身の判断でお願いします。
【参考情報】
Visual Studio Connect
https://connect.microsoft.com/VisualStudio/feedback/details/775102/windows8
Visual Studio サポートチーム blog
http://blogs.msdn.com/b/jpvsblog/archive/2014/08/19/datagridview.aspx