use*_*986 -1 c# graphics drawing
我在绘制图形时遇到问题,请原谅我,因为我对此完全陌生。我现在拥有的是一个名为 FormDraw 的表单。在 FormDraw 中,我有一个按钮。该按钮的作用是
private void button1_Click(object sender, EventArgs e)
{
using (Form form = new Form())
{
form.Text = "About Us";
System.Drawing.Graphics graphics = this.CreateGraphics();
System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(100, 100, 200, 200);
graphics.DrawEllipse(System.Drawing.Pens.Black, rectangle);
graphics.DrawRectangle(System.Drawing.Pens.Red, rectangle);
// form.Controls.Add(...);
form.ShowDialog();
}
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的是在新表单上绘制图形,但是单击它在旧表单(FormDraw)上创建的按钮后。知道我做错了什么吗?
这里的主要问题似乎是您还没有研究过 Winforms API 中的绘图是如何工作的,因此您试图在不了解 API 的情况下使用它。:(
您发布的代码将尝试仅在新创建的表单对象中绘制一次。该绘图根本不可能起作用,因为表单初始化的其余部分尚未完成,但即使某些内容确实绘制到屏幕上,它也会立即丢失,因为稍后将新内容绘制到屏幕上(例如表单最终显示时的本身)。
Winforms 与大多数主流 GUI API(包括 Mac OS、Java 的 SWT、AWT、Swing 等,当然还有本机 Windows API)一样,是一种“立即模式”API。也就是说,您的代码应该按需绘制,并绘制当时需要呈现的内容。API 不会记住您绘制的任何内容;任何时候发生一些事情(对于您的数据或屏幕本身,例如窗口重叠变化)会使您已经绘制的内容无效,您必须再次绘制它。
绘制 Winforms 控件(包括窗体)的唯一合适位置是在处理Paint事件时,无论是在实际处理程序中还是通过重写OnPaint(). 如果您想执行一次绘图语句,那么您必须绘制到位图对象(有效地缓存它们),然后在事件期间绘制位图本身Paint。
您的问题中没有足够的上下文来真正能够准确理解您想要做什么。但是您发布的代码可以通过将其修改为如下所示来修复为(我认为)您期望的方式工作:
private void button1_Click(object sender, EventArgs e) {
using (Form form = new Form())
{
form.Text = "About Us";
form.Paint += (sender, e) =>
{
System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(100, 100, 200, 200);
e.Graphics.DrawEllipse(System.Drawing.Pens.Black, rectangle);
e.Graphics.DrawRectangle(System.Drawing.Pens.Red, rectangle);
}
// form.Controls.Add(...);
form.ShowDialog();
}
}
Run Code Online (Sandbox Code Playgroud)
PaintEventArgs传递给事件处理程序的类包含Paint一个Graphics属性,该属性是您在事件期间绘图时要使用的实例 。GraphicsPaint
上面的代码将匿名事件处理程序方法订阅到新表单的Paint事件。在该处理程序中,您所需的绘图是使用通过传递给处理程序Graphics提供给您的实例来完成的。PaintEventArgs
(请注意,上面仅修复了处理Paint。当然,您将需要以其他方式正确初始化表单对象,例如设置其宽度和高度,实际添加所需的控件等)
| 归档时间: |
|
| 查看次数: |
5502 次 |
| 最近记录: |