Вопрос линий сетки Listview - PullRequest
       29

Вопрос линий сетки Listview

4 голосов
/ 13 сентября 2009

Существует проблема с рисованием линий сетки в виде списка с общими элементами управления 6. Это происходит, когда я пытаюсь прокрутить страницу списка вниз или страницу вверх с помощью мыши.

screenshot
(источник: rsdn.ru ) .

Мне удалось найти это обсуждение http://www.ureader.com/msg/1484143.aspx,, но решения не идеальны

  1. LVS_EX_DOUBLEBUFFER не работает для меня
  2. Отключение плавной прокрутки у меня не работает
  3. Invalidate при прокрутке работает, но мерцание не в порядке
  4. Отключение линий сетки работает, но без них список выглядит не очень хорошо.

Есть ли другие варианты? Спасибо!

Ответы [ 5 ]

2 голосов
/ 14 сентября 2009

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

При этом наблюдается небольшое мерцание, но это гораздо лучше, чем полностью перепутать линии сетки.

1 голос
/ 15 сентября 2009

Я решил создать подкласс просмотра списка и обработать сообщение 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);
  }
0 голосов
/ 06 марта 2011

Не можете ли вы просто сделать недействительным элемент управления и перерисовать его, когда пользователь выполнит прокрутку? Я не помню точно, как это сделать, но у меня раньше была похожая проблема, и вот как я ее обработал.

0 голосов
/ 21 октября 2009

У меня есть проект, преобразованный из VB6 в MS Vs2005, который имеет ту же проблему, когда я включаю «Включить визуальный стиль XP» в свойствах проекта -> Настройки приложения. Затем я отключаю эту функцию, и она решает проблему.

0 голосов
/ 18 сентября 2009

Это FAQ по Win32 Usenet с 2001 года, см. Группы Google: Список просмотра Win32, код C (MS)

...