C# 在子控件顶部绘制图像

C# 在子控件顶部绘制图像,c#,winforms,C#,Winforms,我需要在包含一些子控件的面板上绘制一个图像。我不想让它隐藏在那些控件后面,现在在Paint事件中绘制图像时就是这样 下面是我用来覆盖面板的OnPaint方法的代码: protected override void OnPaint(PaintEventArgs e) { try { base.OnPaint(e); //Draw icon for views at top right corner of the panel. e.Gr

我需要在包含一些子控件的面板上绘制一个图像。我不想让它隐藏在那些控件后面,现在在
Paint
事件中绘制图像时就是这样

下面是我用来覆盖面板的
OnPaint
方法的代码:

protected override void OnPaint(PaintEventArgs e)
{
    try
    {
        base.OnPaint(e);
        //Draw icon for views at top right corner of the panel.
        e.Graphics.SmoothingMode = 
                System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        if (_viewButton != ViewButton.None)
        {
            Brush menuBrush = 
                new SolidBrush(_viewButton == ViewButton.Highlighted ? 
                    Color.Black : Color.Gray);
            e.Graphics.FillPolygon(menuBrush, new Point[] { 
                new Point(this.Width - 29, 03), 
                new Point(this.Width - 19, 03), 
                new Point(this.Width - 24, 09) });
            menuBrush.Dispose();

            //Draw border of the panel.
            Rectangle borderRect = 
                    new Rectangle(0, 0, this.Width - 1, this.Height - 1);
            GraphicsPath borderPath = GetRoundPath(borderRect, 8);
            e.Graphics.DrawPath(new Pen(Color.LightGray), borderPath);
        }
    }
    catch (Exception ex)
    {
        throw new IDSException(ex);
    }
}

(或的重写)是执行此类操作的错误位置,因为您需要确保绘制例程被最后调用

相反,如果您可以访问父控件,请重写
OnPaint
方法,然后调用基本实现然后绘制您的图像,它将被绘制在所有其他内容之上。

执行此类操作的位置(或覆盖)是错误的,因为您需要确保绘制例程被最后调用


相反,如果您可以访问父控件,请重写
OnPaint
方法,然后调用基本实现然后绘制您的图像,它将被绘制在所有其他内容之上。

最好的方法是在图像上使用
BringToFront()
方法

它将在所有控件的顶部绘制图像。
但是,除非所有控件都位于同一父控件上,否则此操作将不起作用。

执行此操作的最佳方法是在图像上使用
BringToFront()
方法

它将在所有控件的顶部绘制图像。
但是,除非所有控件都位于同一父控件上,否则这将不起作用。

Hi casperOne感谢您的快速回答,因为我正在急切地等待。我试过那件事,但失败了。它什么也没用(@Lalit:如果失败,您应该显示显示失败的代码。否则,我们无法帮助您找出问题所在。您好,我将代码作为另一个答案发布,因为注释长度限制了我。修复它将是gr8帮助。:@Lalit:当您在调试器中单步执行此代码时,它是否引发异常?@Lalit:为什么不将父控件设置为自定义用户控件,其中包含一个面板,然后覆盖用户控件而不是面板的OnPaint方法?您好,casperOne,谢谢您的快速回答,因为我正在急切地等待。我试过那件事,但失败了。它什么也没用(@Lalit:如果失败,您应该显示显示失败的代码。否则,我们无法帮助您找出问题所在。您好,我将代码作为另一个答案发布,因为注释长度限制了我。修复它将是gr8帮助。:@Lalit:当您在调试器中单步执行此代码时,它是否引发了异常?@Lalit:为什么不让父控件成为一个自定义的用户控件,其中包含一个面板,然后覆盖用户控件的OnPaint方法而不是面板?嗨,Jon,实际上我正在面板上绘制一个多边形和一个矩形。我想我不能把它带到前面去。如果我错了,请纠正我,告诉我怎么走。对不起,我在想一个图片盒。嗨,乔恩,实际上我在面板上画了一个多边形和一个矩形。我想我不能把它带到前面去。如果我错了,请纠正我,告诉我怎么走。对不起,我在想一个图片盒。
protected override void OnPaint(PaintEventArgs e)
{
    try
    {
        base.OnPaint(e);
        //Draw icon for views at top right corner of the panel.
        e.Graphics.SmoothingMode = 
                System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        if (_viewButton != ViewButton.None)
        {
            Brush menuBrush = 
                new SolidBrush(_viewButton == ViewButton.Highlighted ? 
                    Color.Black : Color.Gray);
            e.Graphics.FillPolygon(menuBrush, new Point[] { 
                new Point(this.Width - 29, 03), 
                new Point(this.Width - 19, 03), 
                new Point(this.Width - 24, 09) });
            menuBrush.Dispose();

            //Draw border of the panel.
            Rectangle borderRect = 
                    new Rectangle(0, 0, this.Width - 1, this.Height - 1);
            GraphicsPath borderPath = GetRoundPath(borderRect, 8);
            e.Graphics.DrawPath(new Pen(Color.LightGray), borderPath);
        }
    }
    catch (Exception ex)
    {
        throw new IDSException(ex);
    }
}