Announcement

Collapse
No announcement yet.

Visual Basic - Flackern beim Zeichnen im Panel

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Visual Basic - Flackern beim Zeichnen im Panel

    Hallo Entwicklerforum,

    ich arbeite zur Zeit an meiner Bachelorarbeit und muss dort ein Programm weiterentwickeln.
    Mein Problem besteht darin, dass ich mehrere Elemente (ca. 200) in ein Panel schreibe und deren Status (Farbe) sich ändert, wobei es zum flackern kommt.

    Ich habe mich bereits ein bisschen über doubleBuffer informiert und dies scheint mein problem wahrscheinlich zu beheben, da die Elemente zur Zeit einzeln gezeichnet werden, wodurch das Flackern entsteht.
    Jedoch ist die Klasse "protected" und ich kann die Eigenschaft nicht setzen.

    Erklärung:
    'Graf ist der Name des Panels
    'In der Datei Hier.Draw/Flach.Draw sind die Zeichnungen hinterlegt (e.Graphics.DrawLine usw)

    Im MainForm:
    [highlight=vbnet]
    Public Sub Graf_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Graf.Paint

    If Me.m_aktuellerRezepttyp <> Rezepttyp.Fehlgeschlagen Then
    If Me.m_aktuellerRezepttyp = Rezepttyp.Flach Then
    Me.flach.Draw(sender, Me.m_objectlist, e, Me.Graf, Me.contid, zoom, lasttermid)
    Graf.Height = CInt((flach.icount + 120) * zoom)
    If flach.jmaximum > 650 Then
    Me.Graf.Width = flach.jmaximum
    Else
    Me.Graf.Width = CInt(650 * zoom)
    End If
    ElseIf Me.m_aktuellerRezepttyp = Rezepttyp.Hierarchisch Then
    Me.Hier.Draw(sender, Me.m_objectlist, e, Me.Graf, Me.contid, zoom, lasttermid, Position.imaximum, Position.jmaximum)
    Graf.Height = CInt((Position.imaximum + 180) * zoom)
    If Position.jmaximum > 450 Then
    Me.Graf.Width = CInt((Position.jmaximum + 180) * zoom) '
    Else
    Me.Graf.Width = CInt(650 * zoom)
    End If
    End If
    End If

    Graf.Focus()
    End Sub
    [/highlight]

    ich glaube gelesen zu haben, dass man die Eigenschaft über ein Control schreiben muss und (ich glaube) diese werden in meiner PanelForm Datei definiert. Dort habe ich schon das "Me.DoubleBuffered=True" hinzugefügt, nur dies definiert nicht die Eigenschaft von Graf (und von Panel) auf True.


    Im PanelForm:
    [highlight=vbnet]
    Imports System
    Imports System.Windows.Forms
    Imports System.Security.Permissions

    ' setting security permission to full trust avoids getting weird errors like "window.external is null or not an object"
    <PermissionSet(SecurityAction.Demand, Name:="FullTrust")> <System.Runtime.InteropServices.ComVisibleAttribut e(True)> _
    Public Class PanelForm
    Inherits Form

    Private WithEvents m_cont As Cont
    Public ReadOnly Property CONT() As Cont
    Get
    Return m_cont
    End Get
    End Property

    Public graf As New Panel()
    Public panel As New Panel()

    <STAThread()> _
    Public Shared Sub Main()
    Application.EnableVisualStyles()
    Application.Run(New MainForm())
    End Sub

    Private m_mainForm As MainForm
    Public ReadOnly Property MAIN_FORM() As Replayer.MainForm
    Get
    Return m_mainForm
    End Get
    End Property

    Public Sub New(ByRef mainForm As MainForm, ByRef cont As Cont, ByRef graf As Panel)
    Me.InitializeComponent()
    Me.graf = graf
    Me.m_mainForm = mainForm
    Me.DoubleBuffered = True
    Me.m_mainForm.AddPanelForm(Me)
    Me.m_cont = cont

    Me.Text = m_cont.NAME
    panel.AutoScroll = True
    panel.Controls.Add(graf)
    panel.Dock = DockStyle.Fill
    panel.BackColor = Drawing.SystemColors.Window
    Controls.Add(panel)
    End Sub

    Private Sub PanelForm_FormClosing(ByVal sender As Object, ByVal e As EventArgs) Handles Me.FormClosing
    m_mainForm.UnselectTreeView()
    m_mainForm.RemovePanelForm(Me)
    End Sub

    Private Sub PanelForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub
    Public Sub RefreshGraf()
    Me.graf.Refresh()
    End Sub
    Private Sub PanelForm_Activated(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Activated
    m_mainForm.SelectContInTreeView(m_cont)
    End Sub

    End Class
    [/highlight]


    Vielleicht kann mir ja einer von euch Helfen.
    Ich kann bei Bedarf auch noch weiteren Quellcode posten.
    Würde mich über jede Hilfe sehr freuen [eigentlich bin ich sogar Maschinenbauer und kein Programmierer ]

    Grüße,
    HexaDezimalCode

  • #2
    Um im einem Panel auf DoubleBuffered zuzugreifen musst du vom Panel selbst ableiten und in dieser Ableitung das eigene DoubleBuffered setzen. Es hilft nicht die Form abzuleiten und dessen DoubleBuffered zu setzen.

    [HIGHLIGHT=VB.Net]Public Class DoubleBufferPanel
    Inherits Panel

    Public Sub New()
    Me.DoubleBuffered = True
    End Sub
    End Class[/HIGHLIGHT]

    Comment


    • #3
      Vielen Dank.
      Das hat das Problem gelöst.

      Comment


      • #4
        Hallo,

        interessant ist in diesem Zusammenhang auch Flackernde Controls und flackerndes Zeichnen vermeiden.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment

        Working...
        X