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() не работал.

В принципе, это не работает, и я не уверен, почему. Панель исходного цвета - темно-зеленая заливка не производилась. Я использовал CreateGraphics() раньше для других целей, и я не совсем уверен, почему он не работает в этом случае. Любые идеи?

Редактировать: извините, я подумал, что должен упомянуть: на моем Panel есть несколько элементов управления Label, которые описывают встречу. Они не должны быть покрыты, если это возможно.


person Ozzah    schedule 31.03.2011    source источник
comment
Извините, если я здесь совершенно не по адресу, но не похоже, что вы привязываетесь к жизненному циклу аннулирования/отрисовки элемента управления. например подписка/переопределение события OnPaint рассматриваемого элемента управления и т. д.   -  person lzcd    schedule 01.04.2011
comment
Помните, что ваши элементы управления будут перекрашиваться каждый раз, когда их нужно будет обновить. Поэтому, если вы попытаетесь просто закрасить свой элемент управления в какой-то момент, он будет перерисован обратно в свой нормальный вид, поэтому вы не увидите своих изменений. Вам нужно зарегистрировать свой метод рисования с помощью события Paint, если вы хотите увидеть свои изменения.   -  person Jeff Mercado    schedule 01.04.2011


Ответы (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 );
    }
person Daniel Kinsman    schedule 31.03.2011

Например, у нас есть это событие рисования, которое рисует текст из 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();
    }

Первая строка рисует текст на вашей панели, и если вы хотите, чтобы текст отображался, вы должны обновить панель. Главное в использовании панели1.Pain += new PaintEventHandler(ваше пустое имя); и панель1.Обновить();

person Alin Leon    schedule 19.03.2015