2012-03-26 19 views
1

Ich möchte einige kleine Bilder in PictureBox (4 x 32px Bilder in einer Zeile) malen, also sollte ich OnPaint-Methode überschreiben oder muss ich meine neue Komponente, die PictureBox erweitert? Ich habe versucht, diese, die in Java gearbeitet, aber nicht hier:PictureBox mit Override OnPaint-Methode in C#

 this.pictureBox1 = new System.Windows.Forms.PictureBox() 
     { 
      protected override void OnPaint(PaintEventArgs e) 
      { 
       // If there is an image and it has a location, 
       // paint it when the Form is repainted. 
       Graphics g = e.Graphics; 

       // Draw a string on the PictureBox. 
       g.DrawString("Test, is that working?", 
       new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30)); 
      } 
     } 

Voll Code von InitializeComponent Methode:

private void InitializeComponent() 
    { 
     System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Tools)); 
     this.pictureBox1 = new System.Windows.Forms.PictureBox() 
     { 
      protected override void OnPaint(PaintEventArgs e) 
      { 
       // If there is an image and it has a location, 
       // paint it when the Form is repainted. 
       Graphics g = e.Graphics; 

       // Draw a string on the PictureBox. 
       g.DrawString("Test, is that working?", 
       new Font("Arial", 10), System.Drawing.Brushes.Blue, new Point(30, 30)); 
      } 
     } 
     this.vscrollb = new System.Windows.Forms.VScrollBar(); 
     this.vScrollBar1 = new System.Windows.Forms.VScrollBar(); 
     ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); 
     this.SuspendLayout(); 
     // 
     // pictureBox1 
     // 
     this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Left; 
     this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image"))); 
     this.pictureBox1.InitialImage = null; 
     this.pictureBox1.Location = new System.Drawing.Point(0, 0); 
     this.pictureBox1.Name = "pictureBox1"; 
     this.pictureBox1.Size = new System.Drawing.Size(264, 262); 
     this.pictureBox1.TabIndex = 0; 
     this.pictureBox1.TabStop = false; 
     this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint); 
     // 
     // vscrollb 
     // 
     this.vscrollb.Location = new System.Drawing.Point(0, 0); 
     this.vscrollb.Name = "vscrollb"; 
     this.vscrollb.Size = new System.Drawing.Size(20, 80); 
     this.vscrollb.TabIndex = 0; 
     // 
     // vScrollBar1 
     // 
     this.vScrollBar1.Dock = System.Windows.Forms.DockStyle.Right; 
     this.vScrollBar1.Location = new System.Drawing.Point(267, 0); 
     this.vScrollBar1.Name = "vScrollBar1"; 
     this.vScrollBar1.Size = new System.Drawing.Size(17, 262); 
     this.vScrollBar1.TabIndex = 1; 
     this.vScrollBar1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.HandleScroll); 
     // 
     // Tools 
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.BackColor = System.Drawing.Color.Black; 
     this.ClientSize = new System.Drawing.Size(284, 262); 
     this.Controls.Add(this.vScrollBar1); 
     this.Controls.Add(this.pictureBox1); 
     this.Name = "Tools"; 
     this.Text = "Tools"; 
     ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); 
     this.ResumeLayout(false); 

    } 
+0

Dieser Code funktioniert gut, was ist das Problem? – ionden

+0

Ich habe dies der InitializeComponent-Methode hinzugefügt. Dies ist der vollständige Code: –

+8

@ PiotrŁużecki: Fügen Sie der InitializeComponent nichts hinzu, da diese Methode vom Designer bei jeder Änderung überschrieben wird. Sie können es hinzufügen, nachdem "InitializeComponent" im Konstruktor aufgerufen wurde. – ChrFin

Antwort

3

Dies ist nur nicht gültig C# -Code. Das Überschreiben einer virtuellen Methode wie OnPaint() ist in Ordnung, aber Sie können dies nur in einer Klasse tun, die von PictureBox abgeleitet ist. Nach der Kompilierung wird das neue Steuerelement automatisch zur Toolbox hinzugefügt, damit Sie es in ein Formular einfügen können.

Dies ist jedoch nicht notwendig. Sie können das Paint-Ereignis für das Steuerelement einfach implementieren. Das hast du bereits getan, du hast es imageBox1_Paint() genannt. Bewegen Sie einfach Ihren Code dorthin.

Andere wichtige Zeiger: Editiere niemals InitializeComponent(). Es wird automatisch vom Designer erstellt. Sobald Sie das Design des Formulars ändern, verlieren Sie den Code, den Sie dort geschrieben haben. Es ist auch ein wirklich guter Weg, um das Formular nicht-entwerfbar zu machen, was eine Ausnahme auslöst, wenn das Formular vom Designer geladen wird. Und wenn Sie OnPaint() überschreiben, ist es wichtig, dass Sie base.OnPaint() aufrufen. Damit funktioniert die normale PictureBox-Installation weiter. Einschließlich Malen des Bildes und Erhöhen des Paint-Ereignisses. Achten Sie darauf, zumindest ein Tutorial zu folgen oder ein Buch über WinForms-Programmierung zu lesen. Es wird viel Test und meistens Fehler geben, wenn Sie das nicht tun.

2

Ich würde vorschlagen, es von PictureBox und fügen Sie Ihre Logik erben. Sie müssen also keine Logik zu einem Ort hinzufügen, an den sie nicht gehört (übergeordnete Kontrolle).

public class SpecialPictureBox : PictureBox 
{ 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     // if you want to execute the original PaintBox logic before you execute your own code, use the next line of code. 
     base.OnPaint(e); 

     // now do whatever you want 

    } 
} 

Sie können dann die SpecialPictureBox verwenden, wo immer Sie wollen.

Edit: hinzugefügt base.OnPaint Beispiel zu kodieren

+0

Also kann ich das nicht tun, ohne neue Klasse zu machen? Muss ich einige Ereignisse wie OnPaint oder etwas anderes anrufen? Kann ich das zur Toolbox hinzufügen? –

+0

Sie könnten es tun, ohne eine neue Klasse zu erstellen, aber ich würde es nicht empfehlen, da es ein typischer OOP-Principal ist, der vererbt wird, um spezielle Funktionalitäten hinzuzufügen. Das Verhalten Ihrer neuen Klasse ist genau dasselbe wie zuvor, außer der neuen Implementierung der OnPaint-Methode. Nachdem Sie Ihr Projekt kompiliert haben, wird das neue Steuerelement in der Toolbox verfügbar sein. – MatthiasG

+0

Noch eine Sache: Wenn Sie die OnPaint-Methode überschreiben, wird die PictureBox kein Bild wie zuvor zeichnen, weil Sie die Logik übersteuert haben. Wenn Sie möchten, dass die Pb ihre eigene Logik ausführt, bevor Sie Ihre hinzufügen, müssen Sie base.OnPaint (e) als ersten Aufruf in Ihrer überschriebenen Methode ausführen. – MatthiasG