Fedor
Fedor

Reputation: 43412

Listview gridlines issue

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
(source: rsdn.ru) .

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!

Upvotes: 4

Views: 2949

Answers (5)

Shaun
Shaun

Reputation: 5531

Cant you just invalidate the control and have it redraw when it the user is done scrolling? I dont remember exactly how to do this, but I have had a similar problem before, and thats how I handled it.

Upvotes: 0

Yan
Yan

Reputation: 1

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.

Upvotes: 0

noel
noel

Reputation:

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

Upvotes: 0

Fedor
Fedor

Reputation: 43412

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

Upvotes: 1

Grammarian
Grammarian

Reputation: 6882

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.

Upvotes: 2

Related Questions