C # Forms - Как нарисовать фигуру поверх существующих панелей - PullRequest
0 голосов
/ 25 сентября 2018

enter image description here

Попытка нарисовать фигуру поверх существующих панелей на некоторое время, но на данный момент из идей.Может ли кто-нибудь помочь мне, пожалуйста?Он заканчивается всегда позади панелей (и pictureBox / серый /).Я пробовал 3 разных способа, без успеха.это мой код:

namespace DrawingOnFront
{
   public partial class Form1 : Form
    {
        public Form1()
        {
        InitializeComponent();
        }

    private void panel11_MouseClick(object sender, MouseEventArgs e)
    {
        DrawIt(90, 70);
    }

    private void DrawIt(int x, int y)
    {
        Rectangle Circle = new Rectangle(x,y,40,40);
        SolidBrush Red = new SolidBrush(Color.Red);
        Graphics g = this.CreateGraphics();
        g.FillEllipse(Red, Circle);

        /*
        Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
        Graphics g = Graphics.FromImage(bmp);
        int width = pictureBox1.Width /4;
        int height = pictureBox1.Height /2;
        int diameter = Math.Min(width, height);
        g.FillEllipse(Red, x, y, width, height);
        pictureBox1.Image = bmp;

        */

    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        using (Graphics g = e.Graphics)
        {
            Rectangle Circle = ClientRectangle;
            Circle.Location = new Point(100, 60);                  
            Circle.Size = new Size(40, 40);                       

            using (SolidBrush Green = new SolidBrush(Color.Green))    
            {
                g.FillEllipse(Green, Circle);
            }
        }
    }
 }
}

Извините за этот основной вопрос ламы, вероятно, для большинства из вас это очень просто, я все еще изучаю его.Большое спасибо заранее.

1 Ответ

0 голосов
/ 25 сентября 2018

Мои комментарии выше применяются.Вот пример того, как нарисовать на каждом элементе управления и форме отдельно :

У нас лучше всего есть общая процедура рисования, которую мы можем вызвать из Paintсобытие каждого участвующего элемента, в нашем случае Panel, PictureBox и Form.

Хитрость заключается в том, что все вложенные элементы рисуют окружность , смещенную на своисобственное местоположение.Для этого мы передаем эти вещи в процедуру рисования:

  • a valid Graphics object.Мы получаем его из событий Paint.
  • и ссылки на элемент управления;мы используем его для смещения рисунка на каждом элементе управления (кроме формы) с помощью Graphics.TranslateTransform ..:

Результат:

Как вы можете видеть выглядит как будто мы нарисовали один круг по всем элементам, но на самом деле мы нарисовали три кругов, каждый на один элемент ..:

enter image description here

private void canvasForm_Paint(object sender, PaintEventArgs e)
{
    draw(sender as Control, e.Graphics);
}

private void panel1_Paint(object sender, PaintEventArgs e)
{
    draw(sender as Control, e.Graphics);
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    draw(sender as Control, e.Graphics);
}

private void draw(Control ctl, Graphics g)
{
    Rectangle r = new Rectangle(200, 100, 75, 75);
    if (ctl != canvasForm)  g.TranslateTransform(-ctl.Left, -ctl.Top);
    g.FillEllipse(Brushes.Green, r);
    g.ResetTransform();
}

Обратите внимание, что один и тот же результат может быть создан с тремя вызовами, одним FillRectangle, одним DrawImage и одним FillEllipse: -)

...