Gute GUI Programmierung



  • Hi Leute,
    ich hab jetzt schon viel ausprobiert in meiner Programmierlaufbahn
    und ich Programmiere inzwischen recht gut mit

    Java, C++, Delphi, Assembler (nur kleinere Sachen ^^, oder C++/Delphi inline)

    Leider bin ich immer noch nicht richtig zufrieden was die GUI's betrifft:

    -C++: Total aufwändig mit Winapi (sogar über Resourcen), mit Zeichnen muss ich garnicht erst anfangen... Nur GDI und man braucht Jahre für ein halbwegs gutaussehendes Programm. MFC ist total veraltet, sonstige Lösungen sind kostenpflichtig.

    -Delphi: Programme sind 800kb groß. Eigentlich hinnehmbar, aber was ist mit 3D veranschaulichungen des zu Darstellenden? Dort ist die Syntax fast 1 zu 1 wie C++ (nur andere Syntax) mit Opengl/DirectX etc. Da kann ich ja gleich C++ nehmen, sehr aufwändig. Opengl ist veraltet.

    -Java: Flickert beim Zeichnen (das nervt extrem... Die Programme sehen gleich richtig billig aus..., den Trick mit Paint() selber deklarieren kann ich nicht machen weil ich in einen Panel zeichne und nich über das ganze Bild, jedenfalls mit Java2D). Java3D scheint ganz hinnehmbar zu sein.

    Ich brauche jetzt die optimale Lösung 😡
    Damit ich schicke GUI's mit 3d-Support (Modelle in 3D rotierbar und realistisch darstellen) relativ schnell (~3 Stunden nach Einarbeitung) machen kann.
    Ist das mit iergendendeiner Sprache/Engine möglich? Oder muss ich mir für C++ 20 Stunden allein für das GUI vornehmen? (Mit DirectX ist das extra kniffelig)

    Was ich brauche ist eine gute Engine mit der man 2D und 3D zeichnen kann, die schnell ist und sprachenbedingte "Panel" unterstützt.
    Für eine der oben genannten Sprachen (obwohl ich zu Delphi wegen der Größe ein bisschen abgeneigt bin / und weil der Compiler kommerziell ist)

    Wenn ihr mir das beantwortet seid ihr die größten!

    mfG
    euer Listing

    Für die ganz neugierigen:
    Es geht um ein Projekt für bestimmte Fahrzeuge, die dreidimensional dargestellt werden sollen (ganz simpel, Wireframe[Gittermodell]), mit Graphen über Eigenschaften etc.



  • -C++: Total aufwändig mit Winapi (sogar über Resourcen), mit Zeichnen muss ich garnicht erst anfangen... Nur GDI und man braucht Jahre für ein halbwegs gutaussehendes Programm. MFC ist total veraltet, sonstige Lösungen sind kostenpflichtig.

    Quatsch! Guck doch mal ins GUI-Forum!



  • Opengl ist veraltet.

    ⚠ Troll ⚠



  • Hallo

    Wie wär's mit c# und .net?

    chrische



  • Listing schrieb:

    -Java: Flickert beim Zeichnen (das nervt extrem... Die Programme sehen gleich richtig billig aus..., den Trick mit Paint() selber deklarieren kann ich nicht machen weil ich in einen Panel zeichne und nich über das ganze Bild, jedenfalls mit Java2D). Java3D scheint ganz hinnehmbar zu sein.

    Hi.

    Der Fehler liegt bei Dir und nicht bei Java. Zeig mir ein kleines Programm, das dieses Phänomen demonstriert und dann sag ich Dir, was Du falsch machst.



  • Nimm Python und ein GUI toolkit oder eine Grafikengine. Damit erzielste ergebnisse bereits nach 10 minuten.(3D szene etc)



  • Also für dich würde ich HTML empfehlen



  • Also ich verwende momentan folgenden Ansatz und bin sehr zufrieden:

    http://www.codeproject.com/managedcpp/OpenGLViewWinForms.asp

    Nutze für den GUI-Anteil WindowsForms (C++/CLI) und für den Rest normales C++.



  • Am "einfachsten" geht das mit Sicherheit mit WinForms und Managed DX.



  • Listing schrieb:

    -Delphi: ... Dort ist die Syntax fast 1 zu 1 wie C++ (nur andere Syntax)

    😃 👍

    Listing schrieb:

    Opengl ist veraltet.

    WTF?

    Listing schrieb:

    Ich brauche jetzt die optimale Lösung 😡

    Die gibts nicht.

    Ansonsten würde ich sagen: nimm OpenGL.

    Für den Rest deines Programmes bieten sich die folgenden Optionen mehr oder weniger an:
    - C/WinAPI
    - C++Builder oder Delphi mit VCL
    - C++/irgendein GUI-Toolkit
    - C# (wenns sein muß, auch C++/CLI)/WinForms
    - Java

    Eine Empfehlung gebe ich hierfür nicht ab, denn die gibt jeder anders; sie würde dir nichts helfen. Schau dir die Optionen an und nimm von denen, die deine Bedürftnisse erfüllen, das, womit du am effektivsten arbeiten kannst.



  • Tipp schrieb:

    Also für dich würde ich HTML empfehlen

    Hahaha

    WTF?

    Dann hab ich was falsch mitgekriegt, ich merke nur, dass immer weniger Leute OpenGl benutzen und DirectX die Oberhand gewonnen hat

    Zeig mir ein kleines Programm, das dieses Phänomen demonstriert und dann sag ich Dir, was Du falsch machst.

    Ok bittesehr:

    //private Variable der Klasse
    private Graphics2D g;
    //Graphics2D von drawPane holen
    protected void init2DGraphics()
        {
    
            g = (Graphics2D)drawPane.getGraphics(); //Only into drawing part
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
            g.setComposite(AlphaComposite.getInstance(3, 1.0F));
        }
    
    private void drawK(int x, int y) //Kugel zeichnen
        {
             g.setPaint(Color.red);
             g.drawOval(x-5, y-5, 10, 10);
             g.fillOval(x-5, y-5, 10, 10);
        }
    
    private void paintButtonActionPerformed(java.awt.event.ActionEvent evt) {
    int posX = 0;
    int posY = 50;
     while(posX < 500)
    {
      g.setPaint(drawPane.getBackground()); //Alles löschen
      g.fillRect(1, 1, drawPane.getWidth()-2, drawPane.getHeight()-2);
      drawK(posX,posY);
      ++posX;
    }
    
    }
    

    Beim Mausklick flackert es, ich muss das leider so löschen, weil der Rand sonst auch weg ist.
    Auch ein Sleep hilft nicht viel. Ich erinnere mich das auch mal mit repaint() oder so ähnlich gemacht zu haben, leider mit dem gleichen Ergebnis.

    Wie wär's mit c# und .net?

    Nimm Python und ein GUI toolkit oder eine Grafikengine. Damit erzielste ergebnisse bereits nach 10 minuten.(3D szene etc)

    Noch eine Neue Sprache??? 4 sollten doch erstmal reichen finde ich

    Am "einfachsten" geht das mit Sicherheit mit WinForms und Managed DX.

    Welche Sprache ist das?

    Quatsch! Guck doch mal ins GUI-Forum!

    Kannst du mir da was gutes ans Herz legen?

    Vielen Dank schonmal für eure hilfreichen Kommentare.
    Anscheinend ist Opengl doch nicht so schlecht!?

    mfG



  • Listing schrieb:

    sonstige Lösungen sind kostenpflichtig.

    Absolut falsch. Es gibt zig gute GUI-Libraries, die gratis sind. Schau mal ins GUI-Forum (bzw. dessen FAQ).

    Listing schrieb:

    Dann hab ich was falsch mitgekriegt, ich merke nur, dass immer weniger Leute OpenGl benutzen und DirectX die Oberhand gewonnen hat

    Hast du absolut falsch mitgekriegt. Also aerger dich nicht wenn die Leute dir HTML vorschlagen, aber du hast eben durch solche Aussagen ("alle guten GUI Libs sind kostenpflichtig", "OpenGL ist veraltert") den Eindruck erweckt, relativ unerfahren zu sein. (Ich hoff du kriegst das jetzt nicht in den falschen Hals 🙂 ).

    Listing schrieb:

    Zeig mir ein kleines Programm, das dieses Phänomen demonstriert und dann sag ich Dir, was Du falsch machst.

    Ok bittesehr:

    [... snip ...]

    Beim Mausklick flackert es, ich muss das leider so löschen, weil der Rand sonst auch weg ist.
    Auch ein Sleep hilft nicht viel. Ich erinnere mich das auch mal mit repaint() oder so ähnlich gemacht zu haben, leider mit dem gleichen Ergebnis.

    Zeichnen solltest du auch nur in der Paint-Methode (IIRC, schon lange her), und nicht im Event-Handler!

    Listing schrieb:

    Wie wär's mit c# und .net?

    Nimm Python und ein GUI toolkit oder eine Grafikengine. Damit erzielste ergebnisse bereits nach 10 minuten.(3D szene etc)

    Noch eine Neue Sprache??? 4 sollten doch erstmal reichen finde ich

    Du scheinst weder mit C++ noch Delphi oder Java zufrieden zu sein, also was bleibt uns denn uebrig 😉

    Listing schrieb:

    Am "einfachsten" geht das mit Sicherheit mit WinForms und Managed DX.

    Welche Sprache ist das?

    .NET-Sprachen, also entweder C#, C++/CLI oder VB.NET. Wobei das alles IMHO absolut nicht noetig ist, du kommst mit C++ sicher gleichschnell ans Ziel, wenn du eine ordentliche Lib gefunden hast.

    Listing schrieb:

    Quatsch! Guck doch mal ins GUI-Forum!

    Kannst du mir da was gutes ans Herz legen?

    Vielen Dank schonmal für eure hilfreichen Kommentare.
    Anscheinend ist Opengl doch nicht so schlecht!?

    Schau doch einfach ins GUI-Forum!!!!!111einhundertelf Die Frage nach "der einen GUI-Lib, sie alle zu binden" wurde bereits zwölfundfünzigmal zu Tode diskutiert. Und nein, OpenGL ist nicht so schlecht.



  • Wenn du für das mit der Paint-Methode ein Beispiel hast bin ich 100%ig zufrieden.
    Denn ich möchte das "Drawing" ja über den Knopfdruck auslösen und beeinflussen. Und die Paint methode meines "OverlayedJPane" hab ich ja nicht, die ist ja in der Klasse des Objekts auf das ich keinen Zugriff hab'

    Und wenn ich den Eindruck erwecke dass ich noch relativ unerfahren bin, stimmt das. "Ich weiß dass ich nichts weiß 😃 😃 :D"

    Vielen Dank schonmal für die Aufklärung.

    mfG



  • Blue-Tiger schrieb:

    Listing schrieb:

    sonstige Lösungen sind kostenpflichtig.

    Absolut falsch. Es gibt zig gute GUI-Libraries, die gratis sind. Schau mal ins GUI-Forum (bzw. dessen FAQ).

    (Im Gegensatz zur MFC, die kostenpflichtig ist!)



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung 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.



  • Listing schrieb:

    Wenn du für das mit der Paint-Methode ein Beispiel hast bin ich 100%ig zufrieden.
    Denn ich möchte das "Drawing" ja über den Knopfdruck auslösen und beeinflussen. Und die Paint methode meines "OverlayedJPane" hab ich ja nicht, die ist ja in der Klasse des Objekts auf das ich keinen Zugriff hab'

    Uhm, also ich hab schon seit Ewigkeiten kein Java mehr geschrieben, aber irgendwer wird mich sicher verbessern wenn ich was falsch mache:

    public class MyCanvas extends JComponent // oder von mir aus leit von JFrame ab oder was auch immer
    {
    	// diese Funktion wird VON JAVA SELBER AUFGERUFEN, sobald du das Fenster aus irgend einem Grund neu zeichnen musst
    	// (das Graphics - Objekt kann Problemlos in ein Graphics2D-Objekt gecastet werden, wenn du das brauchst
    	public void paint(Graphics g)
    	{
    		// ... hier kommt dein Gezeichne rein, z. B.
    		for (int i = 0; i < obj.length; ++i)
    			obj[i].paintYourself(g);
    	}
    
    	// der Eventhandler
    	private void paintButtonActionPerformed(java.awt.event.ActionEvent evt)
    	{
    		// die Funktion repaint() sorgt dafuer, dass Java den Fenster-inhalt leert und RUFT DANN PAINT AUF
    		repaint();
    	}
    }
    

    EDIT: sollte dein Zeichnen sehr, sehr lange dauern, kanns evtl.von Vorteil sein, wenn du dir DoubleBuffering bastelst (oder vielleicht kann Swing das jetzt von allein, ich habs mir seinerzeit selber programmiert).



  • Vielen Dank, jetzt ist alles geklärt



  • Falls es noch schneller laufen muss. Es gibt eine Klasse die ein Image als zweidimensionales Array bahandelt. Damit kannst du Animation sorgat realisieren.



  • Wenn man bei deinem Java Beispiel DoubleBuffering nicht einschalten kann, dann zeichne alles in ein Bild (dort löschen usw.) und am schluss wird nur das bild in der paint methode gezeichnet (ohne löschen). das hat bei applets funktioniert, ist aber schon ne weile her, vlt gehts jetzt auch einfacher.



  • WinApi ist dir zu kompliziert oder gefällt dir nicht ?

    hmm stimmt, aber nur wenn man vorhat sehr komplexe sachen zu Machen, Menüleisten, ownerdraw ect aber ansonsten finde ich das quasi optimal.

    Die komplexen Steuerelemente mit ownerdraw und dem Krämpel sind in C# und .Net sehr einfach -> willst du nicht lernen obwohl es nur ein kleiner Schritt von C++ bis C# ist

    DirectX gefällt mir persönlich sehr gut, verstehe nicht wo da das Problem liegt

    Fazit:
    lern die Sachen richtig, mach Basic oder lass das Programmieren sein !


Anmelden zum Antworten