C# Рисование на панелях
Я составляю расписание дня и представляю временные интервалы с панелями, а встречи - это еще больше панелей сверху.
Пользователь может прокручивать вверх и вниз, так что диапазон, который он видит, смещается раньше или позже. Когда встреча выходит за пределы видимого диапазона, я хочу, чтобы там был зигзаг, указывающий, что встреча выходит за пределы видимых границ.
Я определил случай, когда это происходит, и я вызываю частную функцию drawZigZag(Panel p, int direction);
нарисовать это. День распространяется горизонтально, и направление -1 указывает на зигзаг слева, а 1 указывает на зигзаг справа.
Пока что я не до зигзага, я просто экспериментирую с CreateGraphics()
а также FillPolygon()
, Пока что у меня есть:
private void drawZigZag(Panel p, int direction) // 1 = right, -1 = left
{
Graphics g = p.CreateGraphics();
g.FillRectangle(new SolidBrush(Color.FromArgb(0, Color.Black)), p.DisplayRectangle);
Point[] points = new Point[4];
points[0] = new Point(0, 0);
points[1] = new Point(0, p.Height);
points[2] = new Point(p.Width, p.Height);
points[3] = new Point(p.Width, 0);
Brush brush = new SolidBrush(Color.DarkGreen);
g.FillPolygon(brush, points);
}
Первый FillRectangle()
У меня изначально не было Я только добавил, что когда FillPolygon()
не работал
В принципе, это не работает, и я не уверен, почему. Панель имеет оригинальный цвет - она не была закрашена DarkGreen. Я использовал CreateGraphics()
раньше для других вещей, и я не совсем уверен, почему это не работает в этом случае. Есть идеи?
Изменить: Извините, я думал, что должен упомянуть: Есть несколько Label
контролирует на моем Panel
которые описывают назначение. Они не должны быть покрыты, если это возможно.
2 ответа
Вы должны вызывать этот метод из обработчика событий рисования, а не только когда захотите. Так что в вашем конструкторе вы можете иметь:
panel1.Paint += new PaintEventHandler(panel1_Paint);
а затем реализация:
private void panel1_Paint( object sender, PaintEventArgs e )
{
var p = sender as Panel;
var g = e.Graphics;
g.FillRectangle( new SolidBrush( Color.FromArgb( 0, Color.Black ) ), p.DisplayRectangle );
Point[] points = new Point[4];
points[0] = new Point( 0, 0 );
points[1] = new Point( 0, p.Height );
points[2] = new Point( p.Width, p.Height);
points[3] = new Point( p.Width, 0 );
Brush brush = new SolidBrush( Color.DarkGreen );
g.FillPolygon( brush, points );
}
Например, у нас есть это событие рисования, которое рисует текст из textBox1:
private void panel1_draw(object sender, PaintEventArgs e)
{
var g = e.Graphics;
Pen myp = new Pen(System.Drawing.Color.Red, 4);
Font fy = new Font("Helvetica", 10, FontStyle.Bold);
Brush br = new SolidBrush(System.Drawing.Color.Red);
g.DrawString(textBox1.Text, fy, br, 0,0);
}
Чтобы рисовать на панели1, вам нужно написать этот код в обработчике событий кнопки:
private void button1_Click(object sender, EventArgs e)
{
panel1.Paint+=new PaintEventHandler(panel1_draw);
panel1.Refresh();
}
Первая строка рисует текст на вашей панели, и если вы хотите, чтобы текст отображался, вы должны обновить панель. Главное в использовании panel1.Pain += new PaintEventHandler(ваше пустое имя); и panel1.Refresh();