Member 11856456 Ответов: 2

Могу ли я заменить WM_PAINT на paint eventergs или что-то другое?


Я близок к тому, чтобы встроенный элемент управления, чтобы мой элемент управления ListView. Прямо сейчас единственным препятствием является использование 64-кратного решения для рисования.

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


 Private Const WM_PAINT As Integer = &HF
Protected Overloads Overrides Sub WndProc(ByRef m As Message)
            Select Case m.Msg
                Case WM_PAINT
                    Dim rc As Rectangle
                    For Each ec As EmbeddedControl In _embeddedControls
                        rc = Me.GetSubItemBounds(ec.Item, ec.Column)
                        ec.Control.Bounds = rc
                    Next
                    Exit Select
            End Select
            MyBase.WndProc(m)
        End Sub


Я уже думал об использовании:

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
           Select Case e.Graphics
               Case
           Dim rc As Rectangle
                   For Each ec As EmbeddedControl In _embeddedControls
                       rc = Me.GetSubItemBounds(ec.Item, ec.Column)
                       ec.Control.Bounds = rc
                   Next
                End Select


           MyBase.OnPaint(e)
       End Sub


Проблема, с которой я сталкиваюсь, заключается в том, что я не понимаю, что такое WM_PAINT, кроме того, что он использует 32-битную систему, а не 64-битную, в которую встроена моя программа.

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

Я построил событие paint, однако я не уверен, что нужно сделать так, чтобы оно ссылалось на него.

2 Ответов

Рейтинг:
2

Christian Graus

WM_PAINT-это сообщение, которое говорит windows нарисовать ваш элемент управления. А VB.NET контроль не должен иметь для него никакого реального применения. Я не вижу причин, по которым он не срабатывает в 64-битной среде, ваши элементы управления рисуются.

Контроль.Событие Paint (System.Окна.Формы)[^]

Это.Чистый эквивалент, который, я думаю, совпадает с тем, что вы сказали. Просто используй его .Чистая версия, Если вам не нужно взаимодействие.


Member 11856456

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

Защищенные суб переопределения метода onpaint(как byval E как объект painteventargs)
Тусклая черная ручка как новая ручка(цвет.Черный, 3)

Выберите вариант e.графика
Случай
Тусклый rc как прямоугольник
Для каждого ec как EmbeddedControl в _embeddedControls
РЦ = меня.GetSubItemBounds(ЕК.Элемент, ЭУ.Колонки)
ЭК.контроль.Границы = rc
Следующий
e.графика.Объекта drawrectangle(blackPen, РК.Х, РК.Г, РК.Ширина, РК.Высота)
Конец Выбрать


- Нарисуйте прямоугольник на экране.


Моя база.OnPaint(e)
Конец Подводной Лодки

Это должно hoepfully заменить старый метод для 32-битной системы. есть предложения?

Richard Deeming

Вам ничего не нужно в части "дело"; вам просто нужно удалить Select Case из этого кода.

Вы, вероятно, также захотите переместить DrawRectangle звонок внутри петли.

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
    Dim rc As Rectangle
    Dim blackPen As New Pen(Color.Black, 3)
    
    For Each ec As EmbeddedControl In _embeddedControls
        rc = Me.GetSubItemBounds(ec.Item, ec.Column)
        ec.Control.Bounds = rc
        
        e.Graphics.DrawRectangle(blackPen, rc.X, rc.Y, rc.Width, rc.Height)
    Next
    
    MyBase.OnPaint(e)
End Sub

Member 11856456

это не встраивание элемента управления, как это делал WM_PAINT. Это должно было сработать как эквивалент.

Рейтинг:
12

Member 11856456

После долгих часов поисков я наконец понял, что обычный paint eventargs-это не то, что мне нужно. По - видимому, мне нужны были защищенные переопределения с использованием события рисования подэлемента.

Protected Overrides Sub OnDrawSubItem(ByVal e As System.Windows.Forms.DrawListViewSubItemEventArgs)

      Dim rc As Rectangle
      For Each ec As EmbeddedControl In _embeddedControls
          rc = Me.GetSubItemBounds(ec.Item, ec.Column)
          ec.Control.Bounds = rc
      Next

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

      MyBase.OnDrawSubItem(e)

  End Sub


Это все еще не решило мою проблему с процессором, однако ссылка на 32-битную dll удалена, а событие WM_paint теперь заменено.