私はこれを解決するために管理しています、私は答えとしてこれを受け入れる前に誰もがそれを改善することができるかどうかを確認するためにここにコードを投稿しています。
private int[] getPoints(int perc)
{
int[] pts;// = new int[4];
double x_offset_left = (35 - 21);
x_offset_left = x_offset_left/100;
double height = 135;
double width = 178;
double x1, x2, y1, y2;
int margin_top = 66;//68
int margin_left = 21;
y1 = ((height/100) * perc) + margin_top;
y2 = y1;
x1 = margin_left + (x_offset_left * perc);
x2 = width - (x_offset_left * perc);
pts = new int[4] { Convert.ToInt32(x1), Convert.ToInt32(y1), Convert.ToInt32(x2), Convert.ToInt32(y2) };
return pts;
}
private Bitmap drawBucket2(int yellowval, int redval, int overval)
{
Bitmap img = new Bitmap(200, 221);
using (Graphics g = Graphics.FromImage(img))
{
Brush bRed = new SolidBrush(Color.FromArgb(50, Color.DarkRed));
Brush bYellow = new SolidBrush(Color.FromArgb(75, Color.Gold));
Brush bBlue = new SolidBrush(Color.FromArgb(50, Color.Blue));
GraphicsPath gp = new GraphicsPath();
Region r;
Point[] points_yellow;
Point[] points_red;
int percentage = 0;
int[] pts;
int[] pts_full = getPoints(100);
int[] pts_min = getPoints(1);
#region "Yellow Region"
// bottom curve
percentage = yellowval;
pts = getPoints(100 - percentage);
points_yellow = new Point[3];
points_yellow[0] = new Point(pts_full[0], pts_full[3]);
points_yellow[1] = new Point(((pts_full[2] - pts_full[0])/2 + pts_full[0]), (pts_full[1] + 15));
points_yellow[2] = new Point(pts_full[2], pts_full[3]);
gp.AddCurve(points_yellow, 0.7f);
//Console.WriteLine("curve : (" + points_yellow[0].X + ", " + points_yellow[0].Y + "), " + " (" + points_yellow[1].X + ", " + points_yellow[1].Y + "), " + " (" + points_yellow[2].X + ", " + points_yellow[2].Y + ")");
//polygon
points_yellow = new Point[4];
points_yellow[0] = new Point(pts[0], pts[1]);
points_yellow[1] = new Point(pts[2], pts[1]);
points_yellow[2] = new Point(pts_full[2], pts_full[1]);
points_yellow[3] = new Point(pts_full[0], pts_full[1]);
gp.AddPolygon(points_yellow);
//Console.WriteLine("Poly : (" + points_yellow[0].X + ", " + points_yellow[0].Y + "), " + " (" + points_yellow[1].X + ", " + points_yellow[1].Y + "), " + " (" + points_yellow[2].X + ", " + points_yellow[2].Y + "), " + " (" + points_yellow[3].X + ", " + points_yellow[3].Y + ")");
// top curve
points_yellow = new Point[3];
points_yellow[0] = new Point(pts[0], pts[1]);
points_yellow[1] = new Point(((pts[2] - pts[0])/2 + pts[0]), (pts[1] + 15));
points_yellow[2] = new Point(pts[2], pts[1]);
gp.AddCurve(points_yellow, 0.7f);
//Console.WriteLine("curve : (" + points_yellow[0].X + ", " + points_yellow[0].Y + "), " + " (" + points_yellow[1].X + ", " + points_yellow[1].Y + "), " + " (" + points_yellow[2].X + ", " + points_yellow[2].Y + ")");
r = new Region(gp);
g.FillRegion(bYellow, r);
#endregion
#region "Red Region"
gp = new GraphicsPath();
percentage = yellowval + redval;
// Bottom Curve
gp.AddCurve(points_yellow, 0.7f);
//Console.WriteLine("curve : (" + points_yellow[0].X + ", " + points_yellow[0].Y + "), " + " (" + points_yellow[1].X + ", " + points_yellow[1].Y + "), " + " (" + points_yellow[2].X + ", " + points_yellow[2].Y + ")");
// polygon
int[] pts_yel = new int[3]{pts[0], pts[1], pts[2]};
pts = getPoints(100 - percentage);
points_red = new Point[4];
points_red[0] = new Point(pts[0], pts[1]);
points_red[1] = new Point(pts[2], pts[1]);
points_red[2] = new Point(pts_yel[2], pts_yel[1]);
points_red[3] = new Point(pts_yel[0], pts_yel[1]);
gp.AddPolygon(points_red);
// Top Curve
points_red = new Point[3];
points_red[0] = new Point(pts[0], pts[1]);
points_red[1] = new Point(((pts[2] - pts[0])/2 + pts[0]), (pts[1] + 12));
points_red[2] = new Point(pts[2], pts[1]);
gp.AddCurve(points_red, 0.7f);
r = new Region(gp);
g.FillRegion(bRed, r);
#endregion
#region "Overflow"
if (overval > 0)
{
gp = new GraphicsPath();
gp.AddEllipse(16, 10, 165, 32);
r = new Region(gp);
g.FillRegion(bBlue, r);
}
#endregion
r.Dispose();
gp.Dispose();
bRed.Dispose();
bYellow.Dispose();
bBlue.Dispose();
}
return img;
}
private void fillBucket(int Yellowperc, int Redperc, int Overperc)
{
pictureBox1.Image = null;
pictureBox1.Image = drawBucket2(Yellowperc, Redperc, Overperc);
}
宿題ですか? – om471987
'catch'ブロックはまったく無意味です。例外がスローされた場合は、既に*に関するメッセージが表示されます。それをキャッチして自分のメッセージボックスを表示する理由はありません。さらに、何もできない例外を捕まえて飲み込むべきではありません。 –
次の問題は、メソッドが終了する前に作成したGDI +オブジェクト(Pen、Brushなど)を処理していないことです。 **あなたは 'IDisposable' **を実装しているオブジェクトに必ず' Dispose'を呼び出さなければなりません。そうしないと、メモリリークが発生します。 (これらのオブジェクトを処分する習慣に入る必要があります)。これを行う最善の方法は、作成を 'using'ブロックで囲むことです。あるいは、関数の最後に手動で 'Dispose'メソッドを呼び出すこともできます。 –