GUI-Design



  • Ich bin ja - wie weiter unten zu lesen - damit beschäftigt, dass ich nen FileDialog basteln will.

    Nun überlege ich, mir vielleicht eine kleine GUI zu schreiben. Allerdings bin ich mir nicht sicher, wie das Design aussehen sollte. OOP ist sicherlich ganz sinnvoll. Ebenfalls eine zugrundeliegende Klasse, von der alle Objekte abgeleitet werden.. Aaaber welche Eigentschaften und Methoden sollte diese haben?
    Hat wer nen Ansatz?



  • hab mal als grundlegendes Objekt sowas hier genommen :

    class cGuiObject
    {
        protected:
            int             xpos, ypos
                          , width, height
                          , screenw, screenh;
            unsigned int    id, texture
                          , flags;
    
            char            color[4];
    
        public:
    
            cGuiObject      (unsigned int ID, x, y, w, h, sw, sh);
            ~cGuiObject     ();
            int draw        ();
            int move        (int x, int y);
            int size        (int w, int h);
            int flag        (int f);
            int setcolor    (char *c);
            int clicked     (int x, int y);
            int loadTexture (char *filename);
    
    }
    

    Die Flags sind zum Steuern der Textursichtbarkeit, des Blending, etc.

    Evtl. sollte ich noch ne Möglichkeit schaffen, Kindobjete zu erstellen?



  • kindobjekte finde ich dann ganz praktisch, wenn man vorhat z.b. ein fenster zu erstellen, darauf einen button zu haben (welcher natürlich nur innerhalb des fenster sichtbar ist, fall er außerhalb liegt ist er daktiviert oder so) und darauf dann eine draw-liste aufstellen will, d.h., dass man nur noch das fenster sichbar machen muss und alles an kindobjekten (der button) wird mitgezeichnet/verwaltet...
    außerdem, wenn man ein fenster verschieben will, is es mühsam auch alle objekte die auf diesem fenster liegen mitzuverschieben (halt alle einzeln)...
    -> wieder so ne liste

    nur so'n gedanke ^^

    mfg



  • sieh dir mal ClanLib an, die haben schon einen kompletten Satz klassen für ein GUI unter OpenGL fertig. Ebenso Blender3D.
    Wenn du es selber machen willst, brauchst du auf jeden Fall die Möglichkeit Elemente ineinander einzubetten, dein Dialog braucht ja schließlich auch Buttons.
    Ausserdem brauchst du ein Konzept zur Nachrichtenübermittlung. Eine Möglichkeit wäre eine abstrakte Klasse "MessageChainMember" zu haben, die sowohl Nachrichten senden als auch empfangen kann, und davon deine GUI Klassen abzuleiten.

    Wenn du nur einen File Dialog haben willst, kannst du natürlich auch auf das Framework verzichten und alles hardcoden. Ist halt dann nicht modular.

    Was die Flags betrifft, solltest du wohl jede Eigenschaft deines Objektes als explizite Memberfunktion bereitstellen, nicht über ein kryptisches Flag - Interface.

    Dann wäre es sicher sinnvoll, alle Längen und Positionen nicht als feste Breite, sondern als Prozent (oder was auch immer) anzugeben und das nacher per xScale, yScale und viewport auf den Bildschirm zu mappen.

    Im Sinne der Portabilität und Eleganz sollte loadTexture ein Texturobject oä, aber kein Dateiname übergeben werden.

    int setcolor (char *c); // Aua!
    int setcolor (char r, char g, char b, char a); //oder
    int setcolor (const RgbaObject &color);
    


  • Da ich die SDL nutze hab ich mit Portabilität nicht so viele Probleme. SDL_LoadBMP, bzw LoadIMG (SDL_image) sind auf mehreren Plattformen funktionsfähig.

    Das mit den Flags macht doch aber eigentlich jeder, oder nicht?
    Wenn ich da so die WinAPI sehe, oder auch glEnable(), glDisable().
    Auf der anderen Seite sind diese Beispiele auch nicht gerade OOP...

    Beim setcolor() haste wohl recht... Ich muss mir halt meine Tippfaulheit abgewöhnen 😉

    Auf jeden Fall schau ich mir aber mal die Clanlib an. Vielleicht muss ich das Rad ja nicht neu erfinden. Momentan benötige ich zwar nur den file-dialog, aber ne vernünftige GUI kann ja von Zeit zu Zeit nicht schaden..


Anmelden zum Antworten