Announcement

Collapse
No announcement yet.

Langsames Zeichnen in UserControl mit mehreren Panels

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

  • Langsames Zeichnen in UserControl mit mehreren Panels

    Hallo zusammen,

    bei der Erstellung eines UserControls das mehrere Panels beinhaltet bin ich auf folgendes Problem gestoßen: Liege z.B drei Panels im UserControl die höher sind als die sichtbare Größe des Controls muss ein Scroller her um den unteren Teil sichtbar machen zu können.

    Der Inhalt der einzelnen Panels wird von denen selbst gezeichnet (beim Paint-Event). Leider sieht das Neuzeichnen unmöglich aus, da immer zuerst das 1. Panel gezeichnet wird, dann das zweite usw. Wird der Scrollbalken inzwischen weiterbewegt, fängt das 1. Panel wieder an sich zu zeichnen. Das führt dazu, dass bei kontinuierlicher Bewegung des Scrollers das 1. Panel halbwegs flüssig läuft, das 2. recht ruckelig und das 3. eigentlich stehen bleibt bis der Benutzer aufhört zu scrollen und genug zeit vorhanden ist alles Panels komplett zu zeichnen.

    Hoffentlich kennt jemand eine Lösung zu diesem Problem. Das Zeichnen an sich sollte nicht sehr zeitaufwendig sein - es wird eine fertige Bitmap per DrawImageUnscaled() eingeblendet.

    Vielen Dank für alle Antworten!

  • #2
    Hallo ozerfrettelter,


    ich kann Dein Problem nicht wirklich nachvollziehen.
    Ich habe das von Dir beschriebene Programm nachgestellt und konnte den von Dir beschriebenen Effekt nicht feststellen. Als Beispiel habe ich ein UserControl mit 100 Panels erstellt. Die Panels zeichnen mit dem Paint-Ereignis ein Bild und einen Text. Aufgrund der großen Panel-Anzahl muß man zwangsläufig scrollen. Es läuft absolut flüssig, lediglich bei zu schnellem Verschieben verwischen die Bilder. Sobald man jedoch wieder langsamer wird, sind die Panels fast ohne Flackern zu sehen. Nachfolgend der Programmcode:

    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;
    
    namespace UserControlPanels
    {
        public partial class UserControl1 : UserControl
        {
            Bitmap Bild = new Bitmap("testbild.jpg");
    
            public UserControl1()
            {
                InitializeComponent();
    
                Panel MyPanel = null;
    
                this.SuspendLayout();
                for (int i = 0; i < 100; i++)
                {
                    MyPanel = new Panel();
                    MyPanel.Name = "Panel" + i;
                    MyPanel.Location = new Point(5, i*100+5);
                    MyPanel.Size = new Size(500, 90);
                    MyPanel.TabIndex = 0;
                    MyPanel.Paint += new PaintEventHandler(panel_Paint);
                    this.Controls.Add(MyPanel);
                }
                this.ResumeLayout(true);
            }
    
            private void panel_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.DrawImage(Bild,0,0);
                e.Graphics.DrawString((sender as Panel).Name, new Font("Arial", 20), new SolidBrush(Color.Black), new PointF(20, 20));
            }
    
            #region Vom Komponenten-Designer generierter Code
    
            private void InitializeComponent()
            {
                this.SuspendLayout();
                // 
                // UserControl1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.Name = "UserControl1";
                this.Size = new System.Drawing.Size(423, 489);
                this.ResumeLayout(false);
    
            }
    
            #endregion
    
        }
    }
    Erstellt mit Visual Studio 2005 für .NET Framework 2.0.


    Mit freundlichen Grüßen,


    rednax

    Comment


    • #3
      Hallo rednex,

      vielen Dank für Deine Antwort! Sie hat mich sogar auf das Problem gestoßen: Ich hatte beim Scroll-Event für jedes Panel, das seinen Inhalt anpassen muss ein Invalidate() aufgerufen... Wenn ich das nicht mache sondern nur ein Refresh() am Ende des Events sieht das Ganze wieder gut aus.

      Vielen Dank für Deinen Code!

      Comment


      • #4
        Hab' ich auch noch deinen Namen falsch geschrieben - Sorry rednax!

        Comment

        Working...
        X