1

長方形のリストを作成し、PictureBox. コードの他の場所では、リストからいくつかの四角形を削除していますが、それを呼び出すPictureBox.Refresh()と、前の結果、つまりすべての四角形が表示されます。

写真のクローンを作成し、すべての長方形を 1 つずつ再描画しようとしましたが、同じ問題があります。

現在の長方形リストをペイントする方法について、いくつかのアイデアを教えてください。

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

2 に答える 2

1

あなたは十分な情報を提供しておらず、「正しい情報が得られない」という意味がわかりません。

四角形を描画する上記のコードは、コントロールの Paint イベント ハンドラーに入れる必要があります。ピクチャ ボックスを再描画する場合は、Invalidate メソッドを呼び出します (Update メソッドも呼び出す必要がある場合があります)。

于 2011-05-02T04:44:56.190 に答える
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;
        }

    }


}

このコードは、(明示的または黙示的な) 保証なしで公開されています。それはすべてあなたのものです。好きなことをしてください。何が起こっても、それは私の問題ではありません!

乾杯。キース。

于 2011-05-02T06:16:53.863 に答える