GrafClient / GrafServer für Konsolenanwendungen unter C++ (Vers. 2.1) Zielsetzung: Es sollte eine Möglichkeit geschaffen werden, in einfachen C++-Programmen (Konsolenanwendungen mit main()-Funktion) Grafiken auszugeben. Umsetzung: Leider erwies sich die Einbindung einer Grafik-Bibliothek in Konsolenanwendungen als problematisch. Deshalb wurde ein Client-Server-Ansatz gewählt: Die Grafik wird von einem ServerProgramm (unter Java entwickelt) dargestellt (GrafServer). Die Konsolenanwendung enthält einen GrafikClient, der der Einfachheit halber als cpp-Datei mit #include eingebunden wird (GrafClient). Der Client stellt die Verbindung zum Server her und kann dann Grafik-Befehle an diesen schicken. Installation: Für die Verwendung des Grafik-Servers ist eine Installation von Java (JDK oder JRE) Voraussetzung (auf diese soll hier nicht eingegangen werden). Das GrafServer-Programm liegt seit Version 2.0 als ausführbares Java-Archiv (jar-Datei) vor. Man benötigt nur die Datei GrafServer.jar. Zum Starten des GrafServers sollte es genügen, eine Verknüpfung auf GrafServer.jar zu erstellen, die man auf dem Desktop platziert. Falls dies nicht funktioniert, kann man eine Batch-Datei oder eine Verknüpfung mit der Kommandozeile: java –jar GrafServer.jar erstellen. Falls der java-Befehl nicht gefunden wird, kann man auch explizit den Pfad angeben: Pfad der Java-Installation/bin/java.exe –jar GrafServer.jar Für den Grafik-Client kopiert man die Datei GrafClient.cpp in das include-Verzeichnis des C++-Compilers. Verwendung von GrafClient / GrafServer: Um in einer Konsolenanwendung unter Borland C++-Builder, Dev-C++ oder Visual C++ eine Grafikausgabe zu erzeugen, bindet man als include-Datei den Grafik-Client ein: #include <GrafClient.cpp> Bei Visual C++ muss man unter Projekteigenschaften ( Konfigurationseigenschaften Linker Eingabe) bei "Zusätzliche Abhängigkeiten" Ws2_32.lib angeben. Bei Dev-C++ muss man bei den Projekt-Optionen (Tab Parameter) als Kommandozeilenoption für den Linker -lwsock32 angeben (rechts bei Linker eintragen). Es können dann in der Konsolenanwendung die nachfolgenden Grafik-Funktionen aufgerufen werden. Bevor das C++-Programm gestartet wird, muss allerdings der Grafik-Server durch Aufruf von GrafServer.jar gestartet werden. Die wichtigsten Grafik-Funktionen: Die Namen der Grafik-Funktionen in der folgenden Tabelle von drawLine bis setFont entsprechen denen in der Programmiersprache Java, in der auch der Grafik-Server geschrieben wurde. Dies erleichtert einen eventuellen späteren Umstieg auf Java, das, im Unterschied zu C++, die Grafik-Fähigkeit bereits im Sprach-Standard enthält. In der Tabelle sind alle Koordinaten in PixelEinheiten, die x-Koordinate geht von links nach rechts, die y-Koordinate von oben nach unten. Der Zusatz 2.1 weist darauf hin dass diese Funktion erst ab GrafServer-Version 2.1 verfügbar ist. Funktionsaufruf Beschreibung startClient (); oder startClient (hoehe, breite); Muss zu Beginn aufgerufen werden, um die Kommunikation zwischen Client und Server herzustellen. Öffnet ein Grafik-Display. Die erste Form verwendet Standardwerte für Breite und Höhe der Zeichenfläche, bei der zweiten werden diese explizit angegeben. endClient (); Muss am Ende aufgerufen werden, um die Kommunikation zu beenden. setSize (hoehe, breite); Ändert die Größe des Grafik-Displays. setTitle (titel); Ändert den Titel des Grafik-Displays. clear (); Löscht die gesamte Zeichenfläche. drawLine (x1, y1, x2, y2); Zeichnet eine Linie vom Punkt (x1, y1) zum Punkt (x2, y2). drawRect (x, y, w, h); Zeichnet ein Rechteck mit linker oberer Ecke (x, y), Breite w und Höhe h. fillRect (x, y, w, h); Wie drawRect, aber gefüllt. drawOval (x, y, w, h); Zeichnet eine Ellipse, die in einem Rechteck mit linker oberer Ecke (x, y), Breite w und Höhe h sitzt. fillOval (x, y, w, h); Wie drawOval, aber gefüllt. drawPolyline (ax, ay, n); Zeichnet einen Linienzug. Die x-Koordinaten stehen im int-Array ax, die yKoordinaten im int-Array ay, n ist die Anzahl der zu verbindenden Punkte. drawPolygon (ax, ay, n); Zeichnet einen geschlossenen Linienzug (Polygon). Der letzte Punkt wird mit dem ersten verbunden. Parameter wie bei drawPolyline. fillPolygon (ax, ay, n); Wie drawPolygon, aber gefüllt. drawBezier (x1, y1, x2, y2, x3, y3, x4, y4); Zeichnet eine gekrümmte Kurve, eine so genannte Bézier-Kurve dritter Ordnung. Anfangspunkt ist (x1, y1), Endpunkt ist (x4, y4). Die Punkte (x2, y2) und (x3, y3) steuern die Tangenten der Bézier-Kurve im Anfangsund Endpunkt. Die Koordinaten können als double-Werte angegeben werden. drawString (text, x, y); Zeichnet den in der Zeichenkette text enthaltenen Text (z. B. “Hallo!“). Der Punkt (x, y) gibt das linke Ende der Grundlinie des Textes an. setColor (r, g, b); Wählt eine Farbe zum Zeichnen. r, g, und b sind der Rot-, Grün- und Blauanteil. Sie liegen zwischen 0 und 255. Beispiele: setColor (0, 0, 0): schwarz, setColor (255, 255, 255): weiß, setColor (0, 255, 0): grün. setStroke (dicke); Wählt die Strichdicke (in Pixeln) zum Zeichnen. setFont (name, style, size); Wählt einen Font (Schriftart), der bei drawString verwendet wird. name ist der Fontname (z. B. “Arial“), style steht für PLAIN (normal), BOLD (fett) oder ITALIC (kursiv) und size ist die Schriftgröße. Auch die Kombination BOLD + ITALIC ist möglich. setClip (x, y, w, h); 2.1 Schränkt die nachfolgenden Zeichenoperationen auf einen rechteckigen Bereich mit linker oberer Ecke (x, y), Breite w und Höhe h ein (so genanntes Clipping). resetClip (); 2.1 Beendet das durch setClip eingeleitete Clipping. autoPaint (true); autoPaint (false); und paint (); Standardmäßig werden alle Grafikbefehle sofort im Grafik-Display angezeigt. Mit autoPaint (false) wird diese Automatik abgeschaltet. In diesem Fall muss durch Aufruf der Funktion paint () explizit die Anzeige aufgefrischt werden. Mit autoPaint (true) wird die Automatik wieder eingeschaltet. getMouseClick (x, y); Wartet, bis mit der Maus auf die Zeichenfläche geklickt wurde. Dabei besteht ein „Klick“ aus dem Drücken und Loslassen einer Maustaste. Die Position des Mausklicks wird in den Variablen x und y abgespeichert. getMousePress (x, y); Ähnlich wie getMouseClick, reagiert aber schon auf das Drücken (ohne Loslassen) einer Maustaste. getMouseRelease (x, y); Ähnlich wie getMouseClick, wartet aber auf das Loslassen der Maustaste. mouseClicked () mousePressed () mouseReleased () 2.1 Mit diesen Funktionen kann man feststellen, ob auf die Zeichenfläche geklickt / eine Maustaste gedrückt / losgelassen wurde. Die Funktionen geben dazu true oder false zurück. getKey () 2.1 Wartet, bis eine Taste auf der Tastatur gedrückt wurde und liefert dann den ASCII-Code des entsprechenden Zeichens als int-Wert zurück. Damit dies funktioniert, muss der Fokus auf dem Grafik-Fenster liegen. keyPressed () 2.1 Mit dieser Funktion kann man feststellen, ob eine Taste auf der Tastatur gedrückt wurde. Falls ja, wird true, andernfalls false zurückgegeben. Damit dies funktioniert, muss der Fokus auf dem Grafik-Fenster liegen.