cairomm in Windowsfenstern



  • Moin moin,
    ich bin wieder ein Neuer :p .
    Ich bin begeisterter C++Anfänger (schreibe seit 1 1/2Jahren) und habe ein kleines Problemchen mit der Headerdatei cairomm.h (oder cairo.h mit C).
    Zuhause spiele ich ein wenig damit rum (lasse Hello World im Fenster herumspringen und ähnliches) und komme an sich klar damit... unter Linux 😃
    Ich möchte damit ein kleines Schulprojekt betreiben, aber in der Schule haben wir leider nur Windows. So also meine Frage: Wie kann ich cairomm-Programme unter Windows in einem Fenster anzeigen?
    Ich habe kleine Vorschläge gefunden wie man png's abspeichern kann, aber nichts darüber, wie man etwas auf dem Monitor darstellen kann.

    Wo ich auch grade schon dabei bin, ganz perfekt läuft es nun auch wieder nicht.
    Das Angezeigte wird via whileSchleife permanent erneuert, wodurch ich einen Animationseffekt erziele. Allerdings sind heutzutage die Rechner doch ein wenig schneller, sodass die Position von "Hello World" schneller berechnet wird als sie angezeigt werden kann.
    Meine Lösung dazu wäre: einige Sekunden warten, sodass das ganze richtig kontrolliert werden kann.
    Funktionen dazu wären sleep(), usleep() /*leider wieder nur unter Linux*/ und nanosleep(). Leider funktioniert keine davon so wie ich es haben möchte.
    Das was dabei herauskommt sieht in etwa so aus, als würde ich ein Spiel auf einem viel zu langsamen Rechner spielen. (Also es wird ca. 1fps angezeigt von 400 die berechnet wurden. Konnte ich mittels Zähler überprüfen)

    Achja, ich habe cairo gewählt, weil ich gesehen habe, dass es auf verschiedenen Plattformen funktioniert. Falls es noch andere (bessere) Möglichkeiten gibt, nehme ich die gerne an 😃

    Kann mir da einer helfen?
    Danke schonmal 🙂

    //Btw: jep, ich habe bereits die Suche im Forum genutzt 😃



  • Du solltest das Verschieben des Textes am Besten im Paint-Zweig durchführen. Du löscht (überzeichnest) nur die alte Position des Textes und gibst ihn dann an der neuen Position aus. Außerdem kannst du noch die Zeit messen und die Verschiebung so gestalten, dass sie pro Sekunde zum Beispiel 50 Pixel beträgt. So sind die Ausgaben, unabhängig von der Schnelligkeit des Rechners, immer etwa die Gleichen. Anschließend löst du ein Neuzeichnen des Fensters aus, und zwar nur an der aktuellen sowie an der Position des nächsten Frames.
    Ach ja, unter Windows gibt es die Sleep()-Funktion.
    Cairo gibt es hier (http://blog.thepimp.net/misc/cairowin32/) für Windows. Ich kenne es aber nicht.
    Für Windows kannst du generell Visual Studio 2010 Express verwenden. Wenn du ein neues Win32-Projekt startest, wird dir die meiste Arbeit für dein Projekt (Fenster erstellen etc.) schon abgenommen.



  • Einfacher als Überzeichnen und Neuzeichnen ist es wohl, den Text in einem Windows-Control (zB static) darzustellen, und dann einfach das Control zu verschieben.



  • Ja, danke schonmal für die Antworten 🙂

    Also wie schon gesagt, die sleep()-funktion will nicht so ganz wie ich es möchte, also im endeffekt kommt dabei kein Warten, sondern ein Nicht-anzeigen. Sprich: Das Fenster bleibt schwarz und nur manchmal flackert der Text auf.

    Wie ihr beiden das jetzt genau meint mit dem einfachen überschreiben weiß ich nicht, aber ich poste einfach mal meinen Quelltext, vielleicht seht ihr daran wo es hackt.

    //hello.cpp
    #include <X11/Xlib.h>
    #include <cairo.h> 
    #include <stdio.h>
    #include <cairo-xlib.h>
    #include <stdlib.h>
    #include <string>
    #include <iostream>
    #include "bounce.cpp"
    
     int main()
     {
    	bounce Bouncy_text;
    	Bouncy_text.base();
     	return 0;
     }
    
    //bounce.cpp
    #define SIZEX 600
    #define SIZEY 100
    
    //Bounceklasse--------------------------------------------------------------------------------
    class bounce
    {
        Display *dpy;
        Window rootwin;
        Window win;
        XEvent e;
        int scr, y;
        cairo_surface_t *cs;
        cairo_t *c;
        char y_label[100];
        int unsigned frames;
        float zeit;
    
    public:
        bounce(void);
        void base();
        void draw();
    };
    
    //Konstruktor------
    bounce::bounce()
    {
        zeit = -1;
        frames = 0;
    }
    
    //Basismethode /Bereitet das Fenster vor und ruft die Zeichenfunktion auf
    void bounce::base()
    {
    
        dpy = XOpenDisplay(NULL);
    
        scr  =DefaultScreen(dpy);
        rootwin = RootWindow(dpy, scr);
    
        win = XCreateSimpleWindow(dpy, rootwin, 1, 1, SIZEX, SIZEY, 0, 
                BlackPixel(dpy, scr), BlackPixel(dpy, scr));
    
        XStoreName(dpy, win, "Bouncy");
        XSelectInput(dpy, win, ExposureMask|ButtonPressMask);
        XMapWindow(dpy, win);
        cs=cairo_xlib_surface_create(dpy, win, DefaultVisual(dpy, 0), SIZEX, SIZEY);
        while(1) {
    
            XNextEvent(dpy, &e); /*<----------------------------------------*/
            /*Hier ist der Punkt an dem die Zeitfunktion eingesetzt werden soll.
            Momentan ist hier die Funktion XNextEvent() drin die auf Mausklick oder
            Scrollrad wartet. Die dürfte auch bei Windows nicht funktionieren, da
            es eine X11 Funktion ist*/
    
            bounce::draw(); 
        }
    
        cairo_surface_destroy(cs);
        XCloseDisplay(dpy);
    }
    
    //Zeichenmethode /bringt den Text an den Schirm und berechnet die Position
    void bounce::draw()
    {
        if(zeit >= 18) {zeit = 0;}
        zeit += 0.1;
        frames += 1;
        y = (zeit-9)*(zeit-9); //Einfache Parabelfunktion um die Gravitation zu steuern :D
    
        c=cairo_create(cs);
        cairo_rectangle(c, 0.0, 0.0, SIZEX, SIZEY);
        cairo_set_source_rgb(c, 0.0, 0.0, 0.0);
        cairo_fill(c);
    
        cairo_move_to(c, 250.0, 10.0 + y);
        cairo_set_source_rgb(c, 1.0, 1.0, 1.0);
        cairo_show_text(c, "Hello World");
    
        cairo_show_page(c);
        cairo_destroy(c);
    }
    

    Ich nutze auch Visual C++ 2010, aber wie kann ich ein cairo_surface für eine WindowsForm erstellen?
    Könnt ihr vielleicht n' Beispiel geben?

    Übrigens, ich mus gestehen, ich hab mir ein C Howto abgeguckt 🙄



  • XNextEvent(dpy, &e); /*<----------------------------------------*/
            /*Hier ist der Punkt an dem die Zeitfunktion eingesetzt werden soll.
            Momentan ist hier die Funktion XNextEvent() drin die auf Mausklick oder
            Scrollrad wartet. Die dürfte auch bei Windows nicht funktionieren, da
            es eine X11 Funktion ist*/
    

    naja - du hasts doch so gar schon richtig hingeschrieben...
    wo liegt denn jz das problem mit Sleep ?

    bb

    PS:
    In deinem Code sind im Übrigen noch mehrere (zum Teil grobe) Schnitzer.. Hab aber gerade weder Lust noch Zeit alles ausführlich zu kommentieren.
    Aber in Kruzfassung: Standard Header haben keine endung. Man includiert keine source-dateien - niemals die implementierung einer klasse in eine source-datei packen, wenn sie für andere sichtbar/nutzbar sein soll, für konstanten nimmt man konstante werte und keine makros im scope einer member-fkt muss man den klassennamen beim aufruf anderer member-fkt nicht mitschreiben, initialisierungsliste nutzen...
    allg. ist deine bounce-klasse zumindest ein wenig eigenartig...^^



  • Ja, ist mir klar, bin kein Pro 😃

    Zu der sleepfunktion: Wie ich bereits sagte, wird das ganze nicht so ausgegeben wie es soll.

    Was ich mir vorstelle mit der sleepfunktion:
    Das Bild wird alle 0.1 Sekunden neu gemalt, sodass das ganze flüssig verläuft.

    Was mit der sleepfunktion passiert:
    Jede halbe sekunde blitzt kurz der Text auf und ist danach wieder verschwunden. Selbst der Pfad den ich mir vorstelle (hoch, runter, hoch, runter...) wird nicht eingehalten, statt dessen blinkt der Text an beliebigen Stellen auf und der Zähler der bei jedem Schritt um 1 hochzählt (Zeile 68) erhöht sich unregelmäßig nach jedem aufblitzen auf ein hundertfaches (457, 863, 1169...), was bedeutet, dass er im hintergrund mehr macht als er anzeigt.

    Auch die Wartezeit hab ich bereits geändert, aber das bewirkt nur dasselbe entsprechend langsamer oder schneller.
    recht unschön...

    Danke für die anderen Tipps 😉



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum Andere GUIs - Qt, GTK+, wxWidgets verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Zu der sleepfunktion: Wie ich bereits sagte, wird das ganze nicht so ausgegeben wie es soll.

    nicht, dass es nützlich wäre, wenn du hier endlich mal sagst, was genau passiert und nicht nur "geht anders, als ich wollte"

    ~~



  • curious_husky schrieb:

    Was mit der sleepfunktion passiert:
    Jede halbe sekunde blitzt kurz der Text auf und ist danach wieder verschwunden. Selbst der Pfad den ich mir vorstelle (hoch, runter, hoch, runter...) wird nicht eingehalten, statt dessen blinkt der Text an beliebigen Stellen auf und der Zähler der bei jedem Schritt um 1 hochzählt (Zeile 68) erhöht sich unregelmäßig nach jedem aufblitzen auf ein hundertfaches (457, 863, 1169...), was bedeutet, dass er im hintergrund mehr macht als er anzeigt.

    Auch die Wartezeit hab ich bereits geändert, aber das bewirkt nur dasselbe entsprechend langsamer oder schneller.

    Sry, aber ich weiß nicht, wie genauer ich das beschreiben soll...



  • also: ich sehe in deinem code-beispiel NIRGENDWO ein Sleep...
    also kann ich auch nicht sagen, wo du die zeit ändern willst - da kann ich jetzt nur rumraten - und das wird dir genau so wenig bringen...

    dein problem hört sich jedenfalls danach an, als ob du eben kein sleep genommen hättest.

    dein kommentar im code und der anfangspost an sich lässt aber darauf schließen, dass du wüsstest, wo du Sleep aufrufen musst...

    wenn du genau den hier geposteten code genommen hast, sehe ich nicht, wo du sleep aufrufst - und du brauchst dich nicht wundern...



  • ....ok, ok...stop...

    Also, ich beschreibe mal was ich möchte und hätte gerne gewußt ob ich evtl. auf dem Holzweg bin:

    Ich möchte mich an 2D Grafik-Animation herantasten und ein Programm schreiben in dem ein Text z.B.'hüpft'. Als Toolkit habe ich mir cairomm ausgesucht um Platformunabhängig zu bleiben (zu Hause gerne ubuntu/ in der Schule Windows).

    Ich bin erst blutiger Anfänger was die Fensterprogrammierung angeht und habe daher auf ein HowTo zurückgegriffen.

    Nun mal vor Allem: habe ich mir das richtige Toolkit ausgesuch, oder sollte ich ein Anderes nutzen, welche einfacher zu handhaben ist?

    Danke für die Geduld 🙂



  • Ich würde keine C-Bibliothek nehmen und von Anfang an eine Bibliothek die vom Betriebsystem und den OS Bibliotheken abstrahiert. Also kein X11 und kein win32.

    Was auch immer du konkret machen willst. In Qt wäre das mit einen QWidget und einem QPainter lösbar. Prinzipiell auch mit openGL wenn notwendig.

    Und du musst dich garantiert nicht mit weiteren Toolkits oder Biliotheken herumschlagen. Da Qt aber konsequent auf C++ aufbaut sollte man das hinreichend kennen. (Der Code von dir ist sehr C typisch)

    Hier ein paar Links:
    http://doc.qt.nokia.com/4.6/qpainter.html#details
    http://doc.qt.nokia.com/4.6/painting-basicdrawing.html



  • #include <X11/Xlib.h>
    

    Das wird unter Windows nicht so einfach funktionieren (X11=unix).

    Cairomm verwendet man daher besser zusammen mit Gtkmm, dann kannst du auch Fenster (und alles andere) plattformunabhängig erstellen.

    Beispielcode: siehe Gtkmm-Dokumentation



  • Hm, das mit dem Qt hört sich sehr gut an, wenn es auch auf Windows zu kopilieren ist. Es scheint sogar einfacher zu sein 😃 (Ich wollte es anfangs nicht nutzen, weil mein Lehrer versucht hat es mir anzuschwätzen xD)
    Ich werde mir das mal angucken 🙂

    @gtkmm:
    Dass X11 auf Windows nicht läuft, war mir bereits klar.
    Warum soll ich aber gtkmm nutzen? Ich brauche nur ein Fenster in dem das ganze dargestellt wird, aber keine Oberfläche mit Schaltflächen o.ä..
    (Davon abgesehen, dass es extremst nevig ist die verdammten Libarys runterzuladen und einzubinden mit VC++ :D)

    @unskilled:
    Jetzt sehe ich endlich wo wir aneinander vorbeigeredet haben: Das Problem das ich beschrieben habe tritt auf, sobald ich XNextEvent() durch sleep() ersetze. XNextEvent habe ich nur genutzt, damit ich jeden einzelnen Frame mit der Maus steuern kann (was ich aber nicht möchte :D). Aber ist ja nicht mehr wichtig, wenn ich mach mal an Qt heranwage 😉

    Thanks an alle 🙂



  • curious_husky schrieb:

    Hm, das mit dem Qt hört sich sehr gut an, wenn es auch auf Windows zu kopilieren ist.

    Du brauchst dir nur das Windows SDK installieren. Dann hast du QT + Compiler + IDE alles installiert.

    http://qt.nokia.com/downloads/sdk-windows-cpp



  • Qt ist ebenfalls ein Toolkit für eine "Oberfläche mit Schaltflächen", es benutzt aber kein normales C++ (modifizierte Sprache, vermeiden der Standardlibs/STL - also auch kein boost) und vom Coding Stil her ähnelt es eher Java wie C++ (meine Meinung).

    Allerdings ist Qt unter Windows etwas schicker und vermutlich einfacher zu installieren. Für welches Toolkit du dich auch entscheidest; Im Prinzip sind beide für dein Projekt überdimensioniert.



  • gtkmm schrieb:

    Qt ist ebenfalls ein Toolkit für eine "Oberfläche mit Schaltflächen", es benutzt aber kein normales C++ (modifizierte Sprache, vermeiden der Standardlibs/STL - also auch kein boost) und vom Coding Stil her ähnelt es eher Java wie C++ (meine Meinung).

    Da ist ja fast alles an Qt Verunglimpfung (bashing) vereint was man so finden kann...

    Qt kann mit C++ Compiler kompiliert werden, also ist es C++.
    Es nutzt intern kein STL verbietet den Nutzen aber in keine Weise. Aus den gleichen Gründen verwendet es intern auch kein boost, weil Qt grundsätzlich Abhängigkeiten versucht zu vermeiden, aber natürlich kann man boost verwenden.

    Und die Schreibweise hat wenig mit den Sprachkonstrukten zu tun. Falls Qt einige Implementierungen auch von Java abgekuckt hat, muss das nicht automatisch schlecht sein. Mal abgesehen davon das es nicht _den_ C++ Stil gibt.

    Ich persönlich habe die Erfahrung mit Studenten gemacht, das Oberflächenprogrammierung von Qt, bei grundlegenden C++ Kenntnissen relativ schnell erlernbar ist.



  • Ich sehe zwischen C(++) und Jave eigentlich kaum einen unterschied in der Syntax. Wenn es aber mehr Java als C++ ähnelt... warum ist das dann speziell für C++ kommt mir dann so die Frage.....
    Wie auch immer. Auf die Schaltflächen etc. wollte ich gar nicht eingehen, denn ich hatte eigentlich nur vor eine kleine Demo zu schreiben mit Vektorgrafiken, Scrolltexten, ... ähnlich wie damals: Red-Sector AMIGA Megademo und da kommt mir das QPainter von Qt ziemlich entgegen. Und wenn es für Windows sogar ein eigenes SDK gibt, steht meinem Vorhaben nichts mehr im Wege und ist keinem Fall überdimensioniert. Aber Gtkmm dem VC++ beizubringen ist schon die Hölle 😃
    Mit dem SDK sieht das bei Qt hoffentlich anders aus 😉

    So, nun muss ich vorher noch ein Pac-Man für die Konsole schreiben. (Na das wird ja noch lustig...)
    Aber soweit ist mir schonmal geholfen worden 🙂 (@pospiech: thx für den Link 😉 )



  • Qt bringt den QtCreator als IDE mit und mingw als Compiler. Du kannst aber trotzdem den VS Compiler nutzen. Wenn du VS als IDE benutzen willst brauchst du noch das Qt Addin dafür. Geht allerdings nicht mit der Express Version.



  • Ööhm... wenn ich mir so überlege:
    1)VC++ istellieren (weil Windows neu istalliert)
    Qt drauf, Addins, eventuellen Ärger und/oder arbeit (=Zeit)

    VS.

    2)Qt SDK installieren - fertig...

    Ne, ich nehme lieber deinen ersten Vorschlag ( 2) ) (Davon abgesehen, dass ich nur die VC Express version habe) 😃


Anmelden zum Antworten