Win32 GDI

Graphics Device Interface

Introduction to GDI

The Graphics Device Interface (GDI) is a core component of the Microsoft Windows operating system, responsible for presenting graphical information to users. It provides an abstract interface to various output devices, such as monitors, printers, and plotters, allowing applications to draw lines, shapes, text, and bitmaps without needing to know the specific details of the underlying hardware.

Key Responsibilities

Core GDI Objects

GDI utilizes several object types that must be created, selected into a device context, used for drawing, and then deleted. These objects manage graphical attributes and resources.

Common GDI Objects:

Device Context (DC)

The Device Context (DC) is a fundamental concept in GDI. It's a data structure that encapsulates the graphical attributes of a device, such as the current pen, brush, font, background color, and drawing mode. All GDI drawing operations are performed within the context of a specific device context.

Applications obtain a device context handle (HDC) for a particular window or printer, select the desired GDI objects into it, perform drawing operations, and then release the device context.

Common GDI Functions

GDI provides a rich set of functions for graphical operations. Here are some of the most frequently used categories and examples:

Drawing Functions:

  • LineTo(): Draws a line from the current position to a specified point.
  • Rectangle(): Draws a rectangle.
  • Ellipse(): Draws an ellipse.
  • Polygon(): Draws a polygon.
  • TextOut(): Writes a string of text at a specified location.
  • BitBlt(): Performs a block transfer of bitmap data.

Object Management Functions:

  • CreatePen(): Creates a new pen.
  • CreateSolidBrush(): Creates a solid color brush.
  • CreateFont(): Creates a new font.
  • SelectObject(): Selects a GDI object into a device context.
  • DeleteObject(): Deletes a GDI object.
  • ReleaseDC(): Releases a device context.

Example GDI Drawing Snippet (Conceptual)

This is a simplified conceptual example of how GDI might be used to draw a red rectangle within a window's drawing procedure:


// Assume hdc is a valid HDC obtained for the window
// Assume hwnd is the window handle

// 1. Create a red pen
HPEN hRedPen = CreatePen(PS_SOLID, 2, RGB(255, 0, 0)); // Solid, 2 pixels wide, Red

// 2. Create a transparent brush (optional, for outline only)
// HPEN hNullBrush = (HPEN)GetStockObject(NULL_BRUSH); // Using a stock object for null brush

// 3. Select the pen and brush into the device context
HPEN hOldPen = (HPEN)SelectObject(hdc, hRedPen);
// HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, hNullBrush); // If using null brush

// 4. Draw the rectangle
Rectangle(hdc, 50, 50, 200, 150); // x1, y1, x2, y2

// 5. Restore the original pen and brush
SelectObject(hdc, hOldPen);
// SelectObject(hdc, hOldBrush); // If using null brush

// 6. Delete the created pen
DeleteObject(hRedPen);
// If a brush was created, delete it too.

// hdc would be released later, e.g., ReleaseDC(hwnd, hdc);
            

Evolution and Modern Graphics

While GDI has been a cornerstone of Windows graphics for decades, modern Windows applications often leverage more advanced graphics subsystems like Direct2D and Direct3D for higher performance, hardware acceleration, and richer visual effects. However, understanding GDI is crucial for working with older codebases and for certain system-level operations.