views:

574

answers:

4

There's a problem with drawing gridlines in listview with common controls 6. It happens when I try to scroll the list page down or page up with mouse.

screenshot.

I was only able to find this discussion http://www.ureader.com/msg/1484143.aspx, but the solutions are not perfect

  1. LVS_EX_DOUBLEBUFFER doesn't work for me
  2. Disabling smooth scrolling doesn't work for me
  3. Invalidate on scroll does work but the flicker is not fine
  4. Disabling grid lines does work but the list doesn't look fine without them.

Are there any other options? Thanks!

+1  A: 

ObjectListView -- a open source wrapper around a plain .NET WinForms ListView -- fixes this problem (and lots of others too).

If you want to fix it in your own code, you need to listen for reflected notification of LVN_ENDSCROLL. In the handler for the end scroll, do something like this:

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

There is a slight flicker with this, but it's much better than having the grid lines completely messed up.

Grammarian
+1  A: 

I chose to subclass listview and process WM_VSCROLL message:

  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);
  }
Fedor
The advantage of using LVN_ENDSCROLL is that it is sent whenever the listview scrolls (well, mostly). WM_VSCROLL is only sent when the scrollbar is manipulated. Using the mouse wheel to scroll will send LVN_ENDSCROLL, but not WM_VSCROLL. BUT this problem only happens when the mouse is clicked, so using the WM_VSCROLL message works fine too.
Grammarian
A: 

It's a Win32 Usenet FAQ since 2001, see Google Groups : Win32 Listview , C code (MS)

A: 

I have a project converted from VB6 to MS Vs2005, which has the same issue when I enable the "Enable XP visual style" from project properties -> Application setting. Then I disable the feature, and it fix the problem.

Yan
That's right but disabling XP visual styles is not usually an option.
Fedor