OK、まずは 'drawRectangle'クラスから始めましょう。それは、単純なPen
を作成するのに十分なデータを持っていて、Rectangle
を保持していて、それが描画されるControl
への参照も保持しています。
私はToString
オーバーライドを追加したので、私たちはそのすべてのプロパティでそれを表示することができ、我々はそれらの矩形のリストが必要ListBox
...
バージョン1
public class DrawRectangle
{
public Color color { get; set; }
public float width { get; set; }
public Rectangle rect { get; set; }
public Control surface { get; set; }
public DrawRectangle(Rectangle r, Color c, float w, Control ct)
{
color = c;
width = w;
rect = r;
surface = ct;
}
public override string ToString()
{
return rect.ToString() + " (" + color.ToString() +
" - " + width.ToString("0.00") + ") on " + surface.Name;
}
}
次を言います:
public List<DrawRectangle> rectangles = new List<DrawRectangle>();
ここでボタンをクリックするとループに追加されます:
private void buttonAddLoop_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
rectangles.Add(new DrawRectangle(new Rectangle(i * 30, i * 30, 22, 22),
Color.Black, 3.5f, drawPanel1));
drawPanel1.Invalidate();
}
コントロールを無効にする方法については、Invalidating
でペイントしてください。 (あなたはControl
からForm
継承として、同様Form
を使用することができます。)このため
を私たちは四角形の一部をペイントする必要がある各コントロールのPaint
イベントをコーディングする必要が動作するように。多分別のボタンのクリックで、今、私たちは私たちのDrawRectangles
のいずれかを変更することができます
private void drawPanel1_Paint(object sender, PaintEventArgs e)
{
foreach (DrawRectangle dr in rectangles)
{
if (dr.surface == sender)
{
using (Pen pen = new Pen(dr.color, dr.width))
e.Graphics.DrawRectangle(pen, dr.rect);
}
}
}
:私だけPanel drawPanel1
使用
private void buttonChangeButton_Click(object sender, EventArgs e)
{
rectangles[3].color = Color.Red;
rectangles[6].width = 7f;
drawPanel1.Invalidate();
}

更新:
上記クラスは「Rectangle」クラスwをカプセル化する方法を簡単に示し始めました。 ould need;それは完璧なものではなかった!
ここには1つの欠陥があります。の責任を広めるための最良の方法については、実際には十分に気にしません。コントロールに四角形を描くという負担がかかり、より複雑な描画コードとより多くのコントロールがある場合は、それぞれ複雑なコードを学習する必要があります。これは良くない。代わりにの責任は、Rectangleクラスにとどまるべきです。コントロールは自分に描画するように指示するだけです。
ここでは、これを行う更新されたクラスがあります。より複雑な図面として、同様に充填された矩形を描画することができるであろう..:
バージョン2
public class DrawRectangle
{
public Color color { get; set; }
public float width { get; set; }
public Color fillColor { get; set; }
public Rectangle rect { get; set; }
public Control surface { get; set; }
public DrawRectangle(Rectangle r, Color c, float w, Color fill, Control ct )
{
color = c;
width = w;
fillColor = fill;
rect = r;
surface = ct;
}
public DrawRectangle(Rectangle r, Color c, float w, Control ct)
: this. DrawRectangle(r, c, w, Color.Empty, ct) {}
public override string ToString()
{
return rect.ToString() + " (" + color.ToString() +
" - " + width.ToString("0.00") + ")";
}
public void Draw(Graphics g)
{
if (fillColor != Color.Empty)
using (SolidBrush brush = new SolidBrush(fillColor))
g.FillRectangle(brush, rect);
if (color != Color.Empty)
using (Pen pen = new Pen(color, width)) g.DrawRectangle(pen, rect);
}
}
それは充填を決定するために第2の色を使用します。 (塗りつぶしの色は、ToString
メソッドには追加しませんでした)。色を特殊色の値Color.Empty
と比較して、描画する必要があるかどうかを判断します。
新しい矩形を作成するループに、塗りつぶし色が追加されるようになりました。そうでない場合は、古いコンストラクタが呼び出され、塗りつぶしの色がColor.Empty
に設定されます。別に
rectangles[2].fillColor = Color.Fuchsia;

:
A
private void drawPanel1_Paint(object sender, PaintEventArgs e)
{
foreach (DrawRectangle dr in rectangles)
if (dr.surface == sender) dr.Draw(e.Graphics);
}
は、私たちが今書くことができますいくつかの四角形を埋めるために:ここで
はPaint
イベントが取得する方法は簡単です注意 色比較:それは明らかではありませんが、色Color.Empty
は本当にただ「透明な黒」である一方、(0,0,0,0)、色比較は特別です:NamedColors
だけでなくKnownColors
として、常にColor.Empty
を含みます偽と通常の色を比較してください。真の色の比較を行うために1はColor
「正常」にキャストする必要があります:
bool ok=Color.FromArgb(255,255,255,255) == Color.White; // false
bool ok=Color.FromArgb(255,255,255 255) == Color.FromArgb(Color.White.ToArgb()); // true
。したがって
Draw
コードの比較が安全です。
'change_color'を呼び出す前に' draw(x、y、w、h) 'メソッドを呼び出していますか?もしそうでなければそれをやってみてください。 – CarbineCoder
@CarbineCoderはい、最初に私はそれを描画し、変更メソッドを呼び出すとonlt – TheDaJon
その場合、根本的な原因はわかりませんが、私の推測はshape.FillRectangeであり、2度目の呼び出しでは機能しません。 CLASS_NAMEの – CarbineCoder