在新表格上绘制图形

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)上创建的按钮后。知道我做错了什么吗?

Pet*_*iho 5

这里的主要问题似乎是您还没有研究过 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。当然,您将需要以其他方式正确初始化表单对象,例如设置其宽度和高度,实际添加所需的控件等)