我目前正在使用 C# 表单。我有两种形式。我希望只要按下第一个表单中的按钮,就会打开第二个表单,并在输出此表单后执行代码。我使用了 Shown 方法,但由于某种原因它不起作用。仅当您将其放在 MessageBox 方法的最开始时才包含它。
private void Form2_Shown(object sender, EventArgs e)
{
float h;
int division = 10;
Graphics gr = pictureBox1.CreateGraphics();
Pen p = new System.Drawing.Pen(System.Drawing.Color.Gray);
//Разметка
h = 0;
while (h <= pictureBox1.Width)
{
gr.DrawLine(p, h, 0, h, pictureBox1.Height);
h += division;
}
h = 0;
while (h <= pictureBox1.Height)
{
gr.DrawLine(p, 0, h, pictureBox1.Width, h);
h += division;
}
//Координатная ось
p.Color = Color.Red;
gr.DrawLine(p, pictureBox1.Width / 2, 0, pictureBox1.Width / 2, pictureBox1.Height);
gr.DrawLine(p, 0, pictureBox1.Height / 2, pictureBox1.Width, pictureBox1.Height / 2);
}


“你吃错三明治了。”
几个重要的点:
Invalidate()。Control.OnPaint(PaintEventArgs)一个虚拟方法和一个事件负责呈现表单Control.Paint。代码中的问题
你在一个只被调用一次的事件中绘制,并且不记得你绘制了什么。因此,每当您更新表单时,您都会得到原始图像。
解决方案
有几种选择:
覆盖
OnPaint或使用事件处理程序Paint。事件本身Paint调用该方法OnPaint和订阅它的所有其他方法。每当重绘表单时都会触发该事件。我们将您的绘图代码转移到适当的方法并感到高兴……但并非一切都如此简单。这可能是最明显的选择,但在正确实现方面也是最困难的,因为表单的外观和性能都直接取决于此。渲染代码应该尽可能快,没有繁重的计算,数据挖掘和其他废话。另外,您必须手动考虑表单上子元素的位置,这也不是最有趣的任务。我们绘制一张图片并将其粘贴到表单中。这里的一切都很琐碎。我们选择
Bitmap合适的尺寸,从中获取一个对象Graphics并绘制我们需要的一切。之后,我们将其作为单独的控件插入到表单中,或者将其保存在某个表单域中,然后使用DrawImagein将图像传输到所需区域OnPaint。DrawImage本机实现并且运行速度非常快,但它需要一个完成的图像。顺便说一句,DrawImage你也可以让他“思考”很长时间,例如,给他一个非常大的像素大小的图片,并附上指令来大大缩小它。这种方法对每个人都有好处,除了一件事——它不适合实时动态图像(当然,相对于实时而言)。但是将图像保存到文件中,完全没有问题-Bitmap.Save=)。自定义控件。这个选项对我来说最有吸引力,因为它允许您完成一次工作并在需要时使用结果。
思路如下:
UserControl(以下简称MyControl)。MyControl存储需要绘制的对象。如果需要,一些数据可以是永久的,一些是用户定义的。MyControl被覆盖OnPaint,以便它以正确的顺序绘制存储在其中的对象。全部。现在只需将我们的自定义控件放在表单上并将必要的参数传递给它,其余的将自己完成。事实上,所有标准而非非常控制都是如此。
就复杂性而言,此选项介于第一个和第二个选项之间,但与它们不同的是,它可以通过高质量的实现轻松重用。
似乎我没有忘记任何重要的事情,但是如果描述的内容不完全清楚,请告诉我-我会澄清=)