2016-12-25 7 views
1

У меня проблема с рисованием в панели.C# Перемещение панели и изменение размера объекта

Я написал код для перемещения и изменения размера объекта в панели, , но когда я перемещаю или изменяю размер объекта, вы можете видеть, что происходит для панели.

My Application Screenshot

И вот мой код:

private void DrawControlBorder(object sender) 
    { 
     Control control = (Control)sender; 
     //define the border to be drawn, it will be offset by DRAG_HANDLE_SIZE/2 
     //around the control, so when the drag handles are drawn they will be seem 
     //connected in the middle. 
     Rectangle Border = new Rectangle(
      new Point(control.Location.X - DRAG_HANDLE_SIZE/2, 
       control.Location.Y - DRAG_HANDLE_SIZE/2), 
      new Size(control.Size.Width + DRAG_HANDLE_SIZE, 
       control.Size.Height + DRAG_HANDLE_SIZE)); 
     //define the 8 drag handles, that has the size of DRAG_HANDLE_SIZE 
     Rectangle NW = new Rectangle(
      new Point(control.Location.X - DRAG_HANDLE_SIZE, 
       control.Location.Y - DRAG_HANDLE_SIZE), 
      new Size(DRAG_HANDLE_SIZE, DRAG_HANDLE_SIZE)); 
     Rectangle N = new Rectangle(
      new Point(control.Location.X + control.Width/2 - DRAG_HANDLE_SIZE/2, 
       control.Location.Y - DRAG_HANDLE_SIZE), 
      new Size(DRAG_HANDLE_SIZE, DRAG_HANDLE_SIZE)); 
     Rectangle NE = new Rectangle(
      new Point(control.Location.X + control.Width, 
       control.Location.Y - DRAG_HANDLE_SIZE), 
      new Size(DRAG_HANDLE_SIZE, DRAG_HANDLE_SIZE)); 
     Rectangle W = new Rectangle(
      new Point(control.Location.X - DRAG_HANDLE_SIZE, 
       control.Location.Y + control.Height/2 - DRAG_HANDLE_SIZE/2), 
      new Size(DRAG_HANDLE_SIZE, DRAG_HANDLE_SIZE)); 
     Rectangle E = new Rectangle(
      new Point(control.Location.X + control.Width, 
       control.Location.Y + control.Height/2 - DRAG_HANDLE_SIZE/2), 
      new Size(DRAG_HANDLE_SIZE, DRAG_HANDLE_SIZE)); 
     Rectangle SW = new Rectangle(
      new Point(control.Location.X - DRAG_HANDLE_SIZE, 
       control.Location.Y + control.Height), 
      new Size(DRAG_HANDLE_SIZE, DRAG_HANDLE_SIZE)); 
     Rectangle S = new Rectangle(
      new Point(control.Location.X + control.Width/2 - DRAG_HANDLE_SIZE/2, 
       control.Location.Y + control.Height), 
      new Size(DRAG_HANDLE_SIZE, DRAG_HANDLE_SIZE)); 
     Rectangle SE = new Rectangle(
      new Point(control.Location.X + control.Width, 
       control.Location.Y + control.Height), 
      new Size(DRAG_HANDLE_SIZE, DRAG_HANDLE_SIZE)); 


     //get the form graphic 
     Graphics g = panelView.CreateGraphics(); 

     //draw the border and drag handles 
     ControlPaint.DrawBorder(g, Border, Color.Gray, ButtonBorderStyle.Dotted); 
     ControlPaint.DrawGrabHandle(g, NW, true, true); 
     ControlPaint.DrawGrabHandle(g, N, true, true); 
     ControlPaint.DrawGrabHandle(g, NE, true, true); 
     ControlPaint.DrawGrabHandle(g, W, true, true); 
     ControlPaint.DrawGrabHandle(g, E, true, true); 
     ControlPaint.DrawGrabHandle(g, SW, true, true); 
     ControlPaint.DrawGrabHandle(g, S, true, true); 
     ControlPaint.DrawGrabHandle(g, SE, true, true); 

     g.Dispose(); 
     //graphPanel.Dispose(); 
     //bitmap.Dispose(); 
    } 

Кто-нибудь может мне помочь?

tnx

ответ

0

Если вы хотите сделать непостоянное рисунок (который является то, что вы делаете в вашем коде) вам нужно вызвать graphPanel.Refresh()перед тем вы делаете рисунок.

Если вы хотите сделать постоянный рисунок вы должны сделать это в Paint случае, используя свой параметр e.Grpahics.

Непрерывный чертеж отлично подходит для отображения резиновой ленты прямоугольника или линии, которая следует за мышью.

Он исчезнет в любое время, например. при минимизации/максимизации формы. Так что, если вам необходимо конечное состояние упорствовать вам нужно следить за ним, может быть, в MouseUp случае с вызовом к Paint события (путем делать Invalidate() и рисунок его там ..

+0

Тпх, проблема решена вашей гильдией :) –

0

Это потому, что вы никогда не удаляете то, что рисуете. Перед перерисовки новых grabhandles или перемещения объекта или в любых условиях вы хотели бы удалить старые ручки, попробуйте этот

panelView.Invalidate(); 

Эта функция, MSDN says, «недействительной всю поверхность элемента управления и вызывает контроль перерисовывать «.

+0

Тпх, это правильно :) –