Нарисуйте прямоугольник на панели формы C # - PullRequest
2 голосов
/ 08 ноября 2011

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

 /* 
  * based on a some flags i determine which shape i want to draw. 
  * All shapes are stored in a list. I loop through the list 
  * and call each shape specific draw method - as shown below:.
  *
  */
namespace myDrawProgram
{
     private void panelArea_Paint(object sender, PaintEventArgs e)
        {
            if (drawWithPaint == true)
            {
                Pen p = new Pen(Color.Blue);
                p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;

                if (IsShapeRectangle == true)
                {
                    e.Graphics.DrawRectangle(p, rect);
                }
                else if (IsShapeCircle == true)
                {
                    e.Graphics.DrawEllipse(p, rect);
                }

            }
            foreach (Shapes shape in listOfShapes)
            {

                shape.Draw(e.Graphics);
            }
        }
}

/*
 * In another file i have my class which deals with 
 * drawing rectangles. It is as follows: 
 *
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using SETPaint; 

namespace myDrawProgram
{
    class TheRectangles : Shapes
    {
        public Rectangle MyRect { set; get; }

        public TheRectangles(Rectangle rect, Color colour, Color boarderColour, Int32 brushThickness)
            : base(colour, boarderColour, brushThickness)
        {
            MyRect = rect;

        }


        public override void Draw(Graphics g)
        {
            base.Draw(g);


            g.FillRectangle(new SolidBrush(Shapes.c), MyRect);
            g.DrawRectangle(new Pen(bc, MyBrushThickness), MyRect);
        }
    }
}

Я предполагаю, что мне нужно сделать что-то вроде этого:

с использованием (Graphics g = this.panel1.CreateGraphics ()) {}

Я просто не уверен, как реализовать это в отношении моего кода ...

Ответы [ 2 ]

4 голосов
/ 08 ноября 2011

Похоже, вы не подключили событие рисования панели:

panelArea.Paint += new PaintEventHandler(panelArea_Paint);

Если panelArea - это имя вашей формы, просто измените его на свою панель:

panel1.Paint += new PaintEventHandler(panel1_Paint);

и затем перенесите свою логику рисования на этот метод:

private void panel1_Paint(object sender, PaintEventArgs e) {
  // the rest of your drawing
}
1 голос
/ 08 ноября 2011

Похоже, что родитель (форма?) Отвечает за отрисовку каждого из своих элементов управления.

Я бы не стал так делать.

Если вам просто нужен элемент управления, который рисует фигуры(и не обязательно требует другого поведения Panel), я просто создал бы пользовательский элемент управления, у которого есть свойство, указывающее, какую фигуру рисовать, и возложил бы на него ответственность за собственный рендеринг.

Если вам действительно нуженПоведение панели, вы можете создать подкласс Panel и реализовать поведение рисования в вашем подклассе.Опять же, это делает элемент управления ответственным за собственный рендеринг.

Для получения информации о пользовательских элементах управления см.

http://msdn.microsoft.com/en-us/library/b818z6z6(v=vs.71).aspx

...