2

我来自 Java 背景,并尝试将我编写的 Conway 生命游戏的简单版本移植到 C# 以学习该语言。

在Java 中,我通过从JComponent 继承并覆盖paint() 来绘制我的输出。然后我的新画布类有一个模拟后端的实例,它可以读取/操作。然后,我可以使用 WYSIWYG GUI 编辑器(Matisse,来自 NetBeans)来直观地放置画布。

在 C# 中,我收集到我需要重写 OnPaint() 来绘制东西,这(据我所知)需要我从某些东西继承(我选择了 Panel)。我不知道如何让 Windows 窗体编辑器让我放置自定义类。我也不确定我需要在生成的代码中放置我的类的位置。

我该怎么做,并且将我所有的绘图代码放入一个子类中,我应该怎么做呢?谷歌上缺乏简单的答案表明我在这里遗漏了一些重要的东西。如果有人也想建议一种在 WPF 中执行此操作的方法,我很想听到它。

谢谢

4

1 回答 1

2

在 Windows 窗体中,您可以通过调用任何控件的方法来简单地绘制任何控件CreateGraphics。例如,如果你有一个面板,你可以这样绘制:

using (var g = panel1.CreateGraphics()) {
    g.DrawString("Hello World", 0, 0);
}

控件也有一个Paint事件。通过双击属性窗口中的事件添加事件处理程序,您可以像这样绘制:

private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    e.Graphics.DrawString("Hello World", 0, 0);
}

如果您想从控件派生,您可以只在代码中执行,或者创建一个新的用户控件并在代码和 .Designer.cs 文件中更改基类(尽管UserControl或只是没Control问题)。如果您在设计器中已经有一个表单,它已经派生自Form,您可以直接覆盖 OnPaint。

我的建议是:如果你只是想画一些东西,你通常不需要创建一个新的类。只需使用 Paint 事件。如果需要立即重绘,请调用 Refresh 以使控件自行重绘。这应该让你继续前进。请注意,还有一个受保护的 DoubleBuffered 属性,它可以帮助您避免闪烁(为表单或派生控件设置它)。

我不确定你会在 WPF 中做什么。我从来不需要在 WPF 中手动绘制一些东西,因为布局和渲染引擎非常强大,你可以使用数据模板、控件模板等。WPF 中的要点是你通常不绘制任何东西,引擎为您绘制。

于 2010-04-29T16:16:53.993 回答