2015-05-18 7 views
0

Я пытаюсь добавить элемент управления к своей панели. В mouseDown на панели точка сохраняется и при mouseUp точка сохраняется. Но при панели mouseUp ничего не нарисовано. Как его решить?Управление не нарисовано на панели

Ellipse Класс:

class Ellipse : Control 
{  

    private int x; 
    private int y; 
    private int width; 
    private int height; 

    public Ellipse(int x, int y, int width, int height) 
    { 
     setY(y); 
     setX(x); 
     setWidth(width); 
     setHeight(height); 
    } 

    public int getX() { return x;} 
    public int getY() { return y; } 
    public int getWidth() { return width; } 
    public int getHeight() { return height; } 
    public void setX(int newx) { x = newx; } 
    public void setY(int newy) { y = newy; } 
    public void setWidth(int newwidth) { width = newwidth; } 
    public void setHeight(int newheight) { height = newheight; } 


    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     // Call methods of the System.Drawing.Graphics object. 
     // Declare and instantiate a new pen. 
     System.Drawing.Pen myPen = new System.Drawing.Pen(Color.Aqua); 

     // Draw an aqua rectangle in the rectangle represented by the control. 
     e.Graphics.FillEllipse(Brushes.Black,x,y,width,height); 
    }  
} 

Form1 класс

private void panel_MouseDown(object sender, MouseEventArgs e) 
    { 
     draw = true; 
     x = e.X; 
     y = e.Y; 
    } 

private void panel_MouseUp(object sender, MouseEventArgs e) 
    { 
     draw = false; 
     xe = e.X; 
     ye = e.Y; 

     Item item; 
     Enum.TryParse<Item>(menuComboBoxShape.ComboBox.SelectedValue.ToString(), out item); 

     switch (item) 
     { 

      case Item.Pencil: 
       using (Graphics g = panel.CreateGraphics()) 
        using (var pen = new Pen(System.Drawing.Color.Black))  //Create the pen used to draw the line (using statement makes sure the pen is disposed) 
        { 
         g.DrawLine(pen,new Point(x, y), new Point(xe, ye)); 
        } 
       break; 
      case Item.Rectangle: 
       break; 
      case Item.Ellipse: 
       Ellipse el = new Ellipse(x,y,xe-x,ye-y); 
       panel.Controls.Add(el); 

       break; 
      default: 
       break; 
     } 
    } 
+0

Вы пробовали отлаживать? Какова ценность mDown на событии mouseDown? – Abhishek

+0

Я поставил точку останова на 'mDown = e.Location;' но не достигнуто – Sybren

+0

Что такое панель? Можете ли вы поделиться соответствующим кодом? – Abhishek

ответ

2

Вы наследуя свой Ellipse класс от контроля, но на самом деле вы не используете его в качестве контроля - вы не добавляя это в Controls коллекции формы, поэтому на самом деле она невидима, неактивна и не принимает никаких событий из формы.

Также окраска элемента управления из внешнего кода выглядит плохой дизайн. Элемент управления должен рисовать сам, и вы должны установить его границы из внешнего кода.

Вот фрагмент кода, чтобы отвезти вас на правильный путь:

class Ellipse : Control 
{ 
    Point mDown { get; set; } 

    public Ellipse() 
    { 
     MouseDown += shape_MouseDown; 
     MouseMove += shape_MouseMove; 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     e.Graphics.FillEllipse(Brushes.Black, this.Bounds); 
    } 

    private void shape_MouseDown(object sender, MouseEventArgs e) 
    { 
     mDown = e.Location; 
    } 

    private void shape_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      Location = new Point(e.X + Left - mDown.X, e.Y + Top - mDown.Y); 
     } 
    } 
} 

И в форме вы должны создать это нравится:

el = new Ellipse(); 
el.Bounds = new Rectangle(0, 0, 100, 100); 
Controls.Add(el); 

Update

Основываясь на ваш обновленный кода, я вижу пару вопросов:

  1. Вы на самом деле не нужны x, y, width, height свойства вашего Ellipse класса и по методам геттер/сеттер, так как это Control, и она имеет свою собственную Location и Width, Height общественные свойства.

  2. Вы неправильно рисуете свой эллипс. Предполагая, что он должен заполнить всю площадь, покраска должна быть e.Graphics.FillEllipse(Brushes.Black,0,0,Width,Height) (здесь я предполагаю использовать Control.Width вместо width и т. Д.). В противном случае вы дополнительно переместите окрашенный эллипс.

  3. код в panel_MouseUp относительно создания эллипса должно быть что-то вроде

var el = new Ellipse(); 
panel.Controls.Add(el); 
el.Location = new Point(x, y); 
el.Width = (xe - x); 
el.Height = (ye - y); 

Или, если он должен быть один единый Эллипс (сейчас вы создаете новый каждый раз) - создайте это за пределами обработчика mouseUp и внутри обработчика просто измените его размер и местоположение.

+0

Я понимаю, что вы имеете в виду, но как должен выглядеть класс 'Shape'? – Sybren

+0

@Sybren все, что я вижу в вашем классе 'Shape' - это' Paint'method. Если мы следуем концепции «контроль должен рисовать сам, а не из внешнего кода» - этот меход не нужен. Если вам нужно что-то еще в Shape - это зависит от вас. Если ничего больше в Shape - возможно, это совсем не нужно, и вы можете наследовать эллипс из 'Control' напрямую. –

+0

Теперь я использую ваш код, но я изменил этот 'Controls.Add (el);' на эту 'panel.Controls.Add (el);' потому что я хочу добавить в 'панель'. Это результат: http://gyazo.com/5cc6fac8473200f34c26849381637af4. Есть идеи? – Sybren