PDA

View Full Version : سوال: باگ برنامه ..بعد از اضافه کردن سیرکل جدید با رنگ جدید سیرکل قبلی هم تغییر رنگ میده



elahe7
چهارشنبه 02 آذر 1390, 17:41 عصر
این برنامه قراره رنگ هر سیرکل رو نگه داره و با زدن استارت حرکت کنه...مشکل اینجاست بعد از اضافه کردن سیرکل جدید با رنگ جدید سیرکل قبلی هم تغییر رنگ میده..نمیدونم چجور مشکلشو رفع کنم..
public partial class Form1 : Form
{
int s = 0;
int[,] xy;
Pen pen;
Graphics g;
int index = 0;
ColorDialog []ccolor = new ColorDialog[10];
int c_counter = 0;
int[] a;
int[] b;



private void Form1_Load(object sender, EventArgs e)
{
}
public Form1()
{

InitializeComponent();
pen = new Pen(button1.ForeColor,2);
for(int i=0;i<index;i++)
{
pen =new Pen(button1.ForeColor,2);
}
g = panel1.CreateGraphics();

xy = new int[10, 2];
a = new int[10];
b = new int[10];
for (int i = 0; i < 10; i++)
{
a[i] = 3;
b[i] = 3;
}
}

private void b_1_Click(object sender, EventArgs e)
{
Draw();
}
private void b_2_Click(object sender, EventArgs e)
{
timer1.Enabled =! timer1.Enabled;
}
private void timer1_Tick(object sender, EventArgs e)
{
move();
}

private void Draw()
{
if(c_counter==0)
mashang();

if (index < 10)
{

xy[index, 0] = Int32.Parse(t_1.Text);
xy[index, 1] = Int32.Parse(t_2.Text);
int f = index;

g.DrawEllipse(pen, xy[index, 0], xy[index, 1], 20, 20);
index++;
}
else
{
MessageBox.Show("Over flow","Error",MessageBoxButtons.OKCancel,MessageBoxIcon.Error);
}
}



private void move()
{
// bool check = false;
for (int i = 0; i < index; i++)
{
pen = new Pen(Color.NavajoWhite, 2);
g.DrawEllipse(pen, xy[i, 0], xy[i, 1], 20, 20);

xy[i, 0] += a[i];
xy[i, 1] += b[i];
// if (check == false)
{
if (ccolor[i] == null)
{
// if (c_counter == 1)
// ccolor[i] = ccolor[c_counter - 1];
if (i == c_counter)
ccolor[i] = ccolor[c_counter - 1];
else
ccolor[i] = ccolor[c_counter ];

}
}

pen = new Pen(ccolor[i].Color, 2);
g.DrawEllipse(pen, xy[i, 0], xy[i, 1], 20, 20);
}
juction();
}
private void juction()
{

for (int i = 0; i < index; i++)
{
if ((xy[i, 0] <= 0) || (xy[i, 0] >= (panel1.Width - 20)))

a[i] *= (-1);

if ((xy[i, 1] <= 0) || (xy[i, 1] >= (panel1.Height - 20)))

b[i] *= (-1);

}

}
private void button1_Click(object sender, EventArgs e)
{
mashang();
}
void mashang()
{
ColorDialog cd = new ColorDialog();
cd.ShowDialog();
pen.Color = cd.Color;
pen = new Pen(cd.Color);
ccolor[c_counter] = cd;
c_counter++;
button1.ForeColor = cd.Color;
s = 1;
}

gwbasic
پنج شنبه 03 آذر 1390, 05:09 صبح
برای راحتی کار بهتره یه حداقل هایی رو از مفاهیم شی گرایی رعایت کنید. مثلا اگه شما با موجودی به نام دایره سروکار دارید. پس بهتره یک کلاس به نام Circle تعریف کنید که خصوصیاتی مثل موقعیت شعاع و رنگ یا قلم (که شما مشکل دارید ونمی دونید کدوم دایره کدوم رنگ رو داره) داره و همینطور اعمال و رفتار اون رو مشخص کنید مثلا بهتره متدی بنویسید که خودش کار رسم رو انجام بده نه جای دیگه ای این کار رو انجام بدید.

public class Circle
{
public Point Location{get;set;}
public int Radius{get;set;}
public Pen pen { get; set; }
public void Draw(Graphics g)
{
// Draw this Circle
}
}

و لیستی از این کلاس رو در فرمتون قرار بدید تا دیگه مشکلی نداشته باشید و هر لحظه بتونید از این لیست مشخصات هر دایره که کجا هست و رنگش چیه بگیرید.

و نکته فنی مهم هم اینه که کار رسم رو بطور مستقیم روی فرم یا کنترل مورد نظرتون انجام ندین بلکه ابتدا یک Bitmap‌ایجاد کنید و کار ترسیمات دایره ها رو روی اون انجام بدید و در نهایت این Bitmap رو روی فرم یا کنترلتون رسم کنید