代码之家  ›  专栏  ›  技术社区  ›  Fedor

ListView网格线问题

  •  4
  • Fedor  · 技术社区  · 15 年前

    使用常用控件6在ListView中绘制网格线时出现问题。当我试图向下滚动列表页或用鼠标向上翻页时,就会发生这种情况。

    screenshot http://files.rsdn.ru/11470/screen1.png .

    我只能找到这个讨论 http://www.ureader.com/msg/1484143.aspx 但解决方案并不完美

    1. lvs ou ex ou doublebuffer不适合我
    2. 禁用平滑滚动对我不起作用
    3. 滚动时失效有效,但闪烁不好
    4. 禁用网格线确实有效,但是没有网格线列表看起来不好。

    还有其他选择吗? 谢谢!

    5 回复  |  直到 14 年前
        1
  •  2
  •   Grammarian    15 年前

    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();
        }
    }
    

    有一个轻微的闪烁与此,但它比有网格线完全混乱要好得多。

        2
  •  1
  •   Fedor    15 年前

    我选择将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);
      }
    
        3
  •  0
  •   noel    15 年前

    这是自2001年以来的一个win32 usenet常见问题解答,请参阅google groups:win32 listview,c code(ms)

        4
  •  0
  •   Yan    15 年前

    我有一个从vb6转换为ms vs2005的项目,当我从“项目属性”->应用程序设置中启用“启用xp视觉样式”时,它也有同样的问题。 然后我禁用了这个特性,它解决了这个问题。

        5
  •  0
  •   Shaun    14 年前

    你不能让控件失效,让它在用户完成滚动后重新绘制吗?我不记得该怎么做,但我以前也遇到过类似的问题,我就是这样处理的。

    推荐文章