Einfache Grafikausgabe

Dieses Thema im Forum "C/C++" wurde erstellt von xtian_82, 13.09.2006.

  1. #1 xtian_82, 13.09.2006
    Zuletzt bearbeitet: 14.09.2006
    xtian_82

    xtian_82 Jungspund

    Dabei seit:
    13.09.2006
    Beiträge:
    11
    Zustimmungen:
    0
    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!
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 hazelnoot, 13.09.2006
    hazelnoot

    hazelnoot www.mywm.dl.am

    Dabei seit:
    13.10.2005
    Beiträge:
    377
    Zustimmungen:
    0
    Ort:
    in Geiersberg
    nette idee
     
  4. x0r

    x0r Bitschubser

    Dabei seit:
    20.12.2005
    Beiträge:
    169
    Zustimmungen:
    0
    Ort:
    Berlin
    Fein, jetzt noch GPL-konform lizensieren und dann freigeben :)
    ...
     
  5. #4 SkydiverBS, 14.09.2006
    SkydiverBS

    SkydiverBS Tripel-As

    Dabei seit:
    15.01.2005
    Beiträge:
    207
    Zustimmungen:
    0
    Ort:
    Freising
    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
     
  6. #5 root1992, 14.09.2006
    root1992

    root1992 von IT-Lehrern besessen

    Dabei seit:
    02.01.2006
    Beiträge:
    1.138
    Zustimmungen:
    0
    Ort:
    Märchenwald
    JA, die Idee ist gut. Werds dann mal testen.
     
  7. #6 xtian_82, 14.09.2006
    xtian_82

    xtian_82 Jungspund

    Dabei seit:
    13.09.2006
    Beiträge:
    11
    Zustimmungen:
    0
    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.)

    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?
    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.
    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?
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  9. #7 hazelnoot, 14.09.2006
    hazelnoot

    hazelnoot www.mywm.dl.am

    Dabei seit:
    13.10.2005
    Beiträge:
    377
    Zustimmungen:
    0
    Ort:
    in Geiersberg
    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
     
  10. #8 xtian_82, 15.09.2006
    xtian_82

    xtian_82 Jungspund

    Dabei seit:
    13.09.2006
    Beiträge:
    11
    Zustimmungen:
    0
    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
     
Thema: Einfache Grafikausgabe
Besucher kamen mit folgenden Suchen
  1. static display linux header

    ,
  2. lcgi grafik

Die Seite wird geladen...

Einfache Grafikausgabe - Ähnliche Themen

  1. UEFI 2.5 bringt einfache BIOS/UEFI-Updates auch für Linux

    UEFI 2.5 bringt einfache BIOS/UEFI-Updates auch für Linux: Aktualisierungen des BIOS waren und sind unter Linux immer eine waghalsige Angelegenheit, wenn man nicht einen Mainboard-Hersteller erwischt, der...
  2. kinko.me-Crowdkampagne: Einfache E-Mail-Verschlüsselung

    kinko.me-Crowdkampagne: Einfache E-Mail-Verschlüsselung: Mittels einer kleinen Box plant das Berliner Unternehmen »radiospiel UG« eine einfach zu bedienende und sichere Lösung zum Versand von E-Mail zu...
  3. Kurztipp: TLP - Einfache Optimierung der Energierverwaltung für Laptops

    Kurztipp: TLP - Einfache Optimierung der Energierverwaltung für Laptops: Auf Notebooks verlangt Linux etwas mehr Aufmerksamkeit, bis das System richtig konfiguriert ist. Ein Grund dafür sind optimale...
  4. Hilfe bei einfachem Shell-Skript

    Hilfe bei einfachem Shell-Skript: Hallo, Ich bin auf der Suche nach jemandem der mir ein recht einfaches Shellskript gegen kleine Bezahlung erstellen könnte. Bei Interesse...
  5. Freies ERP IntarS zum einfachen Ausprobieren

    Freies ERP IntarS zum einfachen Ausprobieren: IntarS Unternehmenssoftware stellt sein gleichnamiges freies ERP-System jetzt als virtuelle Appliance bereit, die das Ausprobieren oder Loslegen...