如何用行 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();
}
实际上有三个原因导致这段代码不起作用,其中两个在其他答案中已经提到:
- 您的图片框不是窗体上的控件(请参阅补丁和聊天的答案)
- 画线中使用的坐标错误(见尼古拉·戴维多维奇的回答)
第三个问题是你不能像这样在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()
方法中绘制该字段。