#ifndef AuswahlBox_H
#define AuswahlBox_H

#include "Array.h"
#include "Zeichnung.h"

namespace Framework
{
    class TextFeld;   //! TextFeld.h
    class VScrollBar; //! Scroll.h
    class Rahmen;     //! Rahmen.h
    class Knopf;      //! Knopf.h
    class AlphaFeld;  //! AlphaFeld.h
    class Text;       //! Tet.h
    class Schrift;    //! Schrift.h
    class TextRenderer;

    //! Eine Zeichnung des 2D GUI Frameworks. Repräsentiert eine Box, aus der
    //! der Nutzer durch ausklappen verschiedene Werte auswählen kann
    class AuswahlBox : public ZeichnungHintergrund
    {
    public:
        class Style : public ZeichnungHintergrund::Style
        {
        public:
            static const __int64 FeldRahmen
                = 0x000001000; //! Wenn dieser Flag gesetzt ist, hat jeder Wert
                               //! aus der Liste einen Rahmen
            static const __int64 FeldHintergrund
                = 0x000002000; //! Wenn dieser Flag gesetzt ist, hat jeder Wert
                               //! aus der Liste einen Hintergrund
            static const __int64 FeldHBild
                = 0x000004000; //! Wenn dieser Flag gesetzt ist, hat jeder Wert
                               //! aus der Liste ein Bild als Hintergrund
            static const __int64 FeldHAlpha
                = 0x000008000; //! Wenn dieser Flag gesetzt ist, hat jeder Wert
                               //! aus der Liste einen Transparenten Hintergrund
            static const __int64 FeldBuffer
                = 0x000010000; //! Wenn dieser Flag gesetzt ist, hat jeder Wert
                               //! aus der Liste einen Farbübergang
            static const __int64 AuswahlHintergrund
                = 0x000020000; //! Wenn dieser Flag gesetzt ist, bekommt der
                               //! Wert, der gerade ausgewählt ist einen
                               //! Hintergrund
            static const __int64 AuswahlHBild
                = 0x000040000; //! Wenn dieser Flag gesetzt ist, bekommt der
                               //! Wert, der gerade ausgewählt ist ein
                               //! Hintergrundbild
            static const __int64 AuswahlHAlpha
                = 0x000080000; //! Wenn dieser Flag gesetzt ist, bekommt der
                               //! Wert, der gerade ausgewählt ist einen
                               //! transparenten Hintergrund
            static const __int64 AuswahlBuffer
                = 0x000100000; //! Wenn dieser Flag gesetzt ist, bekommt der
                               //! Wert, der gerade ausgewählt ist einen
                               //! Farbübergang
            static const __int64 AuswahlRahmen
                = 0x000200000; //! Wenn dieser Flag gesetzt ist, bekommt der
                               //! Wert, der gerade ausgewählt ist einen Rahmen
            static const __int64 MultiStyled
                = 0x000400000; //! Wenn dieser Flag gesetzt ist, hat jeder Wert
                               //! seine eigenen Hintergründe unt Rahmen und
                               //! nicht alle die selben
            static const __int64 MaxHeight
                = 0x004000000; //! Legt eine maximale Höhe der ausgeklappten
                               //! Liste fest. Es erscheint automatisch eine
                               //! Scrollbar wenn mehr Elemente da sind als
                               //! sichtbar sein können
            static const __int64 MausHintergrund
                = 0x008000000; //! Wenn dieser Flag gesetzt ist, hat ein
                               //! Element, wo die Maus drau zeigt, einen
                               //! Hintergrund
            static const __int64 MausHBild
                = 0x010000000; //! Wenn dieser Flag gesetzt ist, hat ein
                               //! Element, wo die Maus drauf zeigt, ein
                               //! Hintergrundbild
            static const __int64 MausHAlpha
                = 0x020000000; //! Wenn dieser Flag gesetzt ist, hat ein
                               //! Element, wo die Maus drauf zeigt, einen
                               //! transparenten Hintergrund
            static const __int64 MausBuffer
                = 0x040000000; //! Wenn dieser Flag gesetzt ist, hat ein
                               //! Element, wo die Maus drauf zeigt, einen
                               //! Farbübergang
            static const __int64 MausRahmen
                = 0x080000000; //! Wenn dieser Flag gesetzt ist, hat ein
                               //! Element, wo die Maus drauf zeigt, einen
                               //! Rahmen
            // const int NachObenAusklappen	= 0x100000000;
            // const int AutoAusklappRichtung	= 0x200000000;

            static const __int64 Normal
                = Sichtbar | Erlaubt | Rahmen | FeldRahmen | AuswahlBuffer
                | AuswahlRahmen | MaxHeight | VScroll | MausRahmen | MausBuffer
                | Hintergrund | MEIgnoreParentInside
                | MEIgnoreVerarbeitet; //! Normaler Style: Sichtbar, Erlaubt,
                                       //! Rahmen, FeldRahmen, AuswahlBuffer,
                                       //! AuswahlRahmen, MaxHöhe, VScroll,
                                       //! MausRahmen, MausBuffer
        };

    private:
        TextRenderer* textRd;
        Array<__int64>* msStyle;
        RCArray<TextFeld>* members;
        Knopf* ausfahren;
        Rahmen* auswRahmen;
        int auswBgF;
        Bild* auswBgB;
        AlphaFeld* auswAf;
        RCArray<Rahmen>* msAuswRahmen;
        Array<int>* msAuswBgF;
        RCArray<Bild>* msAuswBgB;
        RCArray<AlphaFeld>* msAuswAf;
        Rahmen* mausRahmen;
        int mausBgF;
        Bild* mausBgB;
        AlphaFeld* mausAf;
        RCArray<Rahmen>* msMausRahmen;
        Array<int>* msMausBgF;
        RCArray<Bild>* msMausBgB;
        RCArray<AlphaFeld>* msMausAf;
        int anzahl;
        int auswahl;
        bool ausgeklappt;
        int ausklappHeight;
        int ausklapMaxHeight;
        int eintragHeight;
        double tickval;
        int mausEintrag;
        bool scrollAnzeigen;
        void* eAkP;
        std::function<void(void*, AuswahlBox*, int, int)> eAk;
        //! Verarbeitet Maus Nachrichten
        //! \param me Das Ereignis, was durch die Mauseingabe ausgelößt wurde
        DLLEXPORT void doMausEreignis(MausEreignis& me, bool userRet) override;

    public:
        //! Konstruktor
        DLLEXPORT AuswahlBox();
        //! Destruktor
        DLLEXPORT virtual ~AuswahlBox();
        //! Setzt den Parameter der Rückruffunktion, die aufgerufen wird, wenn
        //! der Benutzer ein neues element auswählt \param p Der Parameter
        DLLEXPORT void setEventParam(void* p);
        //! Setzt die Rückruffunktion, die Aufgerufen wird, wenn der Benutzer
        //! ein neues Element auswählt \param eAk Die Rückruffunktion Aufruf:
        //! eAk( parameter, this, 0, auswahlIndex )
        DLLEXPORT void setEventAktion(
            std::function<void(void*, AuswahlBox*, int, int)> event);
        //! Setzt den verwendeten TextRenderer
        //! \param textRd Der Textrenderer
        DLLEXPORT void setTextRendererZ(TextRenderer* textRd);
        //! Setzt die verwendete Schrift
        //! \param schrift Die Schrift
        DLLEXPORT void setSchriftZ(Schrift* schrift);
        //! Fügt der Liste einen auswählbaren Eintrag hinzu. Der erste Eintrag
        //! ist zu Beginn automatisch ausgewählt \param txt Der Text des
        //! Eintrags
        DLLEXPORT void addEintrag(const char* txt);
        //! Fügt der Liste einen auswählbaren Eintrag hinzu. Der erste Eintrag
        //! ist zu Beginn automatisch ausgewählt \param txt Der Text des
        //! Eintrags
        DLLEXPORT void addEintrag(Text* txt);
        //! Fügt der Liste einen auswählbaren Eintrag hinzu. Der erste Eintrag
        //! ist zu Beginn automatisch ausgewählt \param txt Ein Zeiger auf den
        //! Eintrag
        DLLEXPORT void addEintragZ(TextFeld* txt);
        //! Ändert den Text eines Eintrags
        //! \param i Der Index des Eintrags
        //! \param txt Der neue Text
        DLLEXPORT void setEintrag(int i, const char* txt);
        //! Ändert den Text eines Eintrags
        //! \param i Der Index des Eintrags
        //! \param txt Der neue Text
        DLLEXPORT void setEintrag(int i, Text* txt);
        //! Ändert einen Eintrag
        //! \param i Der Index des Eintrags
        //! \param txt Ein Zeiger auf den neuen Eintrag
        DLLEXPORT void setEintragZ(int i, TextFeld* txt);
        //! Löscht einen Eintrag
        //! \param i Der Index des Eintrags
        DLLEXPORT void removeEintrag(int i);
        //! Setzt einen Zeiger auf den Knopf, der zum aus und einklappen der
        //! Liste verwendet wird \param ausK Der Knopf
        DLLEXPORT void setAusklappKnopfZ(Knopf* ausK);
        //! Setzt einen Zeiger auf einen Rahmen, der für einen bestimmten
        //! Eintrag benutzt wird \param i Der Index des Eintrags \param rahmen
        //! Der Rahemn
        DLLEXPORT void setEintragRahmenZ(int i, Rahmen* rahmen);
        //! Setzt die Farbe eines Rahmens, der für einen bestimmten Eintrag
        //! benutzt wird \param i Der Index des Eintrags \param f Die farbe im
        //! A8R8G8B8 Format
        DLLEXPORT void setEintragRahmenFarbe(int i, int f);
        //! Setzt die Breite eines Rahmens, der für einen bestimmten Eintrag
        //! benutzt wird \param i Der Index des Eintrags \param rbr Die Breite
        //! des Rahmens in Pixeln
        DLLEXPORT void setEintragRahmenBreite(int i, int rbr);
        //! Setzt eine Hintergrund Farbe, die für einen bestimmten Eintrag
        //! benutzt wird \param i Der Index des Eintrags \param f Die farbe im
        //! A8R8G8B8 Format
        DLLEXPORT void setEintragHintergrundFarbe(int i, int f);
        //! Setzt einen zeiger auf ein Hintergrund Bild, das für einen
        //! bestimmten Eintrag benutzt wird \param i Der Index des Eintrags
        //! \param bgB Das Hintergrund Bild
        DLLEXPORT void setEintragHintergrundBildZ(int i, Bild* bgB);
        //! Setzt ein Hintergrund Bild durch Kopieren, das für einen bestimmten
        //! Eintrag benutzt wird \param i Der Index des Eintrags \param bgB Das
        //! Hintergrund Bild
        DLLEXPORT void setEintragHintergrundBild(int i, Bild* bgB);
        //! Setzt einen zeiger auf einen Farbübergangn, der für einen bestimmten
        //! Eintrag benutzt wird \param i Der Index des Eintrags \param af Der
        //! Farbübergang
        DLLEXPORT void setEintragAlphaFeldZ(int i, AlphaFeld* af);
        //! Setzt dei Farbe eines Farbübergangns, der für einen bestimmten
        //! Eintrag benutzt wird \param i Der Index des Eintrags \param afF Die
        //! Farbe im A8R8G8B8 Format
        DLLEXPORT void setEintragAlphaFeldFarbe(int i, int afF);
        //! Setzt dei Stärke eines Farbübergangns, der für einen bestimmten
        //! Eintrag benutzt wird \param i Der Index des Eintrags \param afSt Die
        //! Stärke
        DLLEXPORT void setEintragAlphaFeldStrength(int i, int afSt);
        //! Setzt eienen Zeiger auf einen Rahmen, der bei dem ausgewählten
        //! Eintrag verwendet wird \param rahmen Der Rahmen
        DLLEXPORT void setAuswRahmenZ(Rahmen* rahmen);
        //! Setzt die Farbe eines Rahmens, der bei dem ausgewählten Eintrag
        //! verwendet wird \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setAuswRahmenFarbe(int f);
        //! Setzt die Breite eines Rahmens, der bei dem ausgewählten Eintrag
        //! verwendet wird \param rbr Die Breite in Pixeln
        DLLEXPORT void setAuswRahmenBreite(int rbr);
        //! Setzt die Hintergrund Farbe, die bei dem ausgewählten Eintrag
        //! verwendet wird \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setAuswHintergrundFarbe(int f);
        //! Setzt den Zeiger auf ein Hintergrund Bild, das bei dem ausgewählten
        //! Eintrag verwendet wird \param bgB Das Bild
        DLLEXPORT void setAuswHintergrundBildZ(Bild* bgB);
        //! Setzt ein Hintergrund Bild durch kopieren, das bei dem ausgewählten
        //! Eintrag verwendet wird \param bgB Das Bild
        DLLEXPORT void setAuswHintergrundBild(Bild* bgB);
        //! Setzt den Zeiger auf einen Farbübergang, der bei dem ausgewählten
        //! Eintrag verwendet wird \param af Der Farbübergang
        DLLEXPORT void setAuswAlphaFeldZ(AlphaFeld* af);
        //! Setzt die Farbe eines Farbübergangs, der bei dem ausgewählten
        //! Eintrag verwendet wird \param afF Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setAuswAlphaFeldFarbe(int afF);
        //! Setzt die Stärke eines Farbübergangs, der bei dem ausgewählten
        //! Eintrag verwendet wird \param afSt Die Stärke
        DLLEXPORT void setAuswAlphaFeldStrength(int afSt);
        //! Setzt eienen Zeiger auf einen Rahmen, der bei dem Flag MultiStyled
        //! bei der Auswahl eines bestimmten Eintrags verwendet wird \param i
        //! Der Index des Eintrags \param rahmen Der Rahmen
        DLLEXPORT void setMsAuswRahmenZ(int i, Rahmen* rahmen);
        //! Setzt die Farbe einens Rahmens, der bei dem Flag MultiStyled bei der
        //! Auswahl eines bestimmten Eintrags verwendet wird \param i Der Index
        //! des Eintrags \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setMsAuswRahmenFarbe(int i, int f);
        //! Setzt die Breite einens Rahmens, der bei dem Flag MultiStyled bei
        //! der Auswahl eines bestimmten Eintrags verwendet wird \param i Der
        //! Index des Eintrags \param rbr Die Breite in Pixeln
        DLLEXPORT void setMsAuswRahmenBreite(int i, int rbr);
        //! Setzt die Hintergrundfarbe, die bei dem Flag MultiStyled bei der
        //! Auswahl eines bestimmten Eintrags verwendet wird \param i Der Index
        //! des Eintrags \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setMsAuswHintergrundFarbe(int i, int f);
        //! Setzt eienen Zeiger auf eine Hintergrund Bild, das bei dem Flag
        //! MultiStyled bei der Auswahl eines bestimmten Eintrags verwendet wird
        //! \param i Der Index des Eintrags
        //! \param bgB Das Bild
        DLLEXPORT void setMsAuswHintergrundBildZ(int i, Bild* bgB);
        //! Setzt eien Hintergrund Bild durch kopieren, das bei dem Flag
        //! MultiStyled bei der Auswahl eines bestimmten Eintrags verwendet wird
        //! \param i Der Index des Eintrags
        //! \param bgB Das Bild
        DLLEXPORT void setMsAuswHintergrundBild(int i, Bild* bgB);
        //! Setzt eienen Zeiger auf einen Farbverlauf, der bei dem Flag
        //! MultiStyled bei der Auswahl eines bestimmten Eintrags verwendet wird
        //! \param i Der Index des Eintrags
        //! \param af Der Farbverlauf
        DLLEXPORT void setMsAuswAlphaFeldZ(int i, AlphaFeld* af);
        //! Setzt die Farbe eines Farbverlaufs, der bei dem Flag MultiStyled bei
        //! der Auswahl eines bestimmten Eintrags verwendet wird \param i Der
        //! Index des Eintrags \param afF Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setMsAuswAlphaFeldFarbe(int i, int afF);
        //! Setzt die Stärke eines Farbverlaufs, der bei dem Flag MultiStyled
        //! bei der Auswahl eines bestimmten Eintrags verwendet wird \param i
        //! Der Index des Eintrags \param afSt Die Stärke
        DLLEXPORT void setMsAuswAlphaFeldStrength(int i, int afSt);
        //! Setzt einen Zeiger auf einen Rahmen, der bei dem Eintrag verwendet
        //! wird, auf den die Maus zeigt \param rahmen Der Rahmen
        DLLEXPORT void setMausRahmenZ(Rahmen* rahmen);
        //! Setzt die Farbe eines Rahmens, der bei dem Eintrag verwendet wird,
        //! auf den die Maus zeigt \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setMausRahmenFarbe(int f);
        //! Setzt die Breite eines Rahmens, der bei dem Eintrag verwendet wird,
        //! auf den die Maus zeigt \param rbr Die Breite des Rahmens in Pixeln
        DLLEXPORT void setMausRahmenBreite(int rbr);
        //! Setzt die Hintergrund Farbe, die bei dem Eintrag verwendet wird, auf
        //! den die Maus zeigt \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setMausHintergrundFarbe(int f);
        //! Setzt einen Zeiger auf ein Hintergrund Bild, das bei dem Eintrag
        //! verwendet wird, auf den die Maus zeigt \param bgB Das Bild
        DLLEXPORT void setMausHintergrundBildZ(Bild* bgB);
        //! Setzt ein Hintergrund Bild durch kopieren, das bei dem Eintrag
        //! verwendet wird, auf den die Maus zeigt \param bgB Das Bild
        DLLEXPORT void setMausHintergrundBild(Bild* bgB);
        //! Setzt einen Farbverlauf, der bei dem Eintrag verwendet wird, auf den
        //! die Maus zeigt \param af Der Farbverlauf
        DLLEXPORT void setMausAlphaFeldZ(AlphaFeld* af);
        //! Setzt die Farbe eines Farbverlaufs, der bei dem Eintrag verwendet
        //! wird, auf den die Maus zeigt \param afF Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setMausAlphaFeldFarbe(int afF);
        //! Setzt die Stärke eines Farbverlaufs, der bei dem Eintrag verwendet
        //! wird, auf den die Maus zeigt \param afSt Die Stärke
        DLLEXPORT void setMausAlphaFeldStrength(int afSt);
        //! Setzt einen Zeiger auf einen Rahmen, der bei dem Flag MultiStyled
        //! bei einem bestimmten Eintrag verwendet wird, auf den die Maus zeigt
        //! \param i Der Index des Eintrags
        //! \param rahmen Der Rahmen
        DLLEXPORT void setMsMausRahmenZ(int i, Rahmen* rahmen);
        //! Setzt die Farbe eines Rahmes, der bei dem Flag MultiStyled bei einem
        //! bestimmten Eintrag verwendet wird, auf den die Maus zeigt \param i
        //! Der Index des Eintrags \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setMsMausRahmenFarbe(int i, int f);
        //! Setzt die Breite eines Rahmes, der bei dem Flag MultiStyled bei
        //! einem bestimmten Eintrag verwendet wird, auf den die Maus zeigt
        //! \param i Der Index des Eintrags
        //! \param rbr Die Breite in Pixeln
        DLLEXPORT void setMsMausRahmenBreite(int i, int rbr);
        //! Setzt die Hintergrund Farbe, die bei dem Flag MultiStyled bei einem
        //! bestimmten Eintrag verwendet wird, auf den die Maus zeigt \param i
        //! Der Index des Eintrags \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setMsMausHintergrundFarbe(int i, int f);
        //! Setzt einen Zeiger auf Hintergrund Bild, das bei dem Flag
        //! MultiStyled bei einem bestimmten Eintrag verwendet wird, auf den die
        //! Maus zeigt \param i Der Index des Eintrags \param bgB Das Bild
        DLLEXPORT void setMsMausHintergrundBildZ(int i, Bild* bgB);
        //! Setzt ein Hintergrund Bild durch kopieren, das bei dem Flag
        //! MultiStyled bei einem bestimmten Eintrag verwendet wird, auf den die
        //! Maus zeigt \param i Der Index des Eintrags \param bgB Das Bild
        DLLEXPORT void setMsMausHintergrundBild(int i, Bild* bgB);
        //! Setzt einen Zeiger auf einen Farbübergang, der bei dem Flag
        //! MultiStyled bei einem bestimmten Eintrag verwendet wird, auf den die
        //! Maus zeigt \param i Der Index des Eintrags \param af Der Farbverlauf
        DLLEXPORT void setMsMausAlphaFeldZ(int i, AlphaFeld* af);
        //! Setzt die Farbe einens Farbübergangs, der bei dem Flag MultiStyled
        //! bei einem bestimmten Eintrag verwendet wird, auf den die Maus zeigt
        //! \param i Der Index des Eintrags
        //! \param afF Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setMsMausAlphaFeldFarbe(int i, int afF);
        //! Setzt die Stärke einens Farbübergangs, der bei dem Flag MultiStyled
        //! bei einem bestimmten Eintrag verwendet wird, auf den die Maus zeigt
        //! \param i Der Index des Eintrags
        //! \param afSt Die Stärke
        DLLEXPORT void setMsMausAlphaFeldStrength(int i, int afSt);
        //! Wählt ein Element aus
        //! \param i Der Index des Elements
        DLLEXPORT void setAuswahl(int i);
        //! Klappt die Liste zum Auswählen aus
        DLLEXPORT void ausklappen();
        //! Klappt die Liste zum Auswählen ein
        DLLEXPORT void einklappen();
        //! Scrollt in der Liste zu einem bestimmten Eintrag
        //! \param i Der Index des Eintrags
        DLLEXPORT void scrollZuEintrag(int i);
        //! Setzt die maximale Ausklapp Höhe der Liste
        //! \param maxHeight Die maximale Höhe in Pixeln
        DLLEXPORT void setMaxAuskappHeight(int maxHeight);
        //! Setzt die Höhe der Einträge
        //! \param height Die Höhe in Pixeln
        DLLEXPORT void setEintragHeight(int height);
        //! Fügt Styles zu einem bestimmten Eintrag hinzu, falls der Flag
        //! MultiStyled gesetzt wurde \param i Der Index des Eintrags \param
        //! abStyle Der Style, der hinzugefügt werden soll
        DLLEXPORT void addMsStyle(int i, __int64 abStyle);
        //! Setzt Styles eines bestimmten Eintrags, falls der Flag MultiStyled
        //! gesetzt wurde \param i Der Index des Eintrags \param abStyle Der
        //! Style \param add 1, falls die Styles hinzugefügt werden sollen und
        //! 0, falls sie entfernt werden sollen
        DLLEXPORT void setMsStyle(int i, __int64 abStyle, bool add);
        //! Ersetzt die Styles eines bestimmten Eintrags, falls der Flag
        //! MultiStyled gesetzt wurde \param i Der Index des Eintrags \param
        //! abStyle Der neue Style
        DLLEXPORT void setMsStyle(int i, __int64 abStyle);
        //! Entfernt Styles von einem bestimmten Eintrag, falls der Flag
        //! MultiStyled gesetzt wurde \param i Der Index des Eintrags \param
        //! abStyle Der Style, der entfernt werden soll
        DLLEXPORT void removeMsStyle(int i, __int64 abStyle);
        //! Aktualisiert das Objekt. Wird vom Framework aufgerufen
        //! \param tickVal Die Zeit in sekunden, die seit dem lezten Aufruf
        //! dieser Funktion vergangen ist \return 1, wenn sich etwas verändert
        //! hat und das Bild neu gezeichnet werden muss. 0 sonst
        DLLEXPORT bool tick(double tickVal) override;
        //! Verarbeitet Tastatur Nachrichten
        //! \param me Das Ereignis, was durch die Tastatureingabe ausgelößt
        //! wurde
        DLLEXPORT void doTastaturEreignis(TastaturEreignis& te) override;
        //! Zeichnet das Objekt nach zRObj, falls es sichtbar ist
        //! \param zRObj Das Bild, in welches gezeichnet werden soll
        DLLEXPORT void render(Bild& zRObj) override;
        //! Gibt den Index eines Eintrags zurück
        //! \param txt Der Text des Eintrags
        DLLEXPORT int getEintragPos(const char* txt) const;
        //! Gibt den Index eines Eintrags zurück
        //! \param txt Der Text des Eintrags
        DLLEXPORT int getEintragPos(Text* txt) const;
        //! Gibt den Text eines Eintrags zurück
        //! \param i Der Index des Eintrags
        DLLEXPORT Text* getEintragText(int i) const;
        //! Gibt den Text eines Eintrags ohne erhöhten Reference Counter zurück
        //! \param i Der Index des Eintrags
        DLLEXPORT Text* zEintragText(int i) const;
        //! Gibt einen Eintrag zurück
        //! \param i Der Index des Eintrags
        DLLEXPORT TextFeld* getEintrag(int i) const;
        //! Gibt einen Eintrag ohne erhöhten Reference Counter zurück
        //! \param i Der Index des Eintrags
        DLLEXPORT TextFeld* zEintrag(int i) const;
        //! Gibt den Index des Ausgewählten Eintrags zurück
        DLLEXPORT int getAuswahl() const;
        //! Gibt die Anzahl der Einträge zurück
        DLLEXPORT int getEintragAnzahl() const;
        //! Gibt zurück, ob die Liste gerade Ausgeklappt ist
        DLLEXPORT bool istAusgeklappt() const;
        //! Gibt die maximale Höhe der ausgeklappten Liste zurück
        DLLEXPORT int getMaxHeight() const;
        //! Gibt die Höhe eines Eintrags zurück
        DLLEXPORT int getEintragHeight() const;
        //! Gibt den Knopf zurück, der zum aus- und einklappen dr Liste
        //! verwendet wird
        DLLEXPORT Knopf* getAusklappKnopf() const;
        //! Gibt den Knopf ohne erhöhten Reference Counter zurück, der zum aus-
        //! und einklappen dr Liste verwendet wird
        DLLEXPORT Knopf* zAusklappKnopf() const;
        //! Gibt den Rahmen eines Eintrags zurück
        //! \param i Der Index des Eintrags
        DLLEXPORT Rahmen* getEintragRahmen(int i) const;
        //! Gibt den Rahmen eines Eintrags ohne erhöhten Reference Counter
        //! zurück \param i Der Index des Eintrags
        DLLEXPORT Rahmen* zEintragRahmen(int i) const;
        //! Gibt die Farbe eines Rahmens eines Eintrags im A8R8G8B8 Format
        //! zurück \param i Der Index des Eintrags
        DLLEXPORT int getEintragRahmenFarbe(int i) const;
        //! Gibt die Breite eines Rahmens eines Eintrags zurück
        //! \param i Der Index des Eintrags
        DLLEXPORT int getEintragRahmenBreite(int i) const;
        //! Gibt den Farbübergang eines Eintrags zurück
        //! \param i Der Index des Eintrags
        DLLEXPORT AlphaFeld* getEintragAlphaFeld(int i) const;
        //! Gibt den Farbübergang eines Eintrags ohne erhöhten Reference Counter
        //! zurück \param i Der Index des Eintrags
        DLLEXPORT AlphaFeld* zEintragAlphaFeld(int i) const;
        //! Gibt die Farbe eines Farbübergangs eines Eintrags im A8R8G8B8 Format
        //! zurück \param i Der Index des Eintrags
        DLLEXPORT int getEintragAlphaFeldFarbe(int i) const;
        //! Gibt die Stärke eines Farbübergangs eines Eintrags zurück
        //! \param i Der Index des Eintrags
        DLLEXPORT int getEintragAlphaFeldStrength(int i) const;
        //! Gibt die Hintergrund Farbe eines Eintrags im A8R8G8B8 Format zurück
        //! \param i Der Index des Eintrags
        DLLEXPORT int getEintragHintergrundFarbe(int i) const;
        //! Gibt das Hintergrund Bild eines Eintrags zurück
        //! \param i Der Index des Eintrags
        DLLEXPORT Bild* getEintragHintergrundBild(int i) const;
        //! Gibt das Hintergrund Bild eines Eintrags ohne erhöhten Reference
        //! Counter zurück \param i Der Index des Eintrags
        DLLEXPORT Bild* zEintragHintergrundBild(int i) const;
        //! Gibt den Rahmen zurück, der bei der Auswahl eines Eintrags verwendet
        //! wird
        DLLEXPORT Rahmen* getAuswRahmen() const;
        //! Gibt den Rahmen ohne erhöhten Reference Counter zurück, der bei der
        //! Auswahl eines Eintrags verwendet wird
        DLLEXPORT Rahmen* zAuswRahmen() const;
        //! Gibt die Farbe des Rahmens im A8R8G8B8 Format zurück, der bei der
        //! Auswahl eines Eintrags verwendet wird
        DLLEXPORT int getAuswRahmenFarbe() const;
        //! Gibt die Breite des Rahmens zurück, der bei der Auswahl eines
        //! Eintrags verwendet wird
        DLLEXPORT int getAuswRahmenBreite() const;
        //! Gibt den Farbübergang zurück, der bei der Auswahl eines Eintrags
        //! verwendet wird
        DLLEXPORT AlphaFeld* getAuswAlphaFeld() const;
        //! Gibt den Farbübergang ohne erhöhten Reference Counter zurück, der
        //! bei der Auswahl eines Eintrags verwendet wird
        DLLEXPORT AlphaFeld* zAuswAlphaFeld() const;
        //! Gibt die Farbe des Farbübergangs zurück, der bei der Auswahl eines
        //! Eintrags verwendet wird
        DLLEXPORT int getAuswAlphaFeldFarbe() const;
        //! Gibt die Stärke des Farbübergangs zurück, der bei der Auswahl eines
        //! Eintrags verwendet wird
        DLLEXPORT int getAuswAlphaFeldStrength() const;
        //! Gibt die Hintergrundfarbe im A8R8G8B8 Format zurück, die bei der
        //! Auswahl eines Eintrags verwendet wird
        DLLEXPORT int getAuswHintergrundFarbe() const;
        //! Gibt das Hintergrundbild zurück, das bei der Auswahl eines Eintrags
        //! verwendet wird
        DLLEXPORT Bild* getAuswHintergrundBild() const;
        //! Gibt das Hintergrundbild ohne erhöhten Reference Counter zurück, das
        //! bei der Auswahl eines Eintrags verwendet wird
        DLLEXPORT Bild* zAuswHintergrundBild() const;
        //! Gibt den Rahmen zurück, der bei dem Flag MultiStyled bei der auswahl
        //! eines bestimmten Eintrags verwendet wird \param i Der Index des
        //! Eintrags
        DLLEXPORT Rahmen* getMsAuswRahmen(int i) const;
        //! Gibt den Rahmen ohne erhöhten Reference Counter zurück, der bei dem
        //! Flag MultiStyled bei der auswahl eines bestimmten Eintrags verwendet
        //! wird \param i Der Index des Eintrags
        DLLEXPORT Rahmen* zMsAuswRahmen(int i) const;
        //! Gibt die Farbe des Rahmens im A8R8G8B8 Format zurück, der bei dem
        //! Flag MultiStyled bei der auswahl eines bestimmten Eintrags verwendet
        //! wird \param i Der Index des Eintrags
        DLLEXPORT int getMsAuswRahmenFarbe(int i) const;
        //! Gibt die Breite des Rahmens zurück, der bei dem Flag MultiStyled bei
        //! der auswahl eines bestimmten Eintrags verwendet wird \param i Der
        //! Index des Eintrags
        DLLEXPORT int getMsAuswRahmenBreite(int i) const;
        //! Gibt den Farbübergang zurück, der bei dem Flag MultiStyled bei der
        //! auswahl eines bestimmten Eintrags verwendet wird \param i Der Index
        //! des Eintrags
        DLLEXPORT AlphaFeld* getMsAuswAlphaFeld(int i) const;
        //! Gibt den Farbübergang ohne erhöhten Reference Counter zurück, der
        //! bei dem Flag MultiStyled bei der auswahl eines bestimmten Eintrags
        //! verwendet wird \param i Der Index des Eintrags
        DLLEXPORT AlphaFeld* zMsAuswAlphaFeld(int i) const;
        //! Gibt die Farbe des Farbübergangs im A8R8G8B8 Format zurück, der bei
        //! dem Flag MultiStyled bei der auswahl eines bestimmten Eintrags
        //! verwendet wird \param i Der Index des Eintrags
        DLLEXPORT int getMsAuswAlphaFeldFarbe(int i) const;
        //! Gibt die Stärke des Farbübergangs zurück, der bei dem Flag
        //! MultiStyled bei der auswahl eines bestimmten Eintrags verwendet wird
        //! \param i Der Index des Eintrags
        DLLEXPORT int getMsAuswAlphaFeldStrength(int i) const;
        //! Gibt die Hintergrund Farbe im A8R8G8B8 Format zurück, die bei dem
        //! Flag MultiStyled bei der auswahl eines bestimmten Eintrags verwendet
        //! wird \param i Der Index des Eintrags
        DLLEXPORT int getMsAuswHintergrundFarbe(int i) const;
        //! Gibt das Hintergrund Bild zurück, das bei dem Flag MultiStyled bei
        //! der auswahl eines bestimmten Eintrags verwendet wird \param i Der
        //! Index des Eintrags
        DLLEXPORT Bild* getMsAuswHintergrundBild(int i) const;
        //! Gibt das Hintergrund Bild ohne erhöhten Reference Counter zurück,
        //! das bei dem Flag MultiStyled bei der auswahl eines bestimmten
        //! Eintrags verwendet wird \param i Der Index des Eintrags
        DLLEXPORT Bild* zMsAuswHintergrundBild(int i) const;
        //! Gibt den Rahmen zurück, der verwendet wird, wenn die Maus auf einen
        //! Eintrag zeigt
        DLLEXPORT Rahmen* getMausRahmen() const;
        //! Gibt den Rahmen ohne erhöhten Reference Counter zurück, der
        //! verwendet wird, wenn die Maus auf einen Eintrag zeigt
        DLLEXPORT Rahmen* zMausRahmen() const;
        //! Gibt die Farbe des Rahmens im A8R8G8B8 Format zurück, der verwendet
        //! wird, wenn die Maus auf einen Eintrag zeigt
        DLLEXPORT int getMausRahmenFarbe() const;
        //! Gibt die Breite des Rahmens zurück, der verwendet wird, wenn die
        //! Maus auf einen Eintrag zeigt
        DLLEXPORT int getMausRahmenBreite() const;
        //! Gibt den Farbübergang zurück, der verwendet wird, wenn die Maus auf
        //! einen Eintrag zeigt
        DLLEXPORT AlphaFeld* getMausAlphaFeld() const;
        //! Gibt den Farbübergang ohne erhöhten Reference Counter zurück, der
        //! verwendet wird, wenn die Maus auf einen Eintrag zeigt
        DLLEXPORT AlphaFeld* zMausAlphaFeld() const;
        //! Gibt die Farbe des Farbübergangs im A8R8G8B8 Format zurück, der
        //! verwendet wird, wenn die Maus auf einen Eintrag zeigt
        DLLEXPORT int getMausAlphaFeldFarbe() const;
        //! Gibt die Breite des Farbübergangs zurück, der verwendet wird, wenn
        //! die Maus auf einen Eintrag zeigt
        DLLEXPORT int getMausAlphaFeldStrength() const;
        //! Gibt die Hintergrund Farbe im A8R8G8B8 Format zurück, die verwendet
        //! wird, wenn die Maus auf einen Eintrag zeigt
        DLLEXPORT int getMausHintergrundFarbe() const;
        //! Gibt das Hintergrund Bild zurück, das verwendet wird, wenn die Maus
        //! auf einen Eintrag zeigt
        DLLEXPORT Bild* getMausHintergrundBild() const;
        //! Gibt das Hintergrund Bild ohne erhöhten Reference Counter zurück,
        //! das verwendet wird, wenn die Maus auf einen Eintrag zeigt
        DLLEXPORT Bild* zMausHintergrundBild() const;
        //! Gibt den Rahmen zurück, der bei dem Flag Multistyle verwendet wird,
        //! wenn die Maus auf einen bestimmten Eintrag zeigt \param i Der Index
        //! des Eintrags
        DLLEXPORT Rahmen* getMsMausRahmen(int i) const;
        //! Gibt den Rahmen ohne erhöhten Reference Counter zurück, der bei dem
        //! Flag Multistyle verwendet wird, wenn die Maus auf einen bestimmten
        //! Eintrag zeigt \param i Der Index des Eintrags
        DLLEXPORT Rahmen* zMsMausRahmen(int i) const;
        //! Gibt die Farbe des Rahmens im A8R8G8B8 Format zurück, der bei dem
        //! Flag Multistyle verwendet wird, wenn die Maus auf einen bestimmten
        //! Eintrag zeigt \param i Der Index des Eintrags
        DLLEXPORT int getMsMausRahmenFarbe(int i) const;
        //! Gibt die Breite des Rahmens zurück, der bei dem Flag Multistyle
        //! verwendet wird, wenn die Maus auf einen bestimmten Eintrag zeigt
        //! \param i Der Index des Eintrags
        DLLEXPORT int getMsMausRahmenBreite(int i) const;
        //! Gibt den Farbübergang zurück, der bei dem Flag Multistyle verwendet
        //! wird, wenn die Maus auf einen bestimmten Eintrag zeigt \param i Der
        //! Index des Eintrags
        DLLEXPORT AlphaFeld* getMsMausAlphaFeld(int i) const;
        //! Gibt den Farbübergang ohne erhöhten Reference Counter zurück, der
        //! bei dem Flag Multistyle verwendet wird, wenn die Maus auf einen
        //! bestimmten Eintrag zeigt \param i Der Index des Eintrags
        DLLEXPORT AlphaFeld* zMsMausAlphaFeld(int i) const;
        //! Gibt die Farbe des Farbübergangs im A8R8G8B8 Format zurück, der bei
        //! dem Flag Multistyle verwendet wird, wenn die Maus auf einen
        //! bestimmten Eintrag zeigt \param i Der Index des Eintrags
        DLLEXPORT int getMsMausAlphaFeldFarbe(int i) const;
        //! Gibt die Stärke des Farbübergangs zurück, der bei dem Flag
        //! Multistyle verwendet wird, wenn die Maus auf einen bestimmten
        //! Eintrag zeigt \param i Der Index des Eintrags
        DLLEXPORT int getMsMausAlphaFeldStrength(int i) const;
        //! Gibt die Hintergrund Farbe im A8R8G8B8 Format zurück, die bei dem
        //! Flag Multistyle verwendet wird, wenn die Maus auf einen bestimmten
        //! Eintrag zeigt \param i Der Index des Eintrags
        DLLEXPORT int getMsMausHintergrundFarbe(int i) const;
        //! Gibt das Hintergrund Bild zurück, das bei dem Flag Multistyle
        //! verwendet wird, wenn die Maus auf einen bestimmten Eintrag zeigt
        //! \param i Der Index des Eintrags
        DLLEXPORT Bild* getMsMausHintergrundBild(int i) const;
        //! Gibt das Hintergrund Bild ohne erhöhten Reference Counter zurück,
        //! das bei dem Flag Multistyle verwendet wird, wenn die Maus auf einen
        //! bestimmten Eintrag zeigt \param i Der Index des Eintrags
        DLLEXPORT Bild* zMsMausHintergrundBild(int i) const;
        //! Prüft, ob ein Punkt in diesem Objekt liegt
        //! \param x die x koordinate des punktes
        //! \param y die y koordinate des punktes
        //! \return 1, wenn der punkt innen ist, 0 sonst
        DLLEXPORT bool istPunktInnen(int x, int y) const override;
        //! Prüft, ob bei dem Flag MultiStyled für einen Bestimmten Eintrag ein
        //! bestimmter Style gesetzt wurde \param i Der Index des Eintrags
        //! \param abStyle Der Style
        DLLEXPORT inline bool hatMsStyle(int i, __int64 abStyle) const;
        //! Prüft, ob bei dem Flag MultiStyled für einen Bestimmten Eintrag ein
        //! bestimmter Style nicht gesetzt wurde \param i Der Index des Eintrags
        //! \param abStyle Der Style
        DLLEXPORT inline bool hatMsStyleNicht(int i, __int64 abStyle) const;
        DLLEXPORT Zeichnung*
        dublizieren() const override; //! Erzeugt eine Kopie des Zeichnungs
    };
} // namespace Framework

#endif