2011-05-02 34 views
1

我创建了一个矩形列表并在PictureBox中绘制它们。在代码的其他地方,我们从列表中删除了一些矩形,但当我调用PictureBox.Refresh()时,它会显示以前的结果:所有的矩形。刷新C中的图片框#

我试图创建一个图片的克隆,并重新绘制所有的矩形逐一,但它有同样的问题。

请问,你能给我一些关于如何绘制当前矩形列表的想法。

Rectangle r = lanes[i];//lanes is list of rectangles 
Pen pen = new Pen(Color.Red, 2); 
Graphics g = pictureBox1.CreateGraphics(); 
g.DrawRectangle(pen, r); 
+0

kalhari,我们需要查看更多的代码才能准确诊断问题。如果你仍然陷于困境,考虑准备一个[SSCCE](http://sscce.org/)。话虽如此,但我们已经被告知,我怀疑乔纳森伍德是正确的,你可能只需要“无效”控制......“底层”,这要求.NET的GUI处理程序“请刷新是屏幕的区域“。明确? – corlettk 2011-05-02 04:56:15

回答

1

您没有提供足够的信息,我不知道是什么“它没有给出正确的”手段。

上面绘制矩形的代码应该放在控件的Paint事件处理函数中。并且,当您想要重新绘制图片框时,请调用Invalidate方法(您可能还需要调用Update方法)。

1

出于兴趣,我实现了这个目标,或多或少,因为我认为它应该完成。

这是我的代码。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public class Form1 : Form 
    { 
     private static List<Rectangle> rectangles = new List<Rectangle> { 
      //   x,y,w,h 
      new Rectangle(0,0,10,10), 
      new Rectangle(10,10,10,10), 
      new Rectangle(10,40,10,10), 
      new Rectangle(60,20,10,10), 
      new Rectangle(90,10,10,10), 
     }; 
     private Label label1; 

     private RectanglePictureBox rectPicBox1; 

     public Form1() { 
      InitializeComponent(); 
      this.rectPicBox1.Rectangles = rectangles; 
     } 

     private void rectPicBox1_Click(object sender, EventArgs e) { 
      if (rectangles.Count <= 0) { 
       Console.Beep(); // nothing left to remove! 
      } else { 
       rectangles.RemoveAt(rectangles.Count - 1); 
       rectPicBox1.Rectangles = rectangles; 
      } 
     } 

     #region InitializeComponent (Modified Manually) 

     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     private void InitializeComponent() { 
      this.rectPicBox1 = new WindowsFormsApplication1.RectanglePictureBox(); 
      this.label1 = new System.Windows.Forms.Label(); 
      ((System.ComponentModel.ISupportInitialize)(this.rectPicBox1)).BeginInit(); 
      this.SuspendLayout(); 
      // 
      // rectPicBox1 
      // 
      this.rectPicBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
         | System.Windows.Forms.AnchorStyles.Left) 
         | System.Windows.Forms.AnchorStyles.Right))); 
      this.rectPicBox1.BackColor = System.Drawing.SystemColors.ControlLightLight; 
      this.rectPicBox1.Location = new System.Drawing.Point(1, 1); 
      this.rectPicBox1.Name = "rectPicBox1"; 
      this.rectPicBox1.Size = new System.Drawing.Size(257, 131); 
      this.rectPicBox1.TabIndex = 0; 
      this.rectPicBox1.TabStop = false; 
      this.rectPicBox1.Click += new System.EventHandler(this.rectPicBox1_Click); 
      // 
      // label1 
      // 
      this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
         | System.Windows.Forms.AnchorStyles.Right))); 
      this.label1.AutoSize = true; 
      this.label1.Location = new System.Drawing.Point(2, 138); 
      this.label1.Name = "label1"; 
      this.label1.Size = new System.Drawing.Size(254, 13); 
      this.label1.TabIndex = 1; 
      this.label1.Text = "Clicking on the picture to removes the last rectangle."; 
      // 
      // Form1 
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
      this.ClientSize = new System.Drawing.Size(259, 156); 
      this.Controls.Add(this.label1); 
      this.Controls.Add(this.rectPicBox1); 
      this.Name = "Form1"; 
      this.Text = "Rectangles"; 
      ((System.ComponentModel.ISupportInitialize)(this.rectPicBox1)).EndInit(); 
      this.ResumeLayout(false); 
      this.PerformLayout(); 

     } 

     #endregion 

     #region Component Model 

     private System.ComponentModel.IContainer components = null; 

     protected override void Dispose(bool disposing) { 
      if (disposing && (components != null)) { 
       components.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

     #endregion 


    } 

    //////////////////////////////////////////////////////////////////////////// 

    class RectanglePictureBox : PictureBox 
    { 
     public static Color[] _colors = { 
      Color.Red, Color.Green, Color.Blue, Color.Orange 
     }; 

     public List<Rectangle> Rectangles { 
      set { Image = ImageOf(value); } 
     } 

     private Bitmap ImageOf(List<Rectangle> rectangles) { 
      Bitmap result = new Bitmap(Size.Height, Size.Width); 
      Graphics graphics = Graphics.FromImage(result); 
      for (int i = 0; i < rectangles.Count; ++i) { 
       Brush brush = new SolidBrush(_colors[i % _colors.Length]); 
       graphics.FillRectangle(brush, rectangles[i]); 
      } 
      return result; 
     } 

    } 


} 

此代码发布时没有任何担保(明示或暗示)。全是你的。做任何你喜欢的事情。无论发生什么,它都不是我的问题!

干杯。基思。

+0

你真的明白我的问题。这是我想要的解决方案。谢谢 – 2011-08-06 08:24:42