HOME >> Tips >> Microsoft.NET

Windows 8 でタッチ操作でグリッドをスクロールしたときに描画がズレる。(最後が隠れる)

2015/3/13
文書番号:20201




.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