刷新C#中的PictureBox

时间:2011-05-02 04:39:29

标签: c# .net winforms graphic aforge

我创建了一个矩形列表并在PictureBox中绘制它们。在代码的其他地方,我们从列表中删除了一些矩形,但是当我调用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);

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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;
        }

    }


}

此代码发布时不附带任何保证(明示或暗示)。都是你的。做任何你喜欢的事。无论发生什么,这都不是我的问题!

干杯。基思。