如何用行 C# 填充图片框

本文关键字:填充 何用行 | 更新日期: 2023-09-27 18:37:13

所以我必须用线条填满我的图片框,尽管我不明白我做错了什么。

public Form1()
        {
            InitializeComponent();
            PictureBox pb = new PictureBox();
        }
        public void Zimet()
        {
            PictureBox pb = new PictureBox();
            Graphics g = pb.CreateGraphics();
            Pen pen1 = new Pen(Color.Red);
            for (int i = 0; i < pb.Height; i++)
            {
                g.DrawLine(pen1, pb.Width, 0, 0, pb.Height);
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Zimet();
        }

如何用行 C# 填充图片框

实际上有三个原因导致这段代码不起作用,其中两个在其他答案中已经提到:

  1. 您的图片框不是窗体上的控件(请参阅补丁和聊天的答案)
  2. 画线中使用的坐标错误(见尼古拉·戴维多维奇的回答)

第三个问题是你不能像这样在PictureBox上绘画,因为当绘画事件触发时,你绘制的任何内容都会丢失。创建一个图像,在其上绘制,然后将 PictureBox 的图像设置为该图像:

public void Zimet()
{
    var image = new Bitmap(pb.Width, pb.Height);
    Graphics g = Graphics.FromImage(image);
    Pen pen1 = new Pen(Color.Red);
    for (int i = 0; i < pb.Height; i++)
    {
        g.DrawLine(pen1, 0, i, pb.Width, i);
    }
    pb.Image = image;
}
首先,

您的PictureBox应该是Form的字段,您不应该每次单击按钮时都创建它。其次,你的DrawLine调用很糟糕,例如,如果你想要水平线,你需要做这样的事情:

        Pen pen1 = new Pen(Color.Red);
        for (int i = 0; i < pb.Height; i++)
        {
            g.DrawLine(pen1, 0, i, pb.Width, i);
        }

但这与用红色填充图片框相同。相反,我建议您通过更新 i+=2 跳过每隔一行。

        Pen pen1 = new Pen(Color.Red);
        for (int i = 0; i < pb.Height; i+=2)
        {
            g.DrawLine(pen1, 0, i, pb.Width, i);
        }

尽管如此,我还是建议您不要使用 CreateGraphic() 方法,而是在 Paint 事件处理程序中执行所有绘图。原因是每当您的表单无效时,您的绘图都会被删除。例如,使用一些布尔值,该值将在您单击按钮时设置,然后,如果为真,则进行绘图。像这样:

public class Form1:Form
{
    PictureBox pb;
    bool drawLines = false;
    public Form1()
    {
        InitializeComponent();
        pb = new PictureBox();
        pb.Size = new Size(100,100);
        pb.Location = new Point(0,0);
        pb.Paint+=new PaintEventHandler(pb_Paint);
        this.Controls.Add(pb);
    }
    private void pb_Paint(object sender, PaintEventArgs e)
    {
        if(drawLines)
        {
            Pen pen1 = new Pen(Color.Red);
            for (int i = 0; i < pb.Height; i+=2)
            {
               e.Graphic.DrawLine(pen1, pb.Width, 0, 0, pb.Height);
            }
        }
    }
    public void Zimet()
    {
        drawLines = true; //however this may look redundant, it is still OP's code
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Zimet();
    }

Zimet()函数创建一个Picturebox并绘制到它,然后在函数结束时将其丢弃.

您需要调用SomeUiObject.Controls.Add(pb);才能将其实际放在表单上。

在窗体构造函数中创建一个PictureBox pb,然后在Zimet()方法中创建另一个。Zimet() 方法中的那个在该方法的范围内是本地的,因此当该方法返回时会超出范围。

您是否正在尝试在构造函数中创建的PictureBox中绘制线条?因为一旦构造函数完成,这就会超出范围。也许在类中创建一个字段来保存PictureBox,然后在Zimet()方法中绘制该字段。