Introduction to Device Contexts
|
|
To draw something, you need a platform on which to draw and
one or a few tools to draw with. The most common platform on which to draw is
probably a piece of paper. Besides such a platform, you may need a pen or a
brush that would show the evolution of the drawing work on the platform. Since a
pen can have or use only one color, depending on your goal, one pen may not be
sufficient, in which case you would end up with quite a few of them.
A device context is an ensemble of the platform you draw on
and the tools you need to draw with. It also includes the dimensioning of the
platform, the orientation and other variations of your drawing, the colors, and
various other accessories that you can use to express your imagination.
When using a computer, you certainly cannot position tools
on the table or desktop to use as needed. To help with drawing on the Windows
operating system, Microsoft created the Graphical Device Interface, abbreviated
as GDI. It is a set of classes, functions, variables, and constants that group
all or most of everything you need to draw on an application. GDI is provided as
a library called Gdi.dll and is already installed on your computer.
GDI+ is the system used to perform drawing and other related
graphics operations for the Microsoft Windows family of operating systems. Its
predecessor was the Graphical Device Interface (GDI), which has therefore been
replaced, namely with the new operating systems such as Windows XP, Windows
Server 2003, or Windows Vista. The + in GDI+ indicates that it provides a
significant improvement to GDI. It adds new features that were not available in
GDI and were therefore difficult to produce. GDI+ allows you to create
device-independent applications without worrying about the hardware on which the
application would run.
GDI+ is inherently installed in Microsoft Windows XP,
Windows Server 2003, and Windows Vista. To use it on previous operating systems,
it must be explicitly distributed. GDI+ provides its functionality through three
fronts:
- Vector Graphics
This is the area that consists of drawing and manipulating
geometric-based and related figures including lines, combinations of
lines, round and quadrilateral shapes. These are treated as sets of
points on a screen or other device. To perform these types of
operations, the GDI+ system provides various classes that perform
different assignments. For example, one class can be in charge of
creating or preparing tools used to draw. Another class can be used
to perform the actual drawing, using the provided tools |
- Imaging
While it may appear easy to create vector graphics
that are made of easily recognizable colors, advanced pictures
present a challenge to display or draw them on a device. For these
reasons, imaging is the area used to deal with such complex
operations |
- Typography
Typography consists of creating, manipulating or
making fonts available to an application |
To draw in GDI, you have to obtain a handle to the device
context. This is done by declaring a variable or a pointer to HDC then
calling a function such as BeginPaint() to initialize the device context.
You also have to create the tools needed to draw. For example, you have to
create a pen and/or a brush. Once the tools are ready, you have to select them
into the device context to make them available. After drawing, it is suggested
that you release the device context.
To draw in GDI+, you use an object referred to as graphic.
To support GDI+ graphics and their features, the .NET
Framework provides the System.Drawing namespace that is is created in the
System.Drawing.dll library. This namespace also contains classes to draw
or define a font in an application. To enhance the aspects of a drawing, the
.NET Framework provides additional classes in the System.Drawing.Drawing2D
namespace. This namespace also is defined in the System.Drawing.dll
assembly. To support additional manipulation techniques that can be applied to a
picture, the .NET Framework provides some other classes in the
System.Drawing.Imaging namespace, which is also part of the
System.Drawing.dll library.
The main object on which you will perform most drawings is
called a graphic. In most cases, this object is not readily available when you
need it: you must request it from the object on which you want to draw or you
must create it. Both operations are highly easy.
In GDI+, a graphic object is based on a class called
Graphics. This class is defined in the System.Drawing namespace.
Before drawing, you should obtain a graphic object. Fortunately, every Windows
control, that is, every object based on the Control class, automatically
inherits a method called CreateGraphics(), which gives you access to the
graphic part of a control. The syntax of the Control.CreateGraphics()
method is:
Public Function CreateGraphics As Graphics
As you can see, the CreateGraphics() method returns
the Graphics object of the variable you call it from. Here is an example
of getting the Graphics object of a form:
Imports System.Drawing
Imports System.Windows.Forms
Module Exercise
Public Class Starter
Inherits Form
Friend WithEvents btnPaint As Button
Dim components As System.ComponentModel.Container
Public Sub New()
InitializeComponent()
End Sub
Public Sub InitializeComponent()
btnPaint = New Button
btnPaint.Location = New Point(12, 12)
btnPaint.Text = "Validate"
Controls.Add(btnPaint)
End Sub
Private Sub PaintClicked(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnPaint.Click
Dim graph As Graphics = CreateGraphics()
End Sub
End Class
Function Main() As Integer
Dim frmStart As Starter = New Starter
Application.Run(frmStart)
Return 0
End Function
End Module
Another technique you can use to get the Graphics
object of a control is to call the Graphics.FromHwnd() static method. Its
syntax is:
Public Shared Function FromHwnd(hwnd As IntPtr) As Graphics
Remember that this method is static.
The argument passed to it must be a handle to the object whose Graphics
object you want to access. Every Windows control has a handle called Handle.
Here is an example of using it to get the Graphics part of a form:
Private Sub PaintClicked(ByVal sender As Object, _
ByVal e As EventArgs) _
Handles btnPaint.Click
Dim graph As Graphics = Graphics.FromHwnd(Handle)
End Sub
If you are using the Paint event of a window, it
provides a readily available Graphics object from its PaintEventArgs
argument. You can access the Graphics object as follows:
Imports System.Drawing
Imports System.Windows.Forms
Module Exercise
Public Class Starter
Inherits Form
Dim components As System.ComponentModel.Container
Public Sub New()
InitializeComponent()
End Sub
Public Sub InitializeComponent()
End Sub
Private Sub FormPaint(ByVal sender As Object, _
ByVal e As PaintEventArgs) _
Handles MyBase.Paint
e.Graphics()...
End Sub
End Class
Function Main() As Integer
Dim frmStart As Starter = New Starter
Application.Run(frmStart)
Return 0
End Function
End Module
As mentioned above, before drawing, make sure you have a
Graphics object, which depends on your approach to drawing. To actually
perform the drawing, the Graphics class provides various methods adapted
for different shapes. Each method used to draw something has a name that starts
with Draw... Also, each method that is used to draw a known shape requires a
Pen argument. Therefore, when drawing, your first decision will be based on
the shape or type of figure you want to draw.
Two other pieces of information are particularly important
with regards to any figure or shape you will need to draw: its location and
dimensions.
The Starting Point of a Shape or Figure
|
|
To keep track of the various drawings,
the object on which you draw uses a coordinate system that has its origin (0, 0)
on its top-left corner. If you are drawing on a form, this origin is positioned
just under the title bar to the left:
How you specify the values of the starting point of a shape
or figure depends on the shape.
|