在C#中刷新PictureBox

| 我创建了一个矩形列表,并将其绘制为“ 0”。在代码的其他地方,我们从列表中删除了一些矩形,但是当我调用
PictureBox.Refresh()
时,它显示了先前的结果:所有矩形。 我尝试创建图片的副本,然后一个一个地重新绘制所有矩形,但是它有相同的问题。 请给我一些关于如何绘制当前矩形列表的想法。
Rectangle r = lanes[i];//lanes is list of rectangles
Pen pen = new Pen(Color.Red, 2);
Graphics g = pictureBox1.CreateGraphics();
g.DrawRectangle(pen, r);
    
已邀请:
您没有提供足够的信息,我也不知道“没有正确的信息”是什么意思。 您上面绘制矩形的代码应放在控件的Paint事件处理程序中。当您希望图片框重新绘制时,请调用Invalidate方法(您可能还需要调用Update方法)。     
出于兴趣,我或多或少按照我认为应该做的来进行了实施。 这是我的代码。
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;
        }

    }


}
此代码没有任何担保(明确或暗示)。都是你的。做任何你喜欢的事。无论发生什么,这都不是我的问题! 干杯。基思     

要回复问题请先登录注册