Member 11856456 Ответов: 1

Как рисовать столбцы и строки listview из formload?


на данный момент я могу сделать это из отдельного события,

вот код, который я использую:

Private Sub ListView1_DrawSubItem(sender As Object, e As System.Windows.Forms.DrawListViewSubItemEventArgs) Handles ListView1.DrawSubItem
       With e.Graphics
           .DrawLines(New Pen(SystemColors.ButtonShadow), New Point() {New Point(e.Bounds.Left, e.Bounds.Top - 1), New Point(e.Bounds.Left + e.Bounds.Width, e.Bounds.Top - 1), New Point(e.Bounds.Left + e.Bounds.Width, e.Bounds.Top + e.Bounds.Height), New Point(e.Bounds.Left, e.Bounds.Top + e.Bounds.Height)})

       End With

       e.DrawText()

   End Sub


Причина, по которой я пытаюсь перенести это на событие form_load, заключается в том, что каждый раз, когда я вызываю свое событие listview1.click, listview продолжает мигать. Однако я считаю, что это может прекратиться, если это было нарисовано в listview постоянно, а не быть его собственным событием, которое рисуется каждый раз.

Что я уже пробовал:

Я попробовал использовать creategraphics

вот код, который я попробовал:

With CreateGraphics()
          .DrawLines(New Pen(SystemColors.ButtonShadow), New Point() {New Point(ListView1.Bounds.Left, ListView1.Bounds.Top - 1), New Point(ListView1.Bounds.Left + ListView1.Bounds.Width, ListView1.Bounds.Top - 1), New Point(ListView1.Bounds.Left + ListView1.Bounds.Width, ListView1.Bounds.Top + ListView1.Bounds.Height), New Point(ListView1.Bounds.Left, ListView1.Bounds.Top + ListView1.Bounds.Height)})
      End With


но это не сработало.

Richard Deeming

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

Вероятно, вам нужно включить двойную буферизацию:
Как уменьшить мерцание графики с помощью двойной буферизации для форм и элементов управления[^]

Member 11856456

Это похоже на то, что это решило бы мою проблему, единственная проблема заключается в том, что он показывает, как это сделать в C#, а не vb.net-да. Как бы я устроил это для a vb.net заявление?

Richard Deeming

Эти два блока кода достаточно просты для перевода:

DoubleBuffered = True
и:
SetStyle(ControlStyles.OptimizedDoubleBuffer, True)

Member 11856456

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

Member 11856456

Ричард, я не смог заставить двойной буфер работать, однако я нашел код, который перестает мерцать. Поскольку вы были в этом уже некоторое время, и это короткий код, не могли бы вы объяснить, почему он перестает мерцать?

1 Ответов

Рейтинг:
7

Member 11856456

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

Protected Overloads Overrides ReadOnly Property CreateParams() As CreateParams 'stop flicker code part 1 of 2
      Get
          Dim cp As CreateParams = MyBase.CreateParams
          cp.ExStyle = cp.ExStyle Or 33554432
          Return cp
      End Get
  End Property
  Private Sub PreVentFlicker() 'stop flicker code part 2 of 2
      With Me
          .SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
          .SetStyle(ControlStyles.UserPaint, True)
          .SetStyle(ControlStyles.AllPaintingInWmPaint, True)
          .UpdateStyles()
      End With
  End Sub


http://www.dreamincode.net/forums/topic/294248-flicker-problem-on-form-loading/


Richard Deeming

В CreateParams метод, 33554432 является WS_CLIPCHILDREN:
Стили Окон (Windows)[^]

Другой код включает флаг "двойной буферизации"; устанавливает форму для рисования самой себя, вместо того чтобы полагаться на ОС; и говорит форме игнорировать WM_ERASEBKGND сообщение для уменьшения мерцания.
Перечисление ControlStyles[^]

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

Member 11856456

Большое спасибо. Я еще не настолько продвинулся в программировании. Однако с тех пор, как я побывал на этом сайте, я узнал очень много нового. Еще раз спасибо за помощь в понимании предоставленного кода.