使用Visual Studio 2010 Express创建我可以绘制的表面

时间:2010-04-29 15:56:20

标签: c# wpf winforms drawing system.drawing

我来自Java背景,试图移植一个简单​​版本的Conway的生命游戏,我写信给C#以学习语言。

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

在C#中,我已经收集到我需要重写OnPaint()来绘制东西,据我所知,这要求我继承某些东西(我选择了Panel)。我无法弄清楚如何让Windows窗体编辑器让我放置我的自定义类。我也不确定生成的代码在哪里放置我的课程。

我怎么能这样做,并且把我的所有绘图代码放到一个子类中我真的应该怎么做呢?谷歌缺乏简单的答案表明我在这里缺少一些重要的东西。如果有人想在WPF中建议一种方法,我很想听听它。

由于

1 个答案:

答案 0 :(得分: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中的一点是你通常不会绘制任何东西,引擎为你吸引。