Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Как почистить CreateGraphics изображение


Автор: krewin 27.8.2009, 12:39
  Panel2.CreateGraphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        Dim nn As Image = Image.FromFile(CurDir() & "\img\1.jpeg")
        Panel2.CreateGraphics.DrawImage(nn, 230, 500)

Вот простой код  рисует изображение на панели которая имеет фоновый рисунок. Всю очень просто.

Проблема втом как теперь удалить этот русунок на фоне  ????????????

Я пробывал просто обновит фоновый рисунок , он очищает изображение но смотреть на это обновление просто не приято оно мигает !
Сужествуют другие способы чтобы не трогать фоновый рисунок ?



Автор: diadiavova 27.8.2009, 18:06
Для того чтобы прорисовать что-то в панели надо делать это в обработчике её события Paint, а объект Graphics получать из второго аргумента обработчика, а не создавать новый по всякому поводу и без.
Код

    Private Sub Panel1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
        Dim nn As Image = Image.FromFile(CurDir() & "\img\1.jpeg")
        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        e.Graphics.DrawImage(nn, 230, 500)
    End Sub

Если надо иметь возможность менять рисунок, то тогда его надо передавать в обработчик при помощи свойства какого-нибудь, например так
Код

    Dim _panelBG As Image
    Public Overridable Property PanelBG() As System.Drawing.Image
        Get
            Return _panelBG
        End Get
        Set(ByVal value As System.Drawing.Image)
            _panelBG = value
            Panel1.Invalidate()
        End Set
    End Property
    Private Sub Panel1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint

        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
        e.Graphics.DrawImage(PanelBG, 230, 500)
    End Sub

Для очистки надо свойству передать Nothing, Если точку прорисовки тоже надо менять, то для неё тоже свойствоо создай(по той же схеме).

Автор: percilacus 16.9.2009, 20:45
Чтоб не мерцало у контролов есть Protected свойство DoubleBuffered. Его надо установить в true. И рисовать в обработчике Paint этого контроля, используя при этом e.Graphics.
Ну а чтобы получить доступ к DoubleBuffered, нужно создать свой класс и унаследовать Panel
Очистить:
nn.Dispose()
Panel2.Invalidate()

Автор: diadiavova 16.9.2009, 20:52
А двойная буферизация для прорисовки фонового изображения это не слишком? smile 

Автор: percilacus 17.9.2009, 17:31
diadiavova, он же говорит мерцает значит часто перерисовывает

Автор: diadiavova 17.9.2009, 17:33
Цитата(percilacus @  17.9.2009,  18:31 Найти цитируемый пост)
diadiavova, он же говорит мерцает значит часто перерисовывает 

Это иногда случается из-за того, что код кривой. В таких ситуациях двойная буферизация не помогает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)