Перерисовка панелей C#

  • Автор темы tarn
  • Дата начала
T

tarn

Гость
#1
Спасайте! Написал прогу, рисующие рандомные треугольники с рандомными цветами на 7 панелей (по одному треугольнику на панели):
C++:
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 Lab_3_29 {
public partial class Form1 : Form {

double[] nx, ny;
const int NP = 100;
Random r = new Random();
const int WH = 200;
private int cshft, pshft;
Color[] col,colors;
Panel[] panels;
PointF[] points;
PointF[] pnts;
int np,pn,cn;


void GenPoints() {
for (int i = 0; i < NP; i++) {
nx[i] = r.NextDouble() * WH;
ny[i] = r.NextDouble() * WH;
}
pshft = r.Next(NP);
cshft = r.Next(10);
}

public Form1() {
InitializeComponent();
nx = new double[NP]; ny = new double[NP]; 
col = new Color[] { Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.BlueViolet, Color.Coral, Color.Lime, Color.Magenta, Color.Brown };
GenPoints(); 
panels = new Panel[7];
panels[0] = panel1; panels[1] = panel2; panels[2] = panel3; panels[3] = panel4; panels[4] = panel5; panels[5] = panel6; panels[6] = panel7;
Init();
}

private void panels_Paint(object sender, PaintEventArgs e) {
pnts = new PointF[3];
Graphics g = e.Graphics;
Pen p = new Pen(colors[np], 2);
Brush b = new SolidBrush(colors[np]);
pnts[0] = points[0 + np * 3];
pnts[1] = points[1 + np * 3];
pnts[2] = points[2 + np * 3];
g.DrawPolygon(p, pnts);
g.FillPolygon(b, pnts);
np++;
}

void Init() {
np = 0; 
points = new PointF[21];
colors = new Color[7];
pn = pshft; cn = cshft;
//формирование точек
for (int i = 0; i < 21; i++) {
pn %= NP;
points[i] = new PointF((float)nx[pn], (float)ny[pn]);
pn++;
}
//формирование цветов 
for (int i = 0; i < 7; i++) {
cn %= 10;
colors[i] = col[cn];
cn++;
}
//запись на панели
foreach(Panel pnl in panels) {
pnl.Invalidate(); pnl.Refresh();
pnl.Paint += new PaintEventHandler(panels_Paint);
}  
}

private void bColor_Click(object sender, EventArgs e) {
cshft = r.Next(10);
Init();
}

private void bPlace_Click(object sender, EventArgs e) {
pshft = r.Next(NP);
Init();
}

}
}
Теперь надо, чтобы по нажатию на кнопку bColor треугольники перерисовывались с измененными цветами, а при нажатии на bPlace с измененной формой.
У меня глюк какой-то с перерисовкой. (Плохо представляю, как использовать Invalidate, Refresh и т.п., а также, возможно, где-то с индексами затупил). При этом, при первом нажатии на bColor ещё что-то более-менее разумное выходит, а после повторных нажатии, панели одна за другой пропадают.
Помогите пожалуйста, завтра сдавать! :ya_lamo: