如何在C#中绘制简单的图形?

20

我只想在C#中绘制简单的2D对象,比如圆形、直线、正方形等。我该怎么做?回想起Turbo C++时代,我记得初始化了一些图形库来完成相同的操作。在.NET中需要做类似的事情吗?对于3D对象有什么不同吗?像DirectX这样的东西会使它更容易吗?非常感谢任何教程或示例链接。

9个回答

22

正如其他人所说,可以查看System.Drawing。System.Drawing将GDI+ Windows绘图库暴露给您的应用程序。

一个很好的教程可以帮助您快速入门System.Drawing和GDI+,可以在C# Corner找到。

需要注意以下一些重要事项:

  1. 许多GDI+对象实现IDisposable接口,因此应该包装在using块中。请确保遵守适当的处理约定;未能处理GDI+对象可能会导致应用程序产生非常严重的副作用。 (.NET中的GDI+对象对应于它们底层的Windows API等效项。)
  2. 像DirectX这样的API极其复杂,而且有充分的理由。它们不是为简单形状而设计的,而是为了复杂的、高性能的和高度交互式的多媒体应用程序。(换句话说,通常是游戏。)虽然您可以通过Managed DirectX接口访问DirectX,但这也可能是过度杀伤力的。
  3. 如果您想使用更简单的方法来处理DirectX,则应选择XNA。但是,这是非常适用于游戏的库,同样可能过于复杂。根据下面的评论,我有点晚了,但是这已经不再得到支持了。(这很有道理;我已经好几年没有听说过它了。)

7
根据2013年1月31日发送的电子邮件,XNA不再积极开发,并且它不受Windows 8的新“Metro界面”层或Windows RT平台的支持。 - klaas
也许可以看一下unity3d,它有很好的教程和免费的独立/个人许可证。或者查看这个 reddit - klaas
3
我不建议使用GDI+或System.Drawing。我在这里是因为FillRectangle太慢了,它会缓慢调用底层的SafeNativeMethods GDI+(Gdip)FillRectangle,速度太慢以至于没有用。现在已经是2017年,我还需要与一个简单的FillRectangle标准函数作斗争,开玩笑吧。 - hamish
https://github.com/mono/sysdrawing-coregraphics 是在 macOS 上基于 CoreGraphics 的 System.Drawing 移植版。 - Chris Hamons

15

以下是一个简单的代码示例,它可以帮助您入门(假设您有一个名为pictureBox1的PictureBox):

Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
    g.DrawLine(new Pen(Color.Red), 0, 0, 10, 10);
}
pictureBox1.Image = bmp;

图形对象有许多其他绘图方法,而Intellisense会向您展示如何调用它们。


3

了解GDI、GDI+和System.Drawing命名空间,请参阅此处
DirectX不是用于绘制简单形状的工具,而是用于渲染复杂的三维物体。同时,在C#中使用DX API可能有些棘手(虽然并不难)。


1

1
在C# Windows表单(也适用于VB.Net)中实现2D图形的最佳方法是使用CefSharp和Canvas API结合JavaScript语言。相比笨重的GDI+,Canvas更快更好。

0

请查看 System.Drawing 命名空间


0

你需要使用GDI+。

如何实现略有不同取决于你想在哪里绘制。你可以在控件或窗体上绘制,也可以在图片对象上绘制。无论哪种方式,你都需要一个System.Drawing.Graphics对象,我相信它位于System.Drawing.dll中。

你可以实例化一个新的Bitmap类并调用Graphics.FromImage(myImage),然后使用刚创建的Graphics对象上的方法进行绘制。如果你想在表单或控件上绘制,只需覆盖OnPaint方法并查看EventArgs类上的Graphics属性即可。

有关System.Drawing命名空间的更多信息,请参见http://msdn.microsoft.com/en-us/library/system.drawing.aspx


你不能实例化一个新的Image,但是你可以实例化一个新的Bitmap。 - MusiGenesis
啊,是的,谢谢澄清。我知道这个,但是忘了。 - Max Schmeling

0

在 .NET 中寻找受控 Direct3D 图形 API来源


0

GDI+使用System.Drawing


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接