2015-11-04 6 views
-2

Я использую элемент управления. Я добавил два Панели, поскольку я хотел бы нарисовать несколько панелей над элементом управления. i переопределил метод OnPaint() для этих двух панелей, но метод OnPaint() первой панели, добавленной в один только элемент управления, метод OnPaint() не вызвал вторую панель, которую я добавил в элемент управления.Метод OnPaint не вызван для дочерних элементов управления - WinForms

Примечание: Я использовал приведенный ниже код для перерисовки поверхности, чтобы избежать проблем с проблеском. Если я удалю приведенные ниже коды из моего примера, метод OnPaint() вызывается для второй панели, но элемент, нарисованный во второй панели, не находится в Visual. (т. е.) Не отображается.

SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.Selectable | 
        ControlStyles.UserPaint | 
        ControlStyles.AllPaintingInWmPaint, true); 

Как достичь нескольких панелей, используя один элемент управления? Заранее спасибо.

Код:

public Class VContainer : Panel 

{ 

public CPanel CPanel; 

public SPanel SPanel; 

public VContainer() 

{ 

this.CPanel = new CPanel(); 

this.SPanel = new Spanel(); 

this.Controls.Add(Cpanel); **// first added Panel** 

this.Controls.Add(SPanel); 

} 

protected override void OnMouseDown(MouseEventArgs e) 

{ 

this.CPanel.Invalidate(); 

this.SPanel.Invalidate(); 

this.SPanel.Update(); 

} 

} 

public class CPanel : Panel 

{ 

public CPanel() 

{ 
// Used to redraw the surface to avoid flickering issues 
SetStyle(ControlStyles.OptimizedDoubleBuffer | 
          ControlStyles.UserPaint | 
          ControlStyles.AllPaintingInWmPaint, true); 

} 

**// OnPaint() called since Cpanel is added first to the VContainer** 

protected override void OnPaint(PaintEventArgs e) 

{ 
e.Graphics.FillRectangle(Brushes.Red, new Rect(0,0,50,50)); 

base.OnPaint(e); 

} 

} 

public class SPanel : Panel 

{ 

public SPanel() 

{ 
// Used to redraw the surface to avoid flickering issues 
SetStyle(ControlStyles.OptimizedDoubleBuffer | 
          ControlStyles.UserPaint | 
          ControlStyles.AllPaintingInWmPaint, true); 
} 

**// OnPaint() method is not called while invalidating the Panel since the Spanel is added as second control to VContainer** 

protected override void OnPaint(PaintEventArgs e) 

{ 
e.Graphics.FillRectangle(Brushes.Green, new Rect(0,0,50,50)); 

base.OnPaint(e); 

} 

} 
+1

Пожалуйста, покажите код OnPaint, а также показать код порога вы положите панель в другую. В противном случае помощь затруднена –

+0

@EmmanuelDURIN - Я показал код, который я пробовал. –

+0

Мне нужен ваш код, вы попробовали? –

ответ

0

Венкатесан,

Ваши два элемента управления CPanel и SPanel находятся в таком же положении.

Таким образом, один накладывается на другой, и Winforms не рисует одно под.

Изменение положения и размеров элементов управления, и вы увидите что-то:

public VContainer() 
{ 
    this.CPanel = new CPanel(); 
    CPanel.Top = 0; 
    CPanel.Left = 0; 
    CPanel.Width = 50; 
    CPanel.Height = 50; 
    this.Controls.Add(CPanel); // first added Panel** 


    this.SPanel = new SPanel(); 
    SPanel.Top = 50; 
    SPanel.Left = 50; 
    SPanel.Width = 50; 
    SPanel.Height = 50; 
    this.Controls.Add(SPanel); 
} 

Кстати, изменить порядок инструкций метода OnPaint.
Потому что, если базовый класс делает некоторые рисунок, он будет охватывать, что вы делаете:

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    e.Graphics.FillRectangle(Brushes.Red, new Rectangle(0, 0, 50, 50)); 
} 

Полный источник рабочего раствора: http://1drv.ms/1NtIttW

С уважением

Смежные вопросы