#ifndef Diagramm_H
#define Diagramm_H

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

namespace Framework
{
    class Rahmen;     //! Rahmen.h
    class AlphaFeld;  //! AlphaFeld.h
    class Text;       //! Text.h
    class Schrift;    //! Schrift.h
    class HScrollBar; //! Scroll.h
    class VScrollBar; //! Scroll.h
    class SLDiag;     //! aus dieser Datei
    class LDiag;      //! aus dieser Datei
    class TextRenderer;

    //! Eine Zeichnung de 2D GUI Frameworks, die ein live Diagramm von werten
    //! zeichnet
    class SLDiag : public ZeichnungHintergrund
    {
    public:
        class Style : public ZeichnungHintergrund::Style
        {
        public:
            //! Es wird ein Gitter im Diagramm zur Orientierung
            //! gezeichnet
            static const __int64 Gitter = 0x01000;
            //! Es werden die Namen der Graphen angezeigt
            static const __int64 LinienName = 0x02000;

            //! Vereinigung der Flags Sichtbar, Hintergrund,
            //! Rahmen, Gitter, LinienName
            static const __int64 normal
                = Sichtbar | Hintergrund | Rahmen | Gitter | LinienName;
        };

    private:
        int gF;
        Array<int>* lFarbe;
        RCArray<Text>* lName;
        RCArray<Array<int>>* ph;
        RCArray<Array<int>>* pb;
        Array<int>* lastValue;
        TextRenderer* textRd;
        Punkt gitterGr;
        int lines;

    public:
        //! Konstruktor
        DLLEXPORT SLDiag();
        //! Destruktor
        DLLEXPORT virtual ~SLDiag();
        //! Setzt den verwendeten TextRenderer
        //! \param textRd Der Textrenderer
        DLLEXPORT void setTextRendererZ(TextRenderer* textRd);
        //! Setzt einen Zeiger zur verwendeten Schrift
        //! \param schrift Die Schrift
        DLLEXPORT void setSchriftZ(Schrift* schrift);
        //! Setzt die Abst�nde zwischen den Linien des Gitters
        //! \param gr F�r x den Abstand zwischen jeder vertikalen Linie in
        //! Pixeln und f�r y den Abstand zwischen jeder Horizontalen Linie in
        //! den dargestellen y Werten
        DLLEXPORT void setGSize(Punkt& gr);
        //! Setzt die Farbe der Raster Linien
        //! \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setGFarbe(int f);
        //! F�gt dem Diagramm einen neuen Graphen hinzu
        //! \param name Der Name des Graphen. Er wird bei dem Flag LinienName im
        //! Diagramm angezeigt
        DLLEXPORT void addLinie(const char* name);
        //! F�gt dem Diagramm einen neuen Graphen hinzu
        //! \param name Der Name des Graphen. Er wird bei dem Flag LinienName im
        //! Diagramm angezeigt
        DLLEXPORT void addLinie(Text* txt);
        //! Setzt die Farbe eines Graphen
        //! \param lNum Der Index des Graphen
        //! \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setLFarbe(int lNum, int f);
        //! F�gt einem Graphen einen Punkt hinzu. Hierdurch verschieben sich
        //! alle Punkte des Graphen so weit nach Links, dass der neue Punkt
        //! rechts auftaucht. Geht ein Punkt links aus dem Diagramm raus, wird
        //! er gel�scht. Auf diese Weise erscheint das Diagramm wie eine
        //! Abbildung einer Live Messung \param x Der Abstand zum Letzten Punkt
        //! in Pixeln \param y Den Wert der abgebildeten Funktion in dem Punkt
        DLLEXPORT void addPunkt(int lNum, int x, int h);
        //! Entfernt einen Graphen
        //! \param lNum Der Index des Graphen
        DLLEXPORT void removeLinie(int lNum);
        //! Zeichnet das Diagramm
        //! \param zRObj Das Bild, in das gezeichnet werden soll
        DLLEXPORT void render(Bild& zRObj) override;
        //! Gibt die verwendete Schrift zur�ck
        DLLEXPORT Schrift* getSchrift() const;
        //! Gibt die verwendete Schrift ohne erh�hten Reference Counter zur�ck
        DLLEXPORT Schrift* zSchrift() const;
        //! Gibt die Gr��e eines Quadrats des Gitters zur�ck, wobei die Braite
        //! in Pixeln und die H�he in Werten der y Achse ist
        DLLEXPORT const Punkt& getGSize() const;
        //! Gibt die Farbe des Gitters in A8R8G8B8 Format zur�ck
        DLLEXPORT int getGFarbe() const;
        //! Gibt den Index eines Graphen zur�ck
        //! \param name Der Name des Graphen
        DLLEXPORT int getLinienNummer(const char* name) const;
        //! Gibt den Index eines Graphen zur�ck
        //! \param name Der Name des Graphen
        DLLEXPORT int getLinienNummer(Text* name) const;
        //! Gibt den Namen eines Graphen zur�ck
        //! \param lNum Der Index des Graphen
        DLLEXPORT Text* getLinienName(int lNum) const;
        //! Gibt den Namen eines Graphen ohne erh�hten Reference Counter zur�ck
        //! \param lNum Der Index des Graphen
        DLLEXPORT Text* zLinienNamen(int lNum) const;
        //! Gibt den H�chsten y Wert von allen Graphen zur�ck
        DLLEXPORT int getHighestValue() const;
        //! Gibt den H�chsten y Wert von einem Bestimmten Graphen zur�ck
        //! \param lNum Der Index des Graphen
        DLLEXPORT int getHighestValue(int lNum) const;
        //! Gibt den Durchschnittswert aller im Diagramm gespeicherten Punkten
        //! eines Graphen zur�ck \param lNum Der Index des Graphen
        DLLEXPORT int getMedian(int lNum) const;
        //! Gibt die Anzahl an Graphen zur�ck
        DLLEXPORT int getLAnzahl() const;
        //! Gibt den y Wert des letzten Punktes eines Graphen zur�ck
        //! \param lNum Der Index des Graphen
        DLLEXPORT int getLastValue(int lNum) const;
    };

    //! Punkt eines Wertes eines Diagramms
    struct DiagPunkt
    {
        //! Position des Punktes auf dem Horizontalen Intervall des Diagramms
        double hIntervall;
        //! Position des punktes auf dem Vertikalen Intervall des Diagramms
        double vIntervall;
    };

    //! Wert der in einem Diagramm visualisiert wird
    struct DiagWert : public virtual ReferenceCounter
    {
        //! Style eines Diagramm Wertes
        class Style
        {
        public:
            static const int Sichtbar
                = 0x01; //! Legt fest, ob der Wert angezeigt werden soll
            static const int Alpha
                = 0x02; //! Legt fest, ob beim zeichnen des Wertes Alphablending
                        //! verwendet werden soll
            static const int Hintergrund
                = 0x04; //! Legt fest, ob der Wert einen Hintergrund hat
            static const int HAlpha
                = 0x08; //! Legt fest, ob beim zeichnen des Hintergrundes
                        //! Alphablending verwendet werden soll
            static const int Name = 0x10; //! Legt fest, ob der Name des Wertes
                                          //! gezeichnet werden soll
        };

        //! Style des Wertes
        int style;
        //! Farbe des Wertes
        int farbe;
        //! Hintergrundfarbe des Wertes
        int hintergrund;
        //! Name des Wertes
        Text* name;
        //! Punkte des Wertes
        Array<DiagPunkt*>* punkte;

        //! Konstruktor
        DLLEXPORT DiagWert();
        //! Destruktor
        DLLEXPORT ~DiagWert();
    };

    //! Daten f�r ein Diagramm
    struct DiagDaten : public virtual ReferenceCounter
    {
        class Style
        {
        public:
            static const int Sichtbar
                = 0x0001; //! Legt Fest, ob die Daten sichtbar sein sollen
            static const int Raster
                = 0x0002; //! Legt fest, ob ein Raster zur Orientierung
                          //! angezeigt werden soll
            static const int RasterAlpha
                = 0x0004; //! Legt fest, ob zum Zeichnen des Rasters
                          //! Alphablending verwendet werden soll
            static const int AutoIntervallHeight
                = 0x0008; //! Legt fest, dass alle Werte automatisch so auf der
                          //! y Achse Skalliert werden, dass immer die komplette
                          //! H�he des Diagramms genutzt wird
            static const int AutoIntervallBreite
                = 0x0010; //! Legt fest, dass alle Wert automatisch so auf der x
                          //! Achse Skalliert werden, dass immer die komplette
                          //! Breite des Diagramms genutzt wird
            static const int HIntervall
                = 0x0020; //! Legt fest, ob die X Achse gezeichnet werden soll
            static const int VIntervall
                = 0x0040; //! Legt fest, ob die Y Achse gezeichnet werden soll
            static const int HIntervallTexte
                = 0x0200; //! Legt fest, ob spezielle Texte f�r die Werte der X
                          //! Achse gezeichnet werden sollen
            static const int VIntervallTexte
                = 0x0400; //! Left fest, ob spezielle Texte f�r die Werte der Y
                          //! Achse gezeichnet werden sollen
            static const int AutoRasterBreite
                = 0x0800; //! Legt fest, ob der Abstand zwischen den Vertikalen
                          //! Linien des Rasters automatisch gew�hlt werden soll
            static const int AutoRasterHeight
                = 0x1000; //! Legt fest, ob der Abstand zwischen den
                          //! Horizontalen Rasterlinien automatisch gew�hlt
                          //! werden soll

            static const int intervalle
                = HIntervall
                | VIntervall; //! Vereiniegt die Flags HIntervall, VIntervall
            static const int intervallTexte
                = HIntervallTexte
                | VIntervallTexte; //! Vereint die Flags HIntervallTexte,
                                   //! VIntervallTexte
            static const int autoRaster
                = AutoRasterHeight | AutoRasterBreite
                | Raster; //! Vereint die Flags AutoRasterH�he,
                          //! AutoRasterBreite, Raster
            static const int autoIntervall
                = AutoIntervallHeight
                | AutoIntervallBreite; //! Vereint die Flags AutoIntervallH�he,
                                       //! AutoIntervallBreite
        };

        //! Style eines Diagramms
        int style;
        //! Breite einer Rasterlinie
        int rasterDicke;
        //! Breite eines Rasterk�stchens
        double rasterBreite;
        //! H�he eines Rasterk�stchens
        double rasterHeight;
        //! Farbe des Rasters
        int rasterFarbe;
        //! Schriftfarbe des Horizontalen Intervalls
        int hIntervallFarbe;
        //! Schriftfarbe des Vertikalen Intervalls
        int vIntervallFarbe;
        //! Name des Horizontalen Intervalls
        Text* hIntervallName;
        //! Name des Vertikalen Intervalls
        Text* vIntervallName;
        //! Anzeigen des Horizontalen Intervalls
        RCArray<Text>* hIntervallTexte;
        //! Anzeigen des Vertikalen Intervalls
        RCArray<Text>* vIntervallTexte;
        //! einzelne Horizontale Intervalle
        Array<double>* hIntervallWerte;
        //! einzelne Vertikale Intervalle
        Array<double>* vIntervallWerte;
        //! Breite des Wertes 1 in Pixeln bei dem horizontalen Intervall ( wird
        //! durch das setzen von AutoIntervallBreite �berschrieben )
        double hIntervallBreite;
        //! H�he des Wertes 1 in Pixeln bei dem vertikalen Intervall ( wird
        //! durch das setzen von AutoIntervallH�he �berschrieben )
        double vIntervallHeight;
        //! Werte, die in dem Diagramm visualisiert werden
        RCArray<DiagWert>* werte;

        //! Konstruktor
        DLLEXPORT DiagDaten();
        //! Destruktor
        DLLEXPORT ~DiagDaten();
    };

    //! Basisklasse der verschiedenen Diagramm Arten
    class BaseDiag
    {
    protected:
        DiagDaten* daten;
        bool changed;
        Critical* lock;

    public:
        //! Konstruktor
        //! \param lock Ein Zeiger zur Critical, mit der die Diagramm Klasse,
        //! die von dieser Klasse erbt Multithread sicher gemacht wird
        DLLEXPORT BaseDiag(Critical* lock);
        //! Destruktor
        DLLEXPORT virtual ~BaseDiag();
        //! Setzt einen Zeiger auf die Daten des Diagramms
        //! \param dd Die Daten
        DLLEXPORT void setDiagDatenZ(DiagDaten* dd);
        //! Kopiert die Daten eines Diagramms
        //! \param dd Die Daten
        DLLEXPORT void setDiagDaten(DiagDaten* dd);
        //! Rasterdicke setzen
        //! \param d Die Breite einer Rasterlinie in Pixeln
        DLLEXPORT void setRasterDicke(int d);
        //! Rasterbreite setzen
        //! \param br Der Abstand zwischen zwei Vertikalen Rasterlinien in
        //! Pixeln
        DLLEXPORT void setRasterBreite(int br);
        //! Rasterh�he setzen
        //! \param hi Der Abstand zwischen zwei Horizontalen Rasterlinien in
        //! Pixeln
        DLLEXPORT void setRasterHeight(int hi);
        //! Rasterfarbe setzen
        //! \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setRasterFarbe(int f);
        //! Setzt die Intervall Breite
        //! \param br Der Abstand zwischen den Werten 0 und 1 auf der X Achse in
        //! Pixeln
        DLLEXPORT void setHIntervallBreite(double br);
        //! Setzt die Intervall H�he
        //! \param hi Der Abstand zwischen den Werten 0 und 1 auf der Y Achse in
        //! Pixeln
        DLLEXPORT void setVIntervallHeight(double hi);
        //! Setzt die Farbe der X Achse
        //! \param f Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setHIntervallFarbe(int f);
        //! Setzt die Farbe der Y Achse
        //! \param f Die Farbe im A8R8G8B8 Formats
        DLLEXPORT void setVIntervallFarbe(int f);
        //! Setzt den Namen der X Achse
        //! \param name Der Name
        DLLEXPORT void setHIntervallName(const char* name);
        //! Setzt den Namen der X Achse
        //! \param name Der Name
        DLLEXPORT void setHIntervallName(Text* name);
        //! Setzt den Namen der Y Achse
        //! \param name Der Name
        DLLEXPORT void setVIntervallName(const char* name);
        //! Setzt den Namen der Y Achse
        //! \param name Der Name
        DLLEXPORT void setVIntervallName(Text* name);
        //! Beschriftet einen Betimmten Wert der X Achse, falls der Flag
        //! HIntervallTexte in den DiagDaten gesetzt wurde \param hIntervall Der
        //! Wert, der beschriftet werden soll \param text Die Beschriftung
        DLLEXPORT void addHIntervallText(double hIntervall, const char* text);
        //! Beschriftet einen Betimmten Wert der X Achse, falls der Flag
        //! HIntervallTexte in den DiagDaten gesetzt wurde \param hIntervall Der
        //! Wert, der beschriftet werden soll \param text Die Beschriftung
        DLLEXPORT void addHIntervallText(double hIntervall, Text* text);
        //! setzt den Zeiger auf eine Beschriftung in einen Betimmten Wert der X
        //! Achse, falls der Flag HIntervallTexte in den DiagDaten gesetzt wurde
        //! \param hIntervall Der Wert, der beschriftet werden soll
        //! \param text Die Beschriftung
        DLLEXPORT void setHIntervallTextZ(double hIntervall, Text* text);
        //! �ndert eine Beschriftung in einen Betimmten Wert der X Achse, falls
        //! der Flag HIntervallTexte in den DiagDaten gesetzt wurde \param
        //! hIntervall Der Wert, der beschriftet werden soll \param text Die
        //! Beschriftung
        DLLEXPORT void setHIntervallText(double hIntervall, Text* text);
        //! �ndert eine Beschriftung in einen Betimmten Wert der X Achse, falls
        //! der Flag HIntervallTexte in den DiagDaten gesetzt wurde \param
        //! hIntervall Der Wert, der beschriftet werden soll \param text Die
        //! Beschriftung
        DLLEXPORT void setHIntervallText(double hIntervall, const char* text);
        //! Entfernt eine Beschriftung in einen Betimmten Wert der X Achse,
        //! falls der Flag HIntervallTexte in den DiagDaten gesetzt wurde \param
        //! hIntervall Der Wert, der nicht mehr beschriftet sein soll
        DLLEXPORT void removeHIntervallText(double hIntervall);
        //! Beschriftet einen Betimmten Wert der Y Achse, falls der Flag
        //! VIntervallTexte in den DiagDaten gesetzt wurde \param vIntervall Der
        //! Wert, der beschriftet werden soll \param text Die Beschriftung
        DLLEXPORT void addVIntervallText(double vIntervall, const char* text);
        //! Beschriftet einen Betimmten Wert der Y Achse, falls der Flag
        //! VIntervallTexte in den DiagDaten gesetzt wurde \param vIntervall Der
        //! Wert, der beschriftet werden soll \param text Die Beschriftung
        DLLEXPORT void addVIntervallText(double vIntervall, Text* text);
        //! setzt den Zeiger auf eine Beschriftung in einen Betimmten Wert der Y
        //! Achse, falls der Flag VIntervallTexte in den DiagDaten gesetzt wurde
        //! \param vIntervall Der Wert, der beschriftet werden soll
        //! \param text Die Beschriftung
        DLLEXPORT void setVIntervallTextZ(double vIntervall, Text* text);
        //! �ndert eine Beschriftung in einen Betimmten Wert der Y Achse, falls
        //! der Flag VIntervallTexte in den DiagDaten gesetzt wurde \param
        //! vIntervall Der Wert, der beschriftet werden soll \param text Die
        //! Beschriftung
        DLLEXPORT void setVIntervallText(double vIntervall, Text* text);
        //! �ndert eine Beschriftung in einen Betimmten Wert der Y Achse, falls
        //! der Flag VIntervallTexte in den DiagDaten gesetzt wurde \param
        //! vIntervall Der Wert, der beschriftet werden soll \param text Die
        //! Beschriftung
        DLLEXPORT void setVIntervallText(double vIntervall, const char* text);
        //! Entfernt eine Beschriftung in einen Betimmten Wert der Y Achse,
        //! falls der Flag VIntervallTexte in den DiagDaten gesetzt wurde \param
        //! vIntervall Der Wert, der nicht mehr beschriftet sein soll
        DLLEXPORT void removeVIntervallText(double vIntervall);
        //! F�gt einen im Diagramm dargestellten Wert (Graph) hinzu
        //! \param w Der neue Wert
        DLLEXPORT void addWertZ(DiagWert* w);
        //! F�gt einen im Diagramm dargestellten Wert (Graph) hinzu, indem ein
        //! anderer Kopiert wird \param w Der Wert, der Kopiert werden soll
        DLLEXPORT void addWert(DiagWert* w);
        //! F�gt einen im Diagramm dargestellten Wert (Graph) hinzu
        //! \param name Der Name des Wertes
        DLLEXPORT void addWert(const char* name);
        //! F�gt einen im Diagramm dargestellten Wert (Graph) hinzu
        //! \param name Der Name des Wertes
        DLLEXPORT void addWert(Text* txt);
        //! setzt die Farbe eines Wertes
        //! \param wNum Der Index des Wertes
        //! \param fc Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setWertFarbe(int wNum, int fc);
        //! f�gt einem Wert einen Punkt hinzu
        //! \param wNum Der Index des Wertes
        //! \param p Der neue Punkt
        DLLEXPORT void addPunktZ(int wNum, DiagPunkt* p);
        //! f�gt einem Wert einen Punkt hinzu, indem ein Punkt kopiert wird
        //! \param wNum Der Index des Wertes
        //! \param p Der Punkt, der kopiert werden soll
        DLLEXPORT void addPunkt(int wNum, DiagPunkt* p);
        //! F�gt einem Wert einen Punkt hinzu
        //! \param wNum Der Index des Wertes
        //! \param hI Der Wert des Punktes auf der X Achse
        //! \param vI Der Wert des Punktes auf der Y Achse
        DLLEXPORT void addPunkt(int wNum, double hI, double vI);
        //! Setzt einen Zeiger auf einen vorhandenen Punkt eines Wertes
        //! \param wNum Der Index des Wertes
        //! \param hI Der Wert des Punktes auf der X Achse, der ersetzt werden
        //! soll \param p Der neue Punkt
        DLLEXPORT void setPunktZ(int wNum, double hI, DiagPunkt* p);
        //! Setzt einen vorhandenen Punkt eines Wertes, indem ein Punkt kopiert
        //! wird \param wNum Der Index des Wertes \param hI Der Wert des Punktes
        //! auf der X Achse, der ersetzt werden soll \param p Der neue Punkt
        DLLEXPORT void setPunkt(int wNum, double hI, DiagPunkt* p);
        //! Setzt einen vorhandenen Punkt eines Wertes
        //! \param wNum Der Index des Wertes
        //! \param hI Der Wert des Punktes auf der X Achse, der ersetzt werden
        //! soll \param h Der Wert auf der X Achse des neuen Punktes \param v
        //! Der Wert auf der Y Achse des neuen Punktes
        DLLEXPORT void setPunkt(int wNum, double hI, double h, double v);
        //! Setzt einen Zeiger auf einen vorhandenen Punkt eines Wertes
        //! \param wNum Der Index des Wertes
        //! \param pNum Der Index des Punktes im Wert
        //! \param p Der neue Punkt
        DLLEXPORT void setPunktZ(int wNum, int pNum, DiagPunkt* p);
        //! Setzt einen vorhandenen Punkt eines Wertes, indem ein Punkt kopiert
        //! wird \param wNum Der Index des Wertes \param pNum Der Index des
        //! Punktes im Wert \param p Der neue Punkt
        DLLEXPORT void setPunkt(int wNum, int pNum, DiagPunkt* p);
        //! Setzt einen vorhandenen Punkt eines Wertes
        //! \param wNum Der Index des Wertes
        //! \param pNum Der Index des Punktes im Wert
        //! \param h Der Wert auf der X Achse des neuen Punktes
        //! \param v Der Wert auf der Y Achse des neuen Punktes
        DLLEXPORT void setPunkt(int wNum, int pNum, double h, double v);
        //! L�scht einen vorhandenen Punkt
        //! \param wNum Der Index des Wertes
        //! \param hI Der Wert auf der X Achse des Punktes, der gel�scht werden
        //! soll
        DLLEXPORT void removePunkt(int wNum, double hI);
        //! L�scht einen vorhandenen Punkt
        //! \param wNum Der Index des Wertes
        //! \param pNum Der Index des Punktes im Wert
        DLLEXPORT void removePunkt(int wNum, int pNum);
        //! entfernt einen Wert
        //! \param wNum Der Index des Wertes
        DLLEXPORT void removeWert(int wNum);
        //! entfernt einen Wert
        //! \param name Der Name des Wertes
        DLLEXPORT void removeWert(const char* name);
        //! entfernt einen Wert
        //! \param name Der Name des Wertes
        DLLEXPORT void removeWert(Text* name);
        //! F�gt den DiagDaten bestimmte Styles hinzu
        //! \param style Die neuen Styles
        DLLEXPORT void addDatenStyle(int style);
        //! Setzt die Styles der DiagDaten
        //! \param style Die neuen Styles
        DLLEXPORT void setDatenStyle(int style);
        //! Setzt die Styles der DiagDaten
        //! \param style Die Styles
        //! \param addRemove 1, falls die Styles hinzugef�gt werden sollem. 0,
        //! falls die Styles entfernt werden sollen
        DLLEXPORT void setDatenStyle(int style, bool addRemove);
        //! Entfernt Styles der DiagDaten
        //! \param style Die Styles, die entfernt werden sollen
        DLLEXPORT void removeDatenStyle(int style);
        //! F�gt einem bestimmten Wert bestimmte Styles hinzu
        //! \param wNum Der Index des Wertes
        //! \param style Die neuen Styles
        DLLEXPORT void addWertStyle(int wNum, int style);
        //! Setzt die Styles eines Bestimmten Wertes
        //! \param wNum Der Index des Wertes
        //! \param style Die neuen Styles
        DLLEXPORT void setWertStyle(int wNum, int style);
        //! Setzt die Styles eines Bestimmten Wertes
        //! \param wNum Der Index des Wertes
        //! \param style Die Styles
        //! \param addRemove 1, falls die Styles hinzugef�gt werden sollem. 0,
        //! falls die Styles entfernt werden sollen
        DLLEXPORT void setWertStyle(int wNum, int style, bool addRemove);
        //! Entfernt Styles eines Bestimmten Wertes
        //! \param wNum Der Index des Wertes
        //! \param style Die Styles, die entfernt werden sollen
        DLLEXPORT void removeWertStyle(int wNum, int style);
        //! Gibt die Daten des Diagramms zur�ck
        DLLEXPORT DiagDaten* getDiagDaten() const;
        //! Gibt die Daten des Diagramms ohne erh�hten Reference Counter zur�ck
        DLLEXPORT DiagDaten* zDiagDaten() const;
        //! Gibt die Daten eines Wertes zur�ck
        //! \param wNum Der Index des Wertes
        DLLEXPORT DiagWert* getDiagWert(int wNum) const;
        //! Gibt die Daten eines Wertes ohne erh�hten Reference Counter zur�ck
        //! \param wNum Der Index des Wertes
        DLLEXPORT DiagWert* zDiagWert(int wNum) const;
        //! Gibt die Daten eines Wertes zur�ck
        //! \param name Der Name des Wertes
        DLLEXPORT DiagWert* getDiagWert(const char* name) const;
        //! Gibt die Daten eines Wertes ohne erh�hten Reference Counter zur�ck
        //! \param name Der Name des Wertes
        DLLEXPORT DiagWert* zDiagWert(const char* name) const;
        //! Gibt den Index eines Wertes zur�ck
        //! \param name Der Name des Wertes
        DLLEXPORT int getDiagWertPos(const char* name) const;
        //! Gibt den Index eines Punktes von einem Wert zur�ck
        //! \param wNum Der Index des Wertes
        //! \param hI Der Wert auf der X Achse des Punktes
        DLLEXPORT int getDiagPunktPos(int wNum, double hI) const;
        //! Gibt den Index eines Punktes von einem Wert zur�ck
        //! \param wName Der Name des Wertes
        //! \param hI Der Wert auf der X Achse des Punktes
        DLLEXPORT int getDiagPunktPos(char* wName, double hI) const;
        //! Pr�ft, ob bestimmte Styles in den DiagDaten gesetzt wurden
        //! \param style Die Styles
        DLLEXPORT inline bool hatDatenStyle(int style) const;
        //! Pr�ft, ob bestimmte Styles in den DiagDaten nicht gesetzt wurden
        //! \param style Die Styles
        DLLEXPORT inline bool hatDatenStyleNicht(int style) const;
        //! Pr�ft, ob bestimmte Styles f�r einen bestimmten Wert gesetzt wurden
        //! \param wNum Der Index des Wertes
        //! \param style Die Styles
        DLLEXPORT inline bool hatWertStyle(int wNum, int style) const;
        //! Pr�ft, ob bestimmte Styles f�r einen bestimmten Wert nicht gesetzt
        //! wurden \param wNum Der Index des Wertes \param style Die Styles
        DLLEXPORT inline bool hatWertStyleNicht(int wNum, int style) const;
    };

    //! Eine Zeichnung des 2D GUI Frameworks, die die Diagrammdaten als
    //! Liniengraphen darstellt
    class LDiag : public ZeichnungHintergrund,
                  public BaseDiag
    {
    public:
        class Style : public ZeichnungHintergrund::Style
        {
        public:
            //! Legt fest, ob um die daten ein Rahmen
            //! gezeichnet wird
            static const __int64 DatenRahmen = 0x0001000;
            //! legt fest, ob die Daten einen Hintergrund haben
            static const __int64 DatenHintergrund = 0x02000;
            //! legt fest, ob beim zeichnen des Hintergrunds der
            //! Daten alpha blending benutzt wird
            static const __int64 DatenHAlpha = 0x04000;
            //! Legt fest, ob f�r den Hintergrund der Daten ein
            //! Bild verwendet werden soll
            static const __int64 DatenHBild = 0x008000;
            //! Legt fest, ob die Daten einen Farb�bergang haben
            static const __int64 DatenBuffered = 0x010000;

            //! Vereint die Flags VScroll und HScroll
            static const __int64 scroll = VScroll | HScroll;
            //! Vereint die Flags Hintergrund, scroll,
            //! DatenRahmen
            static const __int64 normal = Hintergrund | scroll | DatenRahmen;
        };

    private:
        TextRenderer* textRd;
        Rahmen* dRam;
        int dBgF;
        Bild* dBgB;
        AlphaFeld* dAf;
        Bild* vIntervallRB;
        Bild* hIntervallRB;
        int schriftGr;
        //! 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 LDiag();
        //! Destruktor
        DLLEXPORT virtual ~LDiag();
        //! Setzt den verwendeten TextRenderer
        //! \param textRd Der Textrenderer
        DLLEXPORT void setTextRendererZ(TextRenderer* textRd);
        //! Setzt die Schrift
        //! \param schrift Die Schrift
        DLLEXPORT void setSchriftZ(Schrift* schrift);
        //! Setzt die gr��e der Schrift
        //! \param gr Die H�he einer Zeile in Pixeln
        DLLEXPORT void setSchriftSize(int gr);
        //! Setzt den inneren Rahmen um das eigentliche Diagramm (Rahmen um die
        //! Daten) \param ram Der Rahmen
        DLLEXPORT void setDatenRahmenZ(Rahmen* ram);
        //! Setzt den inneren Rahmen um das eigentliche Diagramm (Rahmen um die
        //! Daten), indem ein Rahmen kopiert wird \param ram Der Rahmen, der
        //! kopiert werden soll
        DLLEXPORT void setDatenRahmen(Rahmen* ram);
        //! Setzt die Breite des inneren Rahmen um das eigentliche Diagramm
        //! (Rahmen um die Daten) \param br Die Breite in Pixeln
        DLLEXPORT void setDatenRahmenBreite(int br);
        //! Setzt die Farbe des inneren Rahmen um das eigentliche Diagramm
        //! (Rahmen um die Daten) \param fc Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setDatenRahmenFarbe(int fc);
        //! Setzt den Hintergrund des eigentlichen Diagramms
        DLLEXPORT void setDatenHintergrundFarbe(int fc);
        DLLEXPORT void setDatenHintergrundBildZ(Bild* b);
        DLLEXPORT void setDatenHintergrundBild(Bild* b);
        //! Setzt den Farb�bergang des eigentlichen Diagramms (Farb�bergang der
        //! Daten) \param af Der Farb�bergang
        DLLEXPORT void setDatenAlphaFeldZ(AlphaFeld* af);
        //! Setzt den Farb�bergang des eigentlichen Diagramms (Farb�bergang der
        //! Daten), indem ein Farb�bergang kopiert wird \param af Der
        //! Farb�bergang, der Kopiert werden soll
        DLLEXPORT void setDatenAlphaFeld(AlphaFeld* af);
        //! Setzt die Farbe des Farb�bergangs des eigentlichen Diagramms
        //! (Farb�bergang der Daten) \param fc Die Farbe im A8R8G8B8 Format
        DLLEXPORT void setDatenAlphaFeldFarbe(int fc);
        //! Setzt die FaSt�rkerbe des Farb�bergangs des eigentlichen Diagramms
        //! (Farb�bergang der Daten) \param st Die St�rke
        DLLEXPORT void setDatenAlphaFeldStrength(int st);
        //! 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 die Schrift zur�ck
        DLLEXPORT Schrift* getSchrift() const;
        //! Gibt die Schrift ohne erh�hten Reference Counter zur�ck
        DLLEXPORT Schrift* zSchrift() const;
        //! Gibt den inneren Rahmen um das eigentliche Diagramm zur�ck (Rahmen
        //! um die Daten)
        DLLEXPORT Rahmen* getDatenRahmen() const;
        //! Gibt den inneren Rahmen um das eigentliche Diagramm ohne erh�hten
        //! Reference Counter zur�ck (Rahmen um die Daten)
        DLLEXPORT Rahmen* zDatenRahmen() const;
        //! Gibt die Farbe des inneren Rahmens um das eigentliche Diagramm im
        //! A8R8G8B8 Format zur�ck (Rahmen um die Daten)
        DLLEXPORT int getDatenRahmenFarbe() const;
        //! Gibt die Breite des inneren Rahmens um das eigentliche Diagramm in
        //! Pixeln zur�ck (Rahmen um die Daten)
        DLLEXPORT int getDatenRahmenBreite() const;
        //! Gibt die Farbe des Hintergrunds des eigentlichen Diagramms im
        //! A8R8G8B8 Format zur�ck (Hintergrund der Daten)
        DLLEXPORT int getDatenHintergrundFarbe() const;
        //! Gibt das Hintergrund Bild des eigentlichen Diagramms zur�ck
        //! (Hintergrund Bild der Daten)
        DLLEXPORT Bild* getDatenHintergrundBild() const;
        //! Gibt das Hintergrund Bild des eigentlichen Diagramms ohne erh�hten
        //! Reference Counter zur�ck (Hintergrund Bild der Daten)
        DLLEXPORT Bild* zDatenHintergrundBild() const;
        //! Gibt den Farb�bergang des eigentlichen Diagramms zur�ck
        //! (Farb�bergang der Daten)
        DLLEXPORT AlphaFeld* getDatenAlphaFeld() const;
        //! Gibt den Farb�bergang des eigentlichen Diagramms ohne erh�hten
        //! Reference Counter zur�ck (Farb�bergang der Daten)
        DLLEXPORT AlphaFeld* zDatenAlphaFeld() const;
        //! Gibt die Farbe des Farb�bergangs des eigentlichen Diagramms im
        //! A8R8G8B8 Format zur�ck (Farb�bergang der Daten)
        DLLEXPORT int getDatenAlphaFeldFarbe() const;
        //! Gibt die St�rke des Farb�bergangs des eigentlichen Diagramms zur�ck
        //! (Farb�bergang der Daten)
        DLLEXPORT int getDatenAlphaFeldStrength() const;
    };
} // namespace Framework

#endif