Einfache Grafikausgabe

X

xtian_82

Jungspund
Hi, habe mir mal ein kleines Programm überlegt, mit dem man die Grafikausgabe erheblich vereinfachen kann. Wollte mal hören, was ihr davon haltet...
Also, man bindet die Datei einfach mit
Code:
#include "Grafik.h"
in seinem Programm ein und kann dann mit
Code:
create_window(int width, int height)
das Fenster starten. Zum drauf zeichnen nimmt man einfach
Code:
draw_point(int x, int y)
bzw.
Code:
draw_line(int x1, int y1, int x2, int y2)
.
Naja, die Event-Behandlung habe ich mal bewusst aussen vor gelassen. Beendet wird das Fenster mit
Code:
close_window()
, wobei das Fenster erst dann wirklich geschlossen wird, wenn es einmal angeklickt wurde. Fertig.
Ist gedacht um schnell mal was zu zeichnen ohne irgendwelche Events oder so abzufragen. Interaktionen gehen also nur über die Standardeingabe.

Hier die eigentliche "Header"-Datei Grafik.h:
Code:
/* Grafik.h */
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <unistd.h>

/* Funktionsprototypen */
static int create_window (int w, int h);
static void close_window (void);
static void draw_point(int x, int y);
static void draw_line(int x1, int y1, int x2, int y2);

/* Globale Variablen */
static unsigned int width, height;
static Display *display;
static int screen;
static int depth;
static Window win;
static GC mygc;

/* erzeugt ein Fenster zum Reinzeichnen */
static int create_window (int w, int h) {
	width=w;
	height=h;
  char *window_name = "Grafik-Fenster";
  char *icon_name   = "Grafik";
  static XSizeHints size_hints;
  Window rootwin;
	
  /* X-Sitzung öffnen */
  display = XOpenDisplay (NULL);
  /* Fehlerüberprüfung */
  if (display == NULL) {
    printf ("Keine Verbindung zum X-Server!\n");
    exit(EXIT_FAILURE);
  }
  screen = XDefaultScreen (display);
  depth = XDefaultDepth (display, screen);
  rootwin = RootWindow (display, screen);
  win = XCreateSimpleWindow ( display, rootwin, 100, 100, width, height, 5, BlackPixel (display, screen), WhitePixel (display, screen));
  size_hints.flags = PSize | PMinSize | PMaxSize;
  size_hints.min_width =  width;
  size_hints.max_width =  width;
  size_hints.min_height = height;
  size_hints.max_height = height;
  XSetStandardProperties ( display, win, window_name, icon_name, None, 0, 0, &size_hints );
  XSelectInput ( display, win, ButtonPressMask );
  XMapWindow (display, win);
	unsigned long black, white;
	XMapRaised(display,win);
  black = BlackPixel (display, screen);
  white = WhitePixel (display, screen);
  mygc = XCreateGC (display, win, 0, 0);
  XSetForeground (display, mygc, black);
  XSetBackground (display, mygc, white);
  XClearWindow(display, win);
  return 1;
}

/* schließt Fenster, aber erst nachdem reingeklickt wurde */
static void close_window (void) {
	XFlush(display);
  while (XPending (display) == 0)
		sleep(1); // um den Prozessor ein wenig zu entlasten!
  XFreeGC (display, mygc);
  XCloseDisplay (display);
}

static void draw_point(int x, int y) {
	if ( x>=0 && x < width && y >= 0 && y < height ) {
	XFlush (display);
  XDrawPoint (display, win, mygc, x, y);
	}
}

static void draw_line(int x1, int y1, int x2, int y2) {
	XFlush (display);
	XDrawLine (display, win, mygc, x1, y1, x2, y2);
}

Achso, das ganze braucht natürlich die Xlib und wegen dem Sleep die unistd.h.

Edit: Also "-L/usr/X11R6/lib -lX11" nicht vergessen!
 
Zuletzt bearbeitet:
Fein, jetzt noch GPL-konform lizensieren und dann freigeben :)
...
 
Hallo!

Mal abgesehen davon das es kein guter Stil ist Code in eine Header-Datei zu schreiben ist es eine interessante Idee. Vor allem fuer Programmieranfaenger geeignet.

Wie waere es statt der Xlib das ganze auf OpenGL aufzubauen? Dann koennten man es z.B. auch unter Windows benutzen und das sleep() weglassen. Allerdings braucht man dann halt die OpenGL-Library und -Header.

Wie x0r schon sagte: stell es unter eine Free/Open Source Software Lizenz und vielleicht entwickelt sich daraus ja etwas :) !

Gruss,
Philip
 
JA, die Idee ist gut. Werds dann mal testen.
 
Erstmal Danke für die ganzen Antworten.
Nochmal eine Frage ganz am Anfang: Meint ihr es gibt wirklich Bedarf an solch einer Bibliothek?
Also, ich habe mir das mehr oder weniger aus der Not raus gebastelt (deswegen ist es auch noch gar nicht ausgereift), weil ich gemerkt habe wie kompliziert es doch ist auch nur ein ganz billiges Fenster mit grafischer Ausgabe zu erzeugen, was man doch öfter mal brauchen kann.
Gibt es da nicht villeicht schon andere Projekte? (Ich habe auf meiner Suche im Netz nichts gefunden.)

SkydiverBS schrieb:
Mal abgesehen davon das es kein guter Stil ist Code in eine Header-Datei zu schreiben ist es eine interessante Idee. Vor allem fuer Programmieranfaenger geeignet.
Da hast du ja vollkommen recht und genau deswegen stelle ich es auch zur Diskussion. Danke hierfür!
Allerdings habe ich gedacht, dass ich es Anfängern leichter mache, wenn sie nur eine Datei grade mal ins Verzeichnis kopieren müssen und gut ist. Also, du meinst ich soll den Code lieber in Grafik.c auslagern, wie sich's eigentlich gehört?
xOr schrieb:
Fein, jetzt noch GPL-konform lizensieren und dann freigeben
Meint ihr wirklich, dass das lohnt? Außerdem weiß ich gar nicht wie das genau geht und was ich beachten muss - okay, da könnte ich mich ja erkundigen.
SkydiverBS schrieb:
Wie waere es statt der Xlib das ganze auf OpenGL aufzubauen? Dann koennten man es z.B. auch unter Windows benutzen und das sleep() weglassen. Allerdings braucht man dann halt die OpenGL-Library und -Header.
Ich hatte da eher an SDL gedacht (damit geht ja OpenGL auch). Der Vorteil wäre ganz klar, dass es dann platformunabhängig wäre. Der Nachteil dabei: Die Xlib ist auf jedem System was X11 hat, SDL und OpenGL nicht, oder liege ich da falsch?
Was haltet ihr für vernünftiger?
 
hi!

also es gibt in der tat schon so ein aehnliches projekt einfach grafische sachen auf den screen zaubern zu koennen: http://www2.efi.fh-nuernberg.de/~herold/Download/LCGI/

diese lib ist dazu ausgelegt einfach pixel linien kreise usw auf den bildschirm zu zeichen sogar einfacher text is moeglich.

zeichnen eines pixels:
Code:
#include <graphics.h>

int main(int argc, char *argv[]){
   initgraph(640, 480);

   while(1){
     cleardevice(WHITE);
     putpixel(20, 20, BLUE);
   }
  
   closegraph();
}

will dir ja jetzt deine illusionen nicht rauben aber diese lib kann genau das was du da gemacht hast ausserdem hat sie den vorteil dass sie auf qt aufbaut und daher auch unter windows funkt.

mfg hazelnoot
 
hazelnoot schrieb:
will dir ja jetzt deine illusionen nicht rauben aber diese lib kann genau das was du da gemacht hast ausserdem hat sie den vorteil dass sie auf qt aufbaut und daher auch unter windows funkt.
Hey, das ist ja super! Nein, du verdirbst mir damit gar nichts, im Gegenteil, jetzt habe ich im Prinzip genau das was ich gesucht habe.

Also, nochmal vielen Dank!

Christian
 

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

Aufgabe in C

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

NagiosGrapher 1.7.1 funktioniert nicht

windows schneller als linux stdlib ...

Zurück
Oben