我创建了一个矩形列表并在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);
答案 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;
}
}
}
此代码发布时不附带任何保证(明示或暗示)。都是你的。做任何你喜欢的事。无论发生什么,这都不是我的问题!
干杯。基思。