Die Windows GDI+ (Teil 1) (2024)

Die Windows GDI+ (Teil 1)

In diesem C++ Artikel geht es um die relativ neue Grafikbibliothek GDI+ für Windows.

1 Einleitung
2 Technische Voraussetzungen
3 Sauberes C++ von Microsoft
4 Was kann die GDI+?
5 Hello World!
6 Mächtige Graphics
7 Ausblick
A Links

Wer bisher in seinen Windows-Anwendungen Grafikfunktionen benötigt hat, hat meistens die alte GDI-API benutzt. Immerhin erfüllt sie ihren Zweck und ist seit eh und je in Windows vorhanden. Für C++ Programmierer ist sie jedoch leider eine API, die nicht auf einer OO-Sprache basiert, obwohl sie einen objektorientieren Ansatz verfolgt. Doch könnte es für einen C++ Programmierer viel komfortabler sein, komplexere Grafiken zu erstellen, als dies mit der GDI der Fall ist. Um zu ansprechenderen Ergebnissen in kürzerer Zeit zu gelangen, muss man sich mit der GDI aktuelle Effekte selbst entwickeln oder kombinieren.

Mit Erscheinen von Windows XP hat Microsoft jedoch die Zeichen der Zeit erkannt und eine leistungsfähigere API eingeführt. Und schon sind wir bei der neuen GDI+-Bibliothek angelangt.

Die GDI+ ist in jedem Windows XP serienmäßig dabei, ist jedoch nicht auf Windows XP beschränkt. Es kann auch auf Windows 2000, Windows NT 4.0 SP6 und Windows 98/ME mit einer zusätzlichen DLL ohne Installation eingesetzt werden. Die kostenlose GDI+ für Endbenutzer ist auf der GDI+ Homepage als Download verfügbar.

Die Entwickler von Microsoft haben mit der GDI+ eine Bibliothek entworfen, die einem C++-Programmierer nicht peinlich sein muss. Keine Makros, keine Präfixe, sondern Namespaces und klare Parameternamen. Die Freigabe von Ressourcen, wie sie in der alten GDI nötig war, entfällt durch die Fähigkeiten der C++-Stackobjekte ebenfalls. Alles das hätten wir uns von Microsoft viel früher gewünscht. Aber lieber spät als nie.

Vom Programmierer werden Kenntnisse in C++ und der Objektorientierung verlangt, wobei diese auf einer einfachen Ebene stattfinden ("weil einfach einfach einfach ist!"). Templates o.Ä. muss man nicht kennen, was die GDI+ auf jeden Fall auch für C++-Einsteiger sehr interessant macht. Besonders diese können schnell und einfach in die Grafikprogrammierung einsteigen, ohne in die Gefahr der Speicherlecks o.Ä. zu laufen.

Wen die oben genannten Argumente immer noch nicht überzeugt haben, wird dies ganz bestimmt durch die Features der GDI+ werden. Prinzipiell deckt die GDI+ alle Bereiche der 2D-Grafik ab, solange man kein Actionspiel programmieren will. Aber 2D-Vectorgrafik mit Transformationen und Translationen in Kombination mit Spezialeffekten sind für jeden intuitiv umzusetzen. Weiterhin unterstützt werden das Codieren und Decodieren von wichtigen Grafikformaten, dazu gehören z.B. JPEG, PNG, TIFF u.a. Diese Bitmaps kann man ebenfalls, wie die Vectorfunktionen, mit Effekten versehen und transformieren (z.B. skallieren). Wie das alles sehr einfach, schnell und intuitiv umzusetzen ist, werde ich jetzt endlich zeigen.

Alle nachfolgenden Beispiele sind von mir als VisualC++ 2003 Projekte mit Sourcecode im Download verfügbar:
GDI-Plus-Tutorial.zip (174 KB)

Ich gehe in diesem Tutorial nicht auf die Windows-Programmierung ein. Deshalb werde ich nur auf die relevanten Teile für die GDI+ eingehen. Um die GDI+ nutzen zu können, muss die gdiplus.lib dem Linker mitgeteilt werden und bei Nicht-WinXP-Systemen die gdiplus.dll in den Arbeitspfad gelegt werden. Wer mit Visual C++ ein Win32-Projekt anlegt, muss unbedingt das Makro WIN32_LEAN_AND_MEAN entfernen (wird im stdafx.h definiert), da man sonst Kompilierungsfehler bekommt. Schon steht dem Programmieren nichts mehr im Weg.

Für ein erstes einfaches Beispiel werden wir die GDI+ initialisieren und eine Linie zeichnen.

Die Windows GDI+ (Teil 1) (1)

#include <windows.h> // für die GDI+ wird auch windows.h benötigt#include <gdiplus.h> // dieser Header ist für alle GDI+ Klassen, Funktionen usw.using namespace Gdiplus; // 01INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow) { GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 02 // ... paint(hdc); // ... GdiplusShutdown(gdiplusToken); // 03}void paint(HDC hdc) { Graphics graphics(hdc); // 04 Pen pen(Color(255, 0, 0, 255)); // 05 graphics.DrawLine(&pen, 0, 0, 200, 100); // 06}

Erklärungen zu den einzelnen Zeilen:

01: Um nicht vor jeder Klasse oder Funktion ein "Gdiplus::" zu schreiben, benutzen wir implizit den Namespace.

02: Im Startpunkt unserer Anwendung (hier die WinMain-Funktion) sollten wir die GDI+ initialisieren. Da die GDI+ eine komplexere Initialisierung durchführt, ist dieser Aufruf nur einmalig zu empfehlen und nicht vor jedem Zeichenvorgang. Das gdiplusTocken (ein Pointer) darf nicht verloren gehen, damit man die GDI+ wieder deinitialisieren kann.

03: Die GdiplusShutdown()-Funktion will den gültigen gdiplusToken-Pointer haben, um die GDI+ zu beenden. Dieser Aufruf kann und sollte erst kurz vor Beenden der Anwendung aufgerufen werden.

04: Hier geht es endlich zur Sache. Gdiplus::Graphics ist die wichtigste Klasse, die uns begegnet. Sie stellt sozusagen die Zeichenfläche dar, auf der sich das Geschehen abspielt. In dem Beispiel beziehen wir die Zeichenfläche auf ein HDC-Device (z.B. ein Fenster). Wir hätten auch eine Bitmap übergeben können, welche sich nicht auf dem Bildschirm befindet. So könnte man Bitmaps im Hintergrund manipulieren.

05: Zum Zeichnen benötigt man auch ein Werkzeug. Wir instanzieren hier einen Stift und übergeben dem Konstruktor gleich eine Wunschfarbe. Gdiplus::Color ist eine Farbenklasse die auch einen Alphachannel unterstützt. Somit sind auch transluzente Farben kein Problem.

06: Auf unserer Zeichenfläche (graphics) können wir Aktionen ausführen, z.B. mit DrawLine eine Linie ziehen. Als Parameter erwartet diese Methode einmal das Werkzeug (unseren blauen Stift) und die X/Y-Koordinaten jeweils für den Start- und Endpunkt unserer Linie. Das Beispiel zeichnet eine blaue Linie von oben links diagonal nach unten rechts.

Wie man an unserer paint()-Funktion sieht, können wir alle Objekte auf dem Stack anlegen und brauchen somit diese deshalb nicht wieder mit einem delete oder einer ominösen release()-Funktion freizugeben.

Das Graphics-Objekt legt man wahlweise vor jeder Zeichensequenz neu an oder einmalig und löscht sie jedes Mal mit der Clear()-Methode. Hat man das gemacht, kann man allerhand damit anstellen, denn sie verfügt über 188 Methoden.

Sehr leicht kann man z.B. eine Figur (Rechteck, Ellipse, Pfade usw.) rotieren, verschieben und skallieren lassen. Diese Aktionen benötigen dabei jeweils nur eine einzige Zeile Programmcode. Das folgende Beispiel zeichnet erst ein Rechteck und verschiebt dann ein zweites Rechteck nach unten links und dreht es dann um 28°.

Die Windows GDI+ (Teil 1) (2)

Graphics graphics(hdc);Rect rect(0, 0, 50, 50); // 01Pen pen(Color::Blue, 1); // 02graphics.DrawRectangle(&pen, rect);pen.SetColor(Color::Red);graphics.TranslateTransform(100,100); // 03graphics.RotateTransform(28.0f); // 04graphics.DrawRectangle(&pen, rect); // 05

01: Wir wollen ein Rechteck. Hier wird es mit der Größe 50x50 Pixel instanziert.

02: Unser Stift bekommt die Farbe blau, da die Klasse Color uns schon Enumerationen für viele Farben bereitstellt. Selbst Farben, die uns Männern nichts sagen, aber wohl den Damen, sind vordefiniert.

03: Nachdem wir das erste Rechteck gezeichnet haben, bewegen wir unseren Grafikkontext um 100/100 (X/Y) Pixel.

04: Jetzt rotieren wir den Grafikkontext um 28°.

05: Auf Grund der vorherigen Aktionen wird unser Rechteck an einer ganz anderen Stelle gezeichnet. Das Rechteck selbst braucht man nicht verändern, es soll sich einfach nur zeichnen. Das hat den Vorteil, dass sich die Transformationen auf alle möglichen Figuren auswirken und somit die Figuren selbst keine Transformationsmethoden bieten müssen (kann man ganz gut mit dem STL-Konzept vergleichen, wo die Container auch keine Algorithmen à la Sortieren oder Suchen haben).

Wer will, kann auch mit der Methode ScaleTransform() seine Figuren skallieren, d.h. in der Größe ändern.

Hier noch ein Beispiel, das eindrucksvoll zeigt, wie man mit nur einer zusätzlichen Zeile Code (in dem Fall eine for-Schleife) etwas Spektakuläres zaubern kann:

Die Windows GDI+ (Teil 1) (3)

Graphics graphics(hdc);Rect rect(0, 0, 50, 50);Pen pen(Color::Red, 1);graphics.TranslateTransform(100,100);for(int i =0; i < 360; i=i+10) { // 360° in 10° Schrittengraphics.RotateTransform(10); // dynamische Rotation mehrmals durchlaufengraphics.DrawRectangle(&pen, rect);}

Mit diesem Wissen können wir jetzt auch etwas praktisches mit der GDI+ umsetzen. Eine analoge Uhr ist dazu gerade ideal.

Die Windows GDI+ (Teil 1) (4)

Ist euch in dem obigen Screenshot das Anti-Aliasing (Kantenglättung) aufgefallen? Dies kann man mit der Graphics-Methode SetSmoothingMode() ein- und ausschalten. Wie man eine solche Uhr zeichnet, zeigt die Klasse kharchi::clock, welche ich hier im Quellcode bereitgestellt habe. Die Klasse unterliegt der BSD-Lizenz - ihr könnt sie also ändern, erweitern und in eigenen Projekten benutzen. Anwenden kann man sie wie folgt:

using namespace Gdiplus;Graphics graphics(hdc);kharchi::clock c;c.set_time(16, 55, 00);// 16:55 Uhrc.paint(graphics);

Das war jetzt der erste Teil, in dem ich euch die GDI+ hoffentlich schmackhaft machen konnte. Sicherlich waren die Ergebnisse auf dem Bildschirm nicht wahnsinnig spektakulär, doch an den Beispielcodes kann man sehen, dass man mit sehr wenig Programmieraufwand spektakulärere Ergebnisse zaubern kann. Im nächsten Teil werde ich etwas tiefer in die Möglichkeiten der GDI+ Figuren eingehen.

GDI+ Homepage
Neueste SDK-Distribution
GDI+ Reference

Die Windows GDI+ (Teil 1) (2024)

FAQs

What is GDI+ Windows? ›

Windows GDI+ is the portion of the Windows XP operating system or Windows Server 2003 operating system that provides two-dimensional vector graphics, imaging, and typography.

Is GDIplus deprecated? ›

Legacy Graphics: Technologies that are obsolete and should not be used in new applications. This category includes (among others) the following APIs: GDI. GDI+

Does Windows still use GDI? ›

The Graphics Device Interface (GDI) is a legacy component of Microsoft Windows responsible for representing graphical objects and transmitting them to output devices such as monitors and printers. It was superseded by DirectDraw API and later Direct2D API.

How to download GDI+? ›

GDI+ details:
  1. Visit: http://www.dll-files.com/
  2. Select the gdiplus.dll file from the alphabetic list and download the zip file.
  3. The location as to where you unzip the file depends on the operating system:

What is the difference between GDI and GDI+? ›

Windows GDI+ is different from Windows Graphics Device Interface (GDI) in a couple of ways. First, GDI+ expands on the features of GDI by providing new capabilities, such as gradient brushes and alpha blending. Second, the programming model has been revised to make graphics programming easier and more flexible.

What is GDI on my computer? ›

The Microsoft Windows graphics device interface (GDI) enables applications to use graphics and formatted text on both the video display and the printer. Windows-based applications do not access the graphics hardware directly. Instead, GDI interacts with device drivers on behalf of applications.

What is the meaning of GDI? ›

gross domestic income in British English. (ɡrəʊs dəˈmɛstɪk ˈɪnkʌm ) noun. another name for gross domestic product.

What is GDI malware? ›

GDI Malware. Definition. GDI malware is a type of malware that utilizes the Windows Graphics Device Interface (GDI) to perform various visual actions on a computer system. It can display shapes, change screen colors, or show text using the GDI functionality.

What is the purpose of Gdiplus DLL? ›

dll is an important component as it contains multiple libraries that support the "GDI Window manager" in "Microsoft Windows" operating systems. Gdiplus. dll makes two-dimensional drawing easier and it enables anti-aliasing, gradient shading and intrinsic support for modern graphic files such as JPEG and PNG-files.

What version of Windows does the US government use? ›

Windows 365 Government | Microsoft.

Which Windows is being phased out? ›

Support for Windows 10 will end in October 2025

After 14 October 2025, Microsoft will no longer provide free software updates from Windows Update, technical assistance, or security fixes for Windows 10.

What Windows is not supported anymore? ›

The following Windows operating systems are no longer being supported by Microsoft: Windows 1.0 through 95. Windows NT 3.1 through 4.0. Windows 98 and Windows 98 SE.

How to fix gdiplus.dll missing? ›

Reinstall the Program

If the gdiplus error appears when running the program, you can choose to uninstall and reinstall it. Program reinstallation can delete the corrupted . dll file and restore it. Then, you can use the program properly.

What is GDI+ for graphics applications? ›

If you have ever asked, “What is GDI+?” it's an API designed to simplify the creation and manipulation of graphical content. GDI+ offers improved 2D graphics rendering over GDI, and better support for gradient fills, alpha blending and anti-aliasing. This results in smoother and more visually appealing graphics.

How do I get rid of Trojan virus on Windows Defender? ›

How do you remove Trojans?
  1. Step 1: Disconnect internet. Before you start removing the Trojan, make sure that you disconnect from the internet. ...
  2. Step 2: Launch antivirus program. ...
  3. Step 3: Remove Trojan in Safe Mode. ...
  4. Step 4: Perform system recovery. ...
  5. Final option: Reinstall Windows 11.
Oct 27, 2023

How do I remove a virus app from Windows? ›

From Microsoft Windows 10

On the Start menu select Settings. Select System > Apps & features. Select the antivirus program, and then select Uninstall.

How do I disable Windows malware? ›

Turn off Defender antivirus protection in Windows Security
  1. Select Start and type "Windows Security" to search for that app.
  2. Select the Windows Security app from the search results, go to Virus & threat protection, and under Virus & threat protection settings select Manage settings.
  3. Switch Real-time protection to Off.

References

Top Articles
Latest Posts
Recommended Articles
Article information

Author: Roderick King

Last Updated:

Views: 6002

Rating: 4 / 5 (51 voted)

Reviews: 90% of readers found this page helpful

Author information

Name: Roderick King

Birthday: 1997-10-09

Address: 3782 Madge Knoll, East Dudley, MA 63913

Phone: +2521695290067

Job: Customer Sales Coordinator

Hobby: Gunsmithing, Embroidery, Parkour, Kitesurfing, Rock climbing, Sand art, Beekeeping

Introduction: My name is Roderick King, I am a cute, splendid, excited, perfect, gentle, funny, vivacious person who loves writing and wants to share my knowledge and understanding with you.