0

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

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();
        }
4

4 回答 4

2

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

  1. 您的 PictureBox 不是表单上的控件(请参阅 patchandchat 的答案)
  2. 画线中使用的坐标错误(参见 Nicola Davidovic 的回答)

第三个问题是您不能像那样在 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;
}
于 2013-10-29T14:03:20.773 回答
1

首先,您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 事件处理程序中进行所有绘图。这样做的原因是,只要您的表格无效,您的图纸就会被删除。例如,使用一些 bool 值,当您单击按钮时将设置该值,然后,如果它为 true,则进行绘图。像这样的东西:

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();
    }
于 2013-10-29T13:57:04.913 回答
0

您的Zimet()函数创建 aPicturebox并绘制它,然后在函数结束时将其丢弃。

您需要打电话SomeUiObject.Controls.Add(pb);才能将其实际放在表格上。

于 2013-10-29T13:56:39.573 回答
0

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

你想PictureBox在你的构造函数中画线吗?因为一旦您的构造函数完成,它就会超出范围。也许在你的类中创建一个字段来保存PictureBox然后在你的Zimet()方法中绘制它。

于 2013-10-29T13:57:47.637 回答