EasyWindow



  • Hallo,

    hier möchte ich euch mein Projekt vorstellen, welches ich erst vor kurzem begonnen habe und daher auch noch nicht sehr weit ist.
    Vorallem stelle ich es hier erst einmal vor, damit hoffentlich ein paar Interesse daran haben, mir dabei etwas zu helfen bzw. mitwirken möchten.

    EasyWindow soll eine GUI Library geben, die die WinAPI nutzt und diese in objekt-orientierter Weise viel einfacher machen soll, daher auch der Name ^^
    (also ähnlich wie wxWidgets nur bisher halt nur für Windows)

    Das Projekt habe ich mit Code::Blocks angefangen, hier ein mal ein Beispiel Bild was mit der Lib bisher möglich ist.
    Sobald ein paar Leute Interesse zeigen, lade ich die erste PreAlpha-Version hoch.

    Screenshot: http://www.hlc-games.de/projects/easywindow/EWScreenShot3.PNG

    Die Benennung der Control-Windows ist an die aus PureBASIC angelehnt, da mir diese Bezeichnungen recht gut gefallen hat.
    Vor allem ListView Controls (hier ListIconGadget) mit Internen Buttons und Comboboxen soll hier mit deutlich einfacher sein.
    Also quasi ein PropertyListView control.

    Code Beispiel:

    #include <win.h>
    
    using namespace ew; // EasyWindow namespace
    
    /* ... */
    
    IEasyWindowDevice* ewDevice = CreateEasyWindowDevice();
    
    IWindowClass* WinClass = ewDevice->CreateWindowClass("FirstClass");
    
    IWindow* Win = ewDevice->OpenWindow(
        WinClass, ewPosition(0, 0), ewDimension(400, 300), "Title"
    );
    
    IListIconGadget* Gad = Win->ListIconGadget(
        ewPosition(10, 10), ewDimension(200, 250), GAD_FULLROW | GAD_GRIDLINES
    );
    
    Gad->AddColumn("Attribute", 100);
    Gad->AddColumn("State", 90);
    
    Gad->AddItem("Name");
    Gad->AddItem("Lighting"); // z.B. für LevelEditoren mit CheckBoxen in den Items
    Gad->AddItem("Shader");
    Gad->AddItem("Column1\nColumn2"); // '\n' ist für das Trennen der Columns für die Items
    
    Gad->AddStateGadget(GADGET_CHECKBOX, 0, 1); // GadgetType, ItemNr, ColumnNr
    Gad->AddStateGadget(GADGET_CHECKBOX, 1, 1);
    Gad->AddStateGadget(GADGET_CHECKBOX, 2, 1);
    
    /* ... */
    


  • Muss man heutzutage eigentlich jeden Mist "Gadget" nennen? 😡
    An sonsten: Gute Arbeit!



  • Heute habe ich die erste Version der Lib veröffentlicht unter Sourceforge:

    http://sourceforge.net/projects/easywindow/

    Viel Spaß 😃



  • EasyWindow soll eine GUI Library geben, die die WinAPI nutzt und diese in objekt-orientierter Weise viel einfacher machen soll, daher auch der Name ^^
    (also ähnlich wie wxWidgets nur bisher halt nur für Windows)

    Im moment ist es ja eher noch eine kleine GUI im vergleich zu wxWidgets oder Qt^^
    Ich bin froh das jemand soetwas macht, es ist klein gut und übersichtlicher wie die Giganten und daher kann ich an der lib endlich sehn wie des ungefähr is damit ich wx bzw. qt besser verstehe^^

    Ich sage dazu auch nur gute Arbeit 👍
    Wie lange hast du WinAPI und C++ programmiert um das so zu beherschen?

    Mfg Wikinger75!



  • Ich finde kleine übersichtliche GUI's besser. WxWidgets ist ziemlich überdimensioniert und das Design ist auch nicht grade das beste. Ich finde bei einer GUI ein modernes und sauberes Design äußerst wichtig. Deine GUI sieht soweit ganz in Ordnung aus. Du solltest mindestens noch eine Unterstützung für Threads einbauen.



  • Hi,

    danke schon mal und freut mich, dass es euch gefällt.

    Threads will ich auch noch einbauen, das würde ich sogar Platform unabhängig hinbekommen, aber der Rest ist erst mal für X11 Lib zu kompliziert für mich.
    Begonnen habe ich das Projekt erst letzen Monat, also vor so ca. 4 Wochen.

    C++ programmiere ich jetzt schon relativ lange (jedenfalls für mein Alter von 19 Jahren ^^).
    Mit der WinAPI habe ich auch schon lange gearbeitet, aber nie so wirklich intensiv.
    Ich hatte schon mal eine GUI Lib angefangen, weil mit wxWidgets auch zu unübersichtlich war und ich das bisher nur unter Linux nutzen konnte - da gibt's das nämlich fertig kompileirt und alles 🤡
    Die war von mir aber nicht wirklich gut und nur in C Style geschrieben.

    Eigentlich arbeite ich ja immer noch an einem EgoShooter Projekt - ich weiß: ich bin größenwahnsinnig xD - dafür schreibe ich aber erst mal einen Editor.
    Beim ersten Editor habe ich ganz schön geschlammt, daher habe ich einen neuen anfangen wollen - was ich genau heute angefangen habe.
    Zuvor musste ich aber noch so eine neue GUI Lib anfangen.

    Wenn ihr euch jetzt fragt, wie ich so eine GUI Lib anfertigen konnte, ohne vorher wirklich intensiv mit der WinAPI gearbeitet zu haben, kann ich euch folgendes verraten:
    Wenn man eine Library oder ein Konzept, z.B. eine 3D Engine, besser verstehen will, ist es das Beste, selbst eine zu schreiben.
    Daber sammelt man deutlich schneller neue Erkenntnisse, da man sich mehr darüber erkundigt, man fokusiert quasi seine Arbeit auf dieses Konzept bzw. auf einen gewissen Themenbereich.

    So habe ich das mit meiner 3D Engine erlebt und jetzt auch mit der GUI Lib.
    Aber ich bin froh wenn ich schon bald nie mehr die WinAPI anrühren muss 😃

    Bla bla bla ich hab jetzt genung gequasselt ^^ viel Spaß mit dem Projekt.



  • Wenn man programmiert kann Größenwahn nie schaden ^^ . Ich schreibe meine GUI-Projekte zurzeit ausschließlich mit der WinAPI, weil ich bis jetzt noch keine Bibliothek gefunden habe die ich als würdige Alternative betrachte. Die haben wie gesagt entweder ein schlechtes Design, sind zu riesig oder sehen einfach nicht gut aus.



  • Sehr interessantes Projekt, ich suche schon seit längerem nach einer leichtgewichtigen GUI-Library à la VCL.
    Zu jedem Tool immer noch eine DLL mitzuliefern, die über hundert mal größer (wxWidgets) als das eigentliche Programm ist, kann's ja einfach nicht sein.

    Edit: wobei 800 KB natürlich auch schon recht viel sind.
    Es wäre sicher eine Überlegung wert, auf die Standard-Streamheader zu verzichten, die kosten immerhin rund 500 KB.



  • Ich stelle mir die Portierung von EasyWindow als ziemlich schwierig vor. Im Prinzip müsste man alles neu schreiben. Vielleicht solltest du versuchen, einige Dinge noch weiter zu kaspeln, so dass die Portierung später einfacher fällt.



  • Alter, ich sauge mit 100 B/s o0.

    EDIT:
    Ah, mit einem anderen Mirror gayts.



  • Wieso so viele Pointer?



  • Auch in diesem Projekt fallen doch parallelen zur Irrlicht Engine auf.
    Zum Beispiel erstellen eines Objekts über eine globale Funktion.
    Ich habe da irgendwie noch nicht verstanden warum man nicht einfach ein Objekt anlegen kann das die ganzen nötigen Initialisierungen im Konstruktor macht?!
    Ansonsten: sieht vor allem schön einfach aus... wobei, noch eine Frage: wieso ...->CreateWindowClass("...") und nicht einfach ->CreateWindow("...")? Fände ich logischer und wäre auch noch kürzer ;).



  • Weil mehrere Fenster eine Klasse nutzen können.



  • Wozu brauche ich denn die WinClass außerhalb vom Device?



  • Nanyuki schrieb:

    Edit: wobei 800 KB natürlich auch schon recht viel sind.
    Es wäre sicher eine Überlegung wert, auf die Standard-Streamheader zu verzichten, die kosten immerhin rund 500 KB.

    Wie kann man so was feststellen? Ich meine wo und wie, also Ort und Größe? Welche Tools?

    G-DC!



  • DeepCopy schrieb:

    Wie kann man so was feststellen? Ich meine wo und wie, also Ort und Größe? Welche Tools?

    Außer dem gcc brauchst du dafür nicht viel...
    Hello World mit printf: 6 KB
    Hello World mit printf und std::string: 81 KB
    Hello World mit cout: 522 KB

    Spart also 441 KB.
    Sofern man für Dateioperationen nicht die Standard-fstream-Klassen verwendet, kann man auf diese Header also getrost verzichten und stattdessen ein paar einfache Wrapper um printf bauen.



  • Sieh mal einer an! Das dass so einen gewaltigen Code-Bloat verursacht hatte ich gar nicht realisiert.

    Danke für die Info!

    G-DC!



  • Nanyuki schrieb:

    DeepCopy schrieb:

    Wie kann man so was feststellen? Ich meine wo und wie, also Ort und Größe? Welche Tools?

    Außer dem gcc brauchst du dafür nicht viel...
    Hello World mit printf: 6 KB
    Hello World mit printf und std::string: 81 KB
    Hello World mit cout: 522 KB

    Spart also 441 KB.
    Sofern man für Dateioperationen nicht die Standard-fstream-Klassen verwendet, kann man auf diese Header also getrost verzichten und stattdessen ein paar einfache Wrapper um printf bauen.

    Hello World mit VC++ 2008 (Release-Modus):

    #include <stdio.h>
    
    int main()
    {
    	char STR[] = "Hello, World!";
    
    	printf("%s\n", STR);
    
    	return 0;
    }
    

    => 7 KB

    #include <stdio.h>
    #include <string>
    
    int main()
    {
    	std::string STR = "Hello, World!";
    
    	printf("%s\n", STR.c_str());
    
    	return 0;
    }
    

    => 7,5 KB

    #include <iostream>
    #include <string>
    
    int main()
    {
    	std::string STR = "Hello, World!";
    
    	std::cout << STR << std::endl;
    
    	return 0;
    }
    

    => 8 KB

    Selbst im Debug-Modus kommt der obere Code, der nur C++ Funktionen nutzt auf 34,5 KB!

    Ich finde deine Werte also sehr mysteriös und kann mir nicht vorstellen, dass es so gewaltige Unterschiede zwischen Windows und Linux gibt (hab auf Dateigrößen nie geachtet).

    Im übrigen sollte sich C++ Code mit gcc imho gar nicht kompilieren lassen. Dazu benötigt man doch g++? 😮



  • Dummie schrieb:

    Im übrigen sollte sich C++ Code mit gcc imho gar nicht kompilieren lassen. Dazu benötigt man doch g++? 😮

    GCC ist auch der Ueberbegriff fue die "Gnu Compiler Collection", nicht nur fuer den "Gnu C Compiler". Wenn er also gcc sagt, meint er den C++ Compiler vom gcc 😉



  • Visual C++ linkt sicherlich gegen die C++ Runtime Library, deswegen die kleine Größe.
    g++ unter Linux linkt auch dynamisch, MinGW aber nicht. Keine Ahnung, ob MinGW und Microsoft-Runtime kompatibel sind. Falls es so sein sollte, wäre das natürlich praktisch.


Anmelden zum Antworten