User 13204940 Ответов: 1

Простая графика вызывающая режим перерыва


Привет,

SetStyle и e.Graphics в моем переопределении onPaint просто не будут работать вместе и отправляют мое приложение в неоднозначный режим прерывания.

Вот код.:

Public Class CustomProgressbar
    Inherits Control

    Private loaded As Boolean = False

    Public Sub New()
        SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.DoubleBuffer, True)
    End Sub

    Public Sub init()
        loaded = True
    End Sub

    Protected Overrides Sub OnPaint(e As PaintEventArgs)
        If Not loaded Then Return

        Using g As Graphics = e.Graphics
            '    g.FillRectangle(New LinearGradientBrush(New Rectangle(0, 0, Width + 1, Height + 1), GraphicsUtils._c(178, 178, 178), GraphicsUtils._c(140, 140, 140), 90), New Rectangle(0, 0, Width + 1, Height + 1))
            '    g.FillRectangle(New LinearGradientBrush(New Rectangle(1, 1, Width - 2, Height - 2), GraphicsUtils._c(242, 242, 242), GraphicsUtils._c(226, 226, 226), 90), New Rectangle(1, 1, Width - 2, Height - 2))

            '    If Not _v = 0 Then
            '        Dim c As Color = GraphicsUtils._c(150, 0, 255)
            '        Dim h As HslColor = HslColor.fromColor(c)

            '        g.FillRectangle(New LinearGradientBrush(New Rectangle(2, 2, _v, Height - 5), (h - New HslColor(0, 0, 0.037)).toColor(), (h - New HslColor(0, 0, 0.206)).toColor(), 90), New Rectangle(2, 2, _v, Height - 5))
            '        g.DrawLine(GraphicsUtils._p((h - New HslColor(0, 0, 0.02)).toColor()), 2, Height - 3, _v + 1, Height - 3)
            '    End If
        End Using
    End Sub


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

Если я удалю оператор Using, он будет работать нормально. Если я удалю оператор SetStyle, он тоже будет работать нормально. Я пробовал изменить время вызова init() на событие загрузки формы, на нажатие кнопки, но ничего не работает.

1 Ответов

Рейтинг:
5

Peter Vegter

Вы получаете графику (например, графику) из системы, но вы избавляетесь от нее с помощью "Using" ("Using" избавляет от используемого объекта). Итак, не используйте слово "использование", но, например,:

Dim g As Graphics = e.Graphics


[no name]

Отлично, есть идеи, почему это работает нормально, но не с SetStyle?

Peter Vegter

Вы никогда не должны избавляться от объектов, которые вы не создали, но это не всегда идет не так (сразу), как вы заметили.
В этом случае он идет неправильно из-за использования набора опций 'DoubleBuffer' (SetStyle).
Он пытается нарисовать элемент управления из "двойного буфера", используя графику, которую вы утилизировали.

Спасибо за ваш ответ и голосование, Питер