I just want to draw simple 2D objects like circle, line, square etc in C#. How do I do that? Back in the Turbo C++ days I remember initializing some graphics library for doing the same. Do I need to do something similar in .NET? Is it any different for 3D objects? Will things like DirectX make this any easier? Any links to tutorials or samples much appreciated.
9 Answers
As others have said, check out System.Drawing. (I'm only repeating that for completeness.) System.Drawing exposes the GDI+ Windows drawing library to your application.
A good tutorial to get you jump-started with System.Drawing and GDI+ can be found at C# Corner.
Some important items to note:
- Many GDI+ objects implement the IDisposable interface, and therefore should be wrapped in
using
blocks. Be sure you follow the appropriate disposal conventions; failing to dispose GDI+ objects can result in really nasty side effects for your app. (GDI+ objects in .NET correspond to their underlying Windows API equivalents.) - APIs such as DirectX are extremely complex, and for good reason. They're designed not for simple shapes, but rather for complex, highly-performant and highly-interactive multimedia applications. (In other words, games, typically.) You can access DirectX through the Managed DirectX interfaces, but again, it's probably overkill for your direct purposes.
- If you are interested in an easier way to work with DirectX, XNA is the way to go. However, this is very much a gaming-specific library, and again is likely to be overkill. I'm a bit late to the party, but according to the comments below, this is no longer supported at all. (This makes sense; I haven't heard anything about it in years.)

- 37,282
- 14
- 64
- 100
-
7"According to an email sent on 31 January 2013, **XNA is no longer actively being developed**,and it is not supported under the new "Metro interface" layers of Windows 8 nor on the Windows RT platform." [Quote from Wikipedia](https://en.m.wikipedia.org/wiki/Microsoft_XNA) – klaas Dec 03 '15 at 23:33
-
Maybe look at [unity3d](http://unity3d.com) it has good tutorials and a free indie/personal licence. Or check this [reddit](https://www.reddit.com/r/gamedev/comments/1et2li/c_game_engines_other_than_xnamonogame/) – klaas Dec 03 '15 at 23:46
-
3I don't recommend GDI+ nor System.Drawing I am here because FillRectangle is too slow, and it slowly calls underlying SafeNativeMethods GDI+ (Gdip) FillRectangle waay too slow to be useful. this is 2017, and I am fighting against a simple FillRectangle standard function, are you kidding me. – hamish Jan 02 '17 at 23:41
-
https://github.com/mono/sysdrawing-coregraphics is a port of System.Drawing on top of CoreGraphics for macOS. – Chris Hamons May 03 '17 at 15:34
Here's a simple code sample that will get you started (assumes you have a PictureBox named pictureBox1):
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;
The graphics object has a bunch of other drawing methods, and Intellisense will show you how to call them.

- 74,184
- 40
- 190
- 334
Read about GDI, GDI+, System.Drawing namespace, for example here.
DirectX is not something you would use to draw simple shapes, rather render complicated 3D stuff, also, using DX Api under C# is a bit trickier (although not that hard).

- 11,789
- 2
- 33
- 41
Check out the System.Drawing namespace: http://msdn.microsoft.com/en-us/library/system.drawing.aspx

- 5,311
- 3
- 34
- 50
The best way to implement 2D Graphics in C# Windows Forms (also VB.Net) is using CefSharp and Canvas API via JavaScript language. Canvas is way better and faster than clunky GDI+

- 11
- 1
You need to use GDI+.
How you do it depends slightly on what you want to draw on. You can draw on a control or a form, or you can draw on an image object. Either way, you need a System.Drawing.Graphics object which I believe is located in System.Drawing.dll.
You can instantiate a new Bitmap class and call Graphics.FromImage(myImage), and then draw using the methods on the Graphics object you just created. If you want to draw on a form or control just override the OnPaint method and look for the Graphics property on the EventArgs class.
More information on System.Drawing namespace here: http://msdn.microsoft.com/en-us/library/system.drawing.aspx

- 12,363
- 14
- 66
- 109
-
You can't instantiate a new Image, but you can instantiate a new Bitmap. – MusiGenesis Aug 19 '09 at 21:39
-