【问题标题】:WinForms, picturebox's image overlapping custom painted drawingsWinForms,picturebox的图像重叠自定义画图
【发布时间】:2017-07-04 14:06:25
【问题描述】:

我有一个带有图片框的自定义用户控件。然后,在Paint事件中的控件上画一个圆圈。

var size = TextRenderer.MeasureText(this.UnreadCount.ToString(), lblDisplayname.Font);
var rec = new Rectangle(0, 0, size.Width, size.Width);
var smallFont = new Font(lblDisplayname.Font.Name, lblDisplayname.Font.Size - 1);
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;
format.FormatFlags = StringFormatFlags.DirectionRightToLeft;
format.LineAlignment = StringAlignment.Center;

using (LinearGradientBrush b = new LinearGradientBrush(
    rec,
    Color.FromArgb(242, 37, 37),
    Color.FromArgb(178, 30, 30),
    45F))
{                    
    e.Graphics.FillEllipse(b, rec);                    
    e.Graphics.DrawString(this.UnreadCount.ToString(), smallFont, Brushes.White, rec, format);
}

然后,在稍后的实现中,我设置了控件的图片框的图像。

MyControl ctrl = new MyControl();
ctrl.picImage.Image = Image.FromFile(imagePath);
ctrl.Refresh();

问题是:图片框的图像与绘制的圆圈重叠。 current issue 要求是:需要圆圈显示完全重叠的图像。什么可能导致我的问题?

【问题讨论】:

  • 您是否尝试过在您的父自定义控件中覆盖CreateParams,如this question 中的第二个片段所述?
  • 刚试过。不幸的是,它不起作用。
  • 你能分享一下图片应该是什么样子吗?我的意思是想要的结果。
  • 在一个空白的用户控件中,添加一个面板(Panel1)并将其停靠到父控件,在前一个面板上添加另一个面板(Panel2),在panel2绘制事件中,输入您的代码。更改根据需要在您的代码中添加面板 1 的背景图像。 - 没有图片框的另一种方法

标签: c# winforms gdi+


【解决方案1】:

下面的函数会返回一个带有你需求的用户控件,贴出代码让你了解父子关系。

要么图形必须绘制在图像容器的顶部,要么绘制在图像顶​​部的另一个透明容器上。

下面的示例有 2 个面板,面板 1 和面板 2,其中面板 2 是面板的子项。 面板 1 是背景图片,面板 2 有图形。希望对您有所帮助。

    private UserControl create_MyControl( string  filenamepath)
    {
        //Create User Control

        UserControl MyControl = new UserControl();
        //Mention the size of control
        MyControl.Size = new Size(100, 100);
        //Create a panel to hold the background image that you wanted in the picture box
        Panel panel1 = new Panel();
        //dock the panel1 to fill the control background
        panel1.Dock = DockStyle.Fill;
        MyControl.Controls.Add(panel1);
        //Create another panel as overlay for panel1
        Panel panel2 = new Panel();
        //dock the panel2 to fill the panel1;
        panel2.Dock = DockStyle.Fill;
        //Add panel2 as child of panel1
        panel1.Controls.Add(panel2);
        //Set panel2 background as transparent 
        panel2.BackColor = Color.Transparent;
        // To replicate the variables that you have!
        Label lblDisplayname = new Label();
        lblDisplayname.Font = new Font("Arial", 24, FontStyle.Regular);
        lblDisplayname.Size = panel2.Size;
        lblDisplayname.TextAlign = ContentAlignment.TopCenter;
        lblDisplayname.Text = "25";
        lblDisplayname.Dock = DockStyle.Fill;
        panel2.Controls.Add(lblDisplayname);

        panel1.BackgroundImage = Image.FromFile(filenamepath);
        panel1.BackgroundImageLayout = ImageLayout.Stretch;

        //In Panel2 paint event put your code for stuff
        panel2.Paint += (s, e) =>
        {

            var size = TextRenderer.MeasureText("Hello", lblDisplayname.Font);
            var rec = new Rectangle(0, 0, size.Width, size.Width);

            var smallFont = new Font(lblDisplayname.Font.Name, lblDisplayname.Font.Size - 1);
            StringFormat format = new StringFormat();
            format.Alignment = StringAlignment.Center;
            format.FormatFlags = StringFormatFlags.DirectionRightToLeft;
            format.LineAlignment = StringAlignment.Center;

            using (System.Drawing.Drawing2D.LinearGradientBrush b = new System.Drawing.Drawing2D.LinearGradientBrush(
                rec,
                Color.FromArgb(242, 37, 37),
                Color.FromArgb(178, 30, 30),
                45F))
            {
                e.Graphics.FillEllipse(b, rec);
                e.Graphics.DrawString("Hello", smallFont, Brushes.White, rec, format);
            }
        };

        return MyControl;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 2016-11-18
    相关资源
    最近更新 更多