Как очистить только рисование строк без перерисовки фонового изображения? - PullRequest
0 голосов
/ 25 октября 2019

Я рисовал все (изображение и все строки), но когда я рисую изображение, оно загружает мой процессор, и мигает изображение, две вещи, которые мне не нужны ...

Чтобы решить эту проблему, я попытался это сделать:

  1. Установите основное изображение как фоновое изображение, затем нарисуйте поверх него, но при попытке «Очистить (color.transparent)», он становится черными вы должны нарисовать его снова
  2. Добавить еще один блок изображения поверх основного блока изображений, но когда вы сделаете это, переднее изображение скроет все (как показано на рисунке 2)

Примечание: Фоновое изображение является статичным и никогда не изменится, единственное, что изменится, это шнурок ...

Static background image

Drawstring's

Overlap problem

1 Ответ

0 голосов
/ 26 октября 2019

Пожалуйста, рассмотрите следующий фрагмент кода, который может помочь вам решить проблему.

Private ReadOnly backImage As Bitmap = 'The path of your background image.

Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    Dim srcRect As New Rectangle(0, 0, backImage.Width, backImage.Height)
    Dim desRect As Rectangle = PictureBox1.ClientRectangle

    Using bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
        Using G As Graphics = Graphics.FromImage(bmp)
            G.SmoothingMode = SmoothingMode.HighQuality
            G.Clear(Color.Transparent)
            G.DrawImage(backImage, desRect, srcRect, GraphicsUnit.Pixel)
            G.DrawString("0.00", New Font("Arial", 12, FontStyle.Regular), Brushes.Red, desRect.Right - 80, 35)
            'and the other overlay painting ....
        End Using

        e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic
        e.Graphics.DrawImageUnscaled(bmp, 0, 0)
    End Using
End Sub

Также, чтобы уменьшить мерцание / мерцание, создайте новый класс из элемента управления PictureBox и установите стили следующим образом:

Public Class DBPictureBox
    Inherits PictureBox

    Sub New()
        SetStyle(ControlStyles.AllPaintingInWmPaint Or
                 ControlStyles.OptimizedDoubleBuffer Or
                 ControlStyles.ResizeRedraw Or
                 ControlStyles.UserPaint, True)
        UpdateStyles()
    End Sub

    'Comment or remove the MyBase....
    Protected Overrides Sub OnPaintBackground(pevent As PaintEventArgs)
        'MyBase.OnPaintBackground(pevent)
    End Sub

End Class

И используйте его вместо стандартного PictureBox.


Редактируйте

Я неНе знаю, как вы обновляете свою процедуру рисования, и не влияет ли остальная часть вашего кода на рисование. Я думаю, что упомянутый фрагмент кода более чем достаточно. Вот быстрое демо, которое делает недействительными (НЕ обновлять) картину каждые 100 миллисекунд:

enter image description here

Видите ли вы мерцание? и вот чтение из моего диспетчера задач во время демонстрации:

enter image description here

Почти ничего.

Я предлагаю следующее:

  • Если вы сделали недействительным рисование с помощью событий TextChanged и / или ValueChanged элементов управления вводом, убедитесь, что ваши элементы управления не находятся вбесконечный цикл избыточности. Каждое событие вызывает другое событие снова и снова. Если нет, то:

  • Попробуйте ваше приложение на другом компьютере, чтобы убедиться, что у вашего основного нет проблем с оборудованием. Может быть, пришло время для новой настройки:).

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...