#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:
            //! Wenn dieser Flag gesetzt ist, hat jeder Wert aus der Liste einen
            //! Rahmen
            static const __int64 FeldRahmen = 0x000001000;
            //! Wenn dieser Flag gesetzt ist, hat jeder Wert aus der Liste einen
            //! Hintergrund
            static const __int64 FeldHintergrund = 0x000002000;
            //! Wenn dieser Flag gesetzt ist, hat jeder Wert aus der Liste ein
            //! Bild als Hintergrund
            static const __int64 FeldHBild = 0x000004000;
            //! Wenn dieser Flag gesetzt ist, hat jeder Wert aus der Liste einen
            //! Transparenten Hintergrund
            static const __int64 FeldHAlpha = 0x000008000;
            //! Wenn dieser Flag gesetzt ist, hat jeder Wert aus der Liste einen
            //! Farb�bergang
            static const __int64 FeldBuffer = 0x000010000;
            //! Wenn dieser Flag gesetzt ist, bekommt der Wert, der gerade
            //! ausgew�hlt  Hintergrund
            static const __int64 AuswahlHintergrund = 0x000020000;
            //! Wenn dieser Flag gesetzt ist, bekommt der Wert, der gerade
            //! ausgew�hlt ist ein Hintergrundbild
            static const __int64 AuswahlHBild = 0x000040000;
            //! Wenn dieser Flag gesetzt ist, bekommt der Wert, der gerade
            //! ausgew�hlt ist einen transparenten Hintergrund
            static const __int64 AuswahlHAlpha = 0x000080000;
            //! Wenn dieser Flag gesetzt ist, bekommt der Wert, der gerade
            //! ausgew�hlt ist einen Farb�bergang
            static const __int64 AuswahlBuffer = 0x000100000;
            //! Wenn dieser Flag gesetzt ist, bekommt der Wert, der gerade
            //! ausgew�hlt ist einen Rahmen
            static const __int64 AuswahlRahmen = 0x000200000;
            //! Wenn dieser Flag gesetzt ist, hat jeder Wert seine eigenen
            //! Hintergr�nde unt Rahmen und nicht alle die selben
            static const __int64 MultiStyled = 0x000400000;
            //! 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 MaxHeight = 0x004000000;
            //! Wenn dieser Flag gesetzt ist, hat ein Element, wo die Maus drau
            //! zeigt, einen Hintergrund
            static const __int64 MausHintergrund = 0x008000000;
            //! Wenn dieser Flag gesetzt ist, hat ein Element, wo die Maus drauf
            //! zeigt, ein Hintergrundbild
            static const __int64 MausHBild = 0x010000000;
            //! Wenn dieser Flag gesetzt ist, hat ein Element, wo die Maus drauf
            //! zeigt, einen transparenten Hintergrund
            static const __int64 MausHAlpha = 0x020000000;
            //! Wenn dieser Flag gesetzt ist, hat ein Element, wo die Maus drauf
            //! zeigt, einen Farb�bergang
            static const __int64 MausBuffer = 0x040000000;
            //! Wenn dieser Flag gesetzt ist, hat ein Element, wo die Maus drauf
            //! zeigt, einen Rahmen
            static const __int64 MausRahmen = 0x080000000;
            //! const int NachObenAusklappen	= 0x100000000;
            //! const int AutoAusklappRichtung	= 0x200000000;

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

    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