4

一般的なコントロールを使用してリストビューにグリッド線を描画する際に問題があります。6。リストページを下にスクロールしたり、マウスでページを上にスクロールしたりしようとすると発生します。

スクリーンショット
(ソース:rsdn.ru

私はこのディスカッションhttp://www.ureader.com/msg/1484143.aspxしか見つけることができませんでしたが、解決策は完璧ではありません

  1. LVS_EX_DOUBLEBUFFERが機能しません
  2. スムーズなスクロールを無効にしてもうまくいきません
  3. スクロールで無効化は機能しますが、ちらつきは問題ありません
  4. グリッド線を無効にすることはできますが、グリッド線がないとリストはうまく表示されません。

他に選択肢はありますか?ありがとう!

4

5 に答える 5

2

ObjectListView -- プレーンな .NET WinForms ListView のオープン ソース ラッパー -- は、この問題 (および他の多くの問題) を修正します。

独自のコードで修正する場合は、 の反映された通知をリッスンする必要がありますLVN_ENDSCROLL。エンド スクロールのハンドラーで、次のようにします。

protected void HandleEndScroll(ref Message m) {
    // There is a bug in ListView under XP that causes the gridlines to be 
    // incorrectly scrolled when the left button is clicked to scroll. 
    // This is supposedly documented at KB 813791, but I couldn't find it. 
    if (!ObjectListView.IsVista && 
        Control.MouseButtons == MouseButtons.Left &&
        this.GridLines) {
        this.Invalidate();
        this.Update();
    }
}

これにはわずかなちらつきがありますが、グリッド線が完全に台無しになるよりははるかに優れています。

于 2009-09-14T08:02:38.980 に答える
1

listview をサブクラス化し、WM_VSCROLL メッセージを処理することにしました。

  WORD x=LOWORD(wParam);
  if(iMsg==WM_VSCROLL && (x==SB_PAGEDOWN || x==SB_PAGEUP || x==SB_LINEDOWN || x==SB_LINEUP))
  {
    InvalidateRect(hDlg, 0, true);
    UpdateWindow(hDlg);
  }
于 2009-09-15T02:27:07.690 に答える
0

コントロールを無効にして、ユーザーがスクロールを完了したときに再描画することはできませんか? これを行う方法を正確に覚えていませんが、以前に同様の問題が発生したことがあり、それが私がそれをどのように処理したかです。

于 2011-03-06T03:05:39.400 に答える
0

これは 2001 年以来の Win32 Usenet FAQ です。Google グループを参照してください: Win32 リストビュー、C コード (MS)

于 2009-09-18T16:37:01.977 に答える
0

プロジェクトを VB6 から MS Vs2005 に変換しましたが、プロジェクトのプロパティ -> アプリケーション設定から [XP ビジュアル スタイルを有効にする] を有効にすると同じ問題が発生します。次に、機能を無効にすると、問題が解決します。

于 2009-10-21T19:10:37.397 に答える