Browse Source

rework of uiml view to support custom view elements

Kolja Strohm 2 years ago
parent
commit
475b70c25c
8 changed files with 1574 additions and 1332 deletions
  1. 2 0
      Fenster.cpp
  2. 570 568
      Fenster.h
  3. 1 1
      Framework Linux.vcxproj
  4. 2 2
      JSON.h
  5. 204 204
      UIInitialization.cpp
  6. 48 48
      UIInitialization.h
  7. 516 377
      UIMLView.cpp
  8. 231 132
      UIMLView.h

+ 2 - 0
Fenster.cpp

@@ -1930,6 +1930,8 @@ void Fenster::render( Bild& zRObj ) // zeichent nach zRObj
             rbr = rahmen->getRBreite();
         }
         int th = 0;
+        if (titel)
+            titel->setStyle(TextFeld::Style::Sichtbar, hatStyle(Style::Titel));
         if( hatStyle( Style::Titel ) && titel )
         {
             titel->setStyle( TextFeld::Style::Hintergrund, hatStyle( Style::TitelHintergrund ) );

+ 570 - 568
Fenster.h

@@ -6,583 +6,585 @@
 
 namespace Framework
 {
-    class VScrollBar; //! Scroll.h
-    class HScrollBar; //! Scroll.h
-    class TextFeld; //! TextFeld.h
-    class Rahmen; //! Rahmen.h
-    class Bildschirm; //! Bildschirm.h
-    class AlphaFeld; //! AlphaFeld.h
-    class Schrift; //! Schrift.h
-    class Text; //! Text.h
-    class Bild; //! Bild.h
-    class WFenster; //! aus dieser Datei
-    class WFensterArray; //! aus dieser Datei
-    class Fenster; //! aus dieser Datei
+	class VScrollBar; //! Scroll.h
+	class HScrollBar; //! Scroll.h
+	class TextFeld; //! TextFeld.h
+	class Rahmen; //! Rahmen.h
+	class Bildschirm; //! Bildschirm.h
+	class AlphaFeld; //! AlphaFeld.h
+	class Schrift; //! Schrift.h
+	class Text; //! Text.h
+	class Bild; //! Bild.h
+	class WFenster; //! aus dieser Datei
+	class WFensterArray; //! aus dieser Datei
+	class Fenster; //! aus dieser Datei
 #ifdef WIN32
-    //! Erzeugt eine normale Fensterklasse der Windows API
-    //! \param hInst Die HINSTANCE des Programms (Wird vom Framework an die Start funktion in der Startparam Struktur übergeben)
-    DLLEXPORT WNDCLASS F_Normal( HINSTANCE hInst );
-    //! Erzeugt eine normale Fensterklasse der Windows API
-    //! \param hInst Die HINSTANCE des Programms (Wird vom Framework an die Start funktion in der Startparam Struktur übergeben)
-    DLLEXPORT WNDCLASSEX F_NormalEx( HINSTANCE hInst );
-    //! Funktion des Frameworks, die alle Nachichten von Windows oder anderen Prozessen verarbeitet
-    DLLEXPORT LRESULT CALLBACK WindowProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam );
-    //! Startet eine Schleife, die die Benutzereingaben verarbeitet. Die Schleife läuft, bis irgendwo im Programm StopNachrichtenSchleife aufgerufen wird
-    DLLEXPORT void StartNachrichtenSchleife();
-    //! Stoppt die Ausführung der Nachrichten Schleife des Frameworks.
-    //! \param hwnd Ein Handle auf ein beliebiges Fenster des Frameworks, das Nachrichten empfangen kann. Wird benötigt, um eine Nachricht zu senden, damit die funktion StartNachrichtenSchleife nicht mehr wartet und sofort beendet wird
-    DLLEXPORT void StopNachrichtenSchleife( HWND hwnd );
-    //! Übersetzt einen Keycode, der von Windows gesendet wurde in den Buchstaben der gedrückten Taste
-    DLLEXPORT unsigned char VirtualZuChar( int Virtual );
+	//! Erzeugt eine normale Fensterklasse der Windows API
+	//! \param hInst Die HINSTANCE des Programms (Wird vom Framework an die Start funktion in der Startparam Struktur übergeben)
+	DLLEXPORT WNDCLASS F_Normal(HINSTANCE hInst);
+	//! Erzeugt eine normale Fensterklasse der Windows API
+	//! \param hInst Die HINSTANCE des Programms (Wird vom Framework an die Start funktion in der Startparam Struktur übergeben)
+	DLLEXPORT WNDCLASSEX F_NormalEx(HINSTANCE hInst);
+	//! Funktion des Frameworks, die alle Nachichten von Windows oder anderen Prozessen verarbeitet
+	DLLEXPORT LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
+	//! Startet eine Schleife, die die Benutzereingaben verarbeitet. Die Schleife läuft, bis irgendwo im Programm StopNachrichtenSchleife aufgerufen wird
+	DLLEXPORT void StartNachrichtenSchleife();
+	//! Stoppt die Ausführung der Nachrichten Schleife des Frameworks.
+	//! \param hwnd Ein Handle auf ein beliebiges Fenster des Frameworks, das Nachrichten empfangen kann. Wird benötigt, um eine Nachricht zu senden, damit die funktion StartNachrichtenSchleife nicht mehr wartet und sofort beendet wird
+	DLLEXPORT void StopNachrichtenSchleife(HWND hwnd);
+	//! Übersetzt einen Keycode, der von Windows gesendet wurde in den Buchstaben der gedrückten Taste
+	DLLEXPORT unsigned char VirtualZuChar(int Virtual);
 
-    //! Klasse für ein Fenster der Windows API
-    class WFenster : public virtual ReferenceCounter
-    {
-    private:
-        HWND hWnd; //! Handel zum Fenster
-        int style;
-        void* makParam;
-        void* sakParam;
-        void* takParam;
-        MausAktion mausAktion;
-        std::function< void( void*, void* ) > vCloseAktion;
-        std::function< void( void*, void* ) > nCloseAktion;
-        TastaturAktion tastaturAktion;
-        Bildschirm* screen;
-        int mx, my;
-        bool verschiebbar;
-        HWND rahmen;
-        HBITMAP bitmap;
-        HDC hdc;
+	//! Klasse für ein Fenster der Windows API
+	class WFenster : public virtual ReferenceCounter
+	{
+	private:
+		HWND hWnd; //! Handel zum Fenster
+		int style;
+		void* makParam;
+		void* sakParam;
+		void* takParam;
+		MausAktion mausAktion;
+		std::function< void(void*, void*) > vCloseAktion;
+		std::function< void(void*, void*) > nCloseAktion;
+		TastaturAktion tastaturAktion;
+		Bildschirm* screen;
+		int mx, my;
+		bool verschiebbar;
+		HWND rahmen;
+		HBITMAP bitmap;
+		HDC hdc;
 
-    public:
-        //--Konstruktor--
-        DLLEXPORT WFenster();
-        //--Konstruktor--
-        //! \param hwnd Ein Handle zum Fenster, das von dieser Klasse verwaltet werden soll
-        DLLEXPORT WFenster( HWND hWnd );
-        //--Destruktor--
-        DLLEXPORT ~WFenster();
-        //! erstellt das Fenster
-        //! \param style Der Style des Fensters. Beispiel: WS_OVERLAPPEDWINDOW (Für ein normales Fenster wie man es kennt)
-        //! \param wc Die Fensterklasse der Windows API, von der ein Fenster erstellt werden soll. Kann mit der Funktion F_Normal erstellt werden. Es muss lpszClassName gesetzt worden sein.
-        DLLEXPORT void erstellen( int style, WNDCLASS wc );
-        //! erstellt das Fenster
-        //! \param exStyle Der EX Style des Fensters. Beispiel: WS_EX_OVERLAPPEDWINDOW (Für ein normales Fenster wie man es kennt)
-        //! \param style Der Style des Fensters. Beispiel: WS_OVERLAPPEDWINDOW (Für ein normales Fenster wie man es kennt)
-        //! \param wc Die Fensterklasse der Windows API, von der ein Fenster erstellt werden soll. Kann mit der Funktion F_Normal erstellt werden. Es muss lpszClassName gesetzt worden sein.
-        DLLEXPORT void erstellenEx( int exStyle, int style, WNDCLASSEX wc );
-        //! Setzt den Anzeigemodus des Fensters
-        //! \param mod Der Modus. Beispiel: SW_SHOWNORMAL, um das Fenster anzuzeigen und SW_HIDE um es einzuklappen
-        DLLEXPORT void setAnzeigeModus( int mod );
-        //! Setzt den Fokus auf das Fenster, so dass Tastatureingaben empfangen werden
-        DLLEXPORT bool setFokus();
-        //! Setzt die Position des fensters auf dem Bildschirm
-        //! \param pos Die Position in Pixeln
-        DLLEXPORT void setPosition( Punkt& pos );
-        //! Setzt die Position des fensters auf dem Bildschirm
-        //! \param x Die X Position in Pixeln
-        //! \param y Die Y Position in Pixeln
-        DLLEXPORT void setPosition( int x, int y );
-        //! Setzt die Größe des Fensters auf dem Bildschirm
-        //! \param größe Die Größe in Pixeln
-        DLLEXPORT void setSize( Punkt& größe );
-        //! Setzt die Größe des Fensters auf dem Bildschirm
-        //! \param breite Die Breite in Pixeln
-        //! \param höhe Die Höhe in Pixeln
-        DLLEXPORT void setSize( int breite, int höhe );
-        //! Setzt die Position und die Größe des Fensters
-        //! \param pos Die Position in Pixeln
-        //! \param größe Die Größe in Pixeln
-        DLLEXPORT void setBounds( Punkt& pos, Punkt& größe );
-        //! Setzt das Verwendete Bildschirm Objekt, um Tastatur und Maus Eingaben an die Objekte des Frameworks weiterzugeben. Muss vor dem Zerstören des Fensters mit 0 aufgerufen werden.
-        //! \param screen Das Bildschirm Objekt
-        DLLEXPORT void setBildschirm( Bildschirm* screen );
-        //! Zerstört das Fenster
-        DLLEXPORT void zerstören();
-        //! Verarbeitet Maus Nachrichten. Ruft MausAktion auf und gibt die Ereignisse an den Bildschirm mit den Objekten weiter, wenn MausAktion 1 zurückgibt
-        //! \param me Das Ereignis, was durch die Mauseingabe ausgelößt wurde
-        DLLEXPORT void doMausAktion( MausEreignis& me );
-        //! Ruft die VSchließAktion Rückruffunktion auf
-        DLLEXPORT void doVSchließAktion();
-        //! Ruft die NSchließAktion Rückruffunktion auf
-        DLLEXPORT void doNSchließAktion();
-        //! Verarbeitet Tastatur Nachrichten. Ruft TastaturAktion auf und gibt die Ereignisse an den Bildschirm mit den Objekten weiter, wenn TastaturAktion 1 zurückgibt
-        //! \param me Das Ereignis, was durch die Tastatureingabe ausgelößt wurde
-        DLLEXPORT void doTastaturAktion( TastaturEreignis& et );
-        //! Macht den Rahmen des Fensters sichtbar, fals ladeRahmenFenster aufgerufen wurde
-        DLLEXPORT void doRestoreMessage();
-        //! setzt den Parameter, der bei einem Maus Ereignis an die Rückruffunktion übergeben wird
-        //! \param p Der Parameter
-        DLLEXPORT void setMausEreignisParameter( void* p );
-        //! setzt den Parameter, der beim Schließen an die Rückruffunktion übergeben wird
-        //! \param p Der Parameter
-        DLLEXPORT void setSchließEreignisParameter( void* p );
-        //! Setzt den Parameter, der bei einem Tastatur Ereignis an die Rückruffunktion übergeben wird
-        //! \param p Der Parameter
-        DLLEXPORT void setTastaturEreignisParameter( void* p );
-        //! Setzt die Rückruffunktion, die bei einem Maus Ereignis aufgerufen werden soll.
-        //! Wenn die Rückruffunktion 0 zurückgiebt, oder nicht gesetzt wurde, wird ein Maus Ereignis von dem Fenster nicht weiter beachtet
-        //! Es kann die Standartfunktion __ret1ME verwendet werden, die in MausEreignis.h definiert ist und immer 1 zurückgibt
-        //! \param ak Ein Zeiger auf die Rückruffunktion
-        DLLEXPORT void setMausAktion( MausAktion ak );
-        //! Setzt die Rückruffunktion, die bei vor dem Schließen aufgerufen werden soll.
-        //! \param ak Ein Zeiger auf die Rückruffunktion
-        DLLEXPORT void setVSchließAktion( std::function< void( void*, void* ) > ak );
-        //! Setzt die Rückruffunktion, die bei nach dem Schließen aufgerufen werden soll.
-        //! \param ak Ein Zeiger auf die Rückruffunktion
-        DLLEXPORT void setNSchließAktion( std::function< void( void*, void* ) > ak );
-        //! Setzt die Rückruffunktion, die bei einem Tastatur Ereignis aufgerufen werdne soll.
-        //! Wenn die Rückruffunktion 0 zurückgiebt, oder nicht gesetzt wurde, wird ein Tastatur Ereignis von der Zeichnung nicht weiter beachtet
-        //! Es kann die Standartfunktion __ret1TE verwendet werden, die in TastaturEreignis.h definiert ist und immer 1 zurückgibt
-        //! Weitere Standartfunktionen sind _nurNummernTE und _nurHexTE ebenfals aus TastaturEreignis.h
-        //! \param ak Ein Zeiger auf die Rückruffunktion
-        DLLEXPORT void setTastaturAktion( TastaturAktion ak );
-        //!  Setzt das Handle zum Fenster, das von dieser Klasse verwaltet werden soll
-        //! \param hwnd Das Handle
-        DLLEXPORT void setFensterHandle( HWND hWnd );
-        //! legt fest, ob das Fenster durch ziehen mit Maus verschoben werden kann
-        //! \param verschiebbar 1, wenn das Fenster verschoben werden darf
-        DLLEXPORT void setVerschiebbar( bool verschiebbar );
-        //! Setzt einen Transparenten Rahmen um das Fenster
-        //! \param zBild Ein Bild, was den Rahmen enthält
-        //! \param hins Die HINSTANCE des Programms (Wird vom Framework an die Start funktion in der Startparam Struktur übergeben)
-        DLLEXPORT void ladeRahmenFenster( Bild* zBild, HINSTANCE hinst ); //! setzt einen Transpatenten Rahmen um das Fenster
-        //! Gibt das Handle des verwalteten Fensters zurück
-        DLLEXPORT HWND getFensterHandle() const;
-        //! Gibt die Position des Fensters in Pixeln zurück
-        DLLEXPORT Punkt getPosition() const;
-        //! Gibt die Größe des Fensters in Pixeln zurück
-        DLLEXPORT Punkt getGröße() const;
-        //! Gibt die Größe des Fensterkörpers in Pixeln zurück
-        DLLEXPORT Punkt getKörperGröße() const;
-        //! Gibt die Breite des Fensterkörpers in Pixeln zurück
-        DLLEXPORT int getKörperBreite() const;
-        //! Gibt die Höhe des Fensterkörpers in Pixeln zurück
-        DLLEXPORT int getKörperHöhe() const;
-        //! Gibt zurück, ob eine Rückruffunktion für ein MausEreignis gesetzt wurde
-        DLLEXPORT bool hatMausAktion() const;
-        //! Gibt zurück, ob eine Rückruffunktion für das Ereignis vor dem Schließen des Fensters gesetzt wurde
-        DLLEXPORT bool hatVSchließAktion() const;
-        //! Gibt zurück, ob eine Rückruffunktion für das Ereignis nach dem Schließen des Fensters gesetzt wurde
-        DLLEXPORT bool hatNSchließAktion() const;
-        //! Gibt zurück, ob eine Rückruffunktion für ein TastaturEreignis gesetzt wurde
-        DLLEXPORT bool hatTastaturAktion() const;
-        //! Gibt den Bidschirm zurück, an dessen Zeichnungen die Ereignisse Weitergegeben werden
-        DLLEXPORT Bildschirm* getBildschirm() const;
-        //! Gibt den Bildschirm ohne erhöhten Reference Counter zurück, an dessen Zeichnungen die Ereignisse Weitergegeben werden
-        DLLEXPORT Bildschirm* zBildschirm() const;
-        //! Gibt zurück, ob das Fenster verschiebbar ist
-        DLLEXPORT bool istVerschiebbar() const;
-    };
+	public:
+		//--Konstruktor--
+		DLLEXPORT WFenster();
+		//--Konstruktor--
+		//! \param hwnd Ein Handle zum Fenster, das von dieser Klasse verwaltet werden soll
+		DLLEXPORT WFenster(HWND hWnd);
+		//--Destruktor--
+		DLLEXPORT ~WFenster();
+		//! erstellt das Fenster
+		//! \param style Der Style des Fensters. Beispiel: WS_OVERLAPPEDWINDOW (Für ein normales Fenster wie man es kennt)
+		//! \param wc Die Fensterklasse der Windows API, von der ein Fenster erstellt werden soll. Kann mit der Funktion F_Normal erstellt werden. Es muss lpszClassName gesetzt worden sein.
+		DLLEXPORT void erstellen(int style, WNDCLASS wc);
+		//! erstellt das Fenster
+		//! \param exStyle Der EX Style des Fensters. Beispiel: WS_EX_OVERLAPPEDWINDOW (Für ein normales Fenster wie man es kennt)
+		//! \param style Der Style des Fensters. Beispiel: WS_OVERLAPPEDWINDOW (Für ein normales Fenster wie man es kennt)
+		//! \param wc Die Fensterklasse der Windows API, von der ein Fenster erstellt werden soll. Kann mit der Funktion F_Normal erstellt werden. Es muss lpszClassName gesetzt worden sein.
+		DLLEXPORT void erstellenEx(int exStyle, int style, WNDCLASSEX wc);
+		//! Setzt den Anzeigemodus des Fensters
+		//! \param mod Der Modus. Beispiel: SW_SHOWNORMAL, um das Fenster anzuzeigen und SW_HIDE um es einzuklappen
+		DLLEXPORT void setAnzeigeModus(int mod);
+		//! Setzt den Fokus auf das Fenster, so dass Tastatureingaben empfangen werden
+		DLLEXPORT bool setFokus();
+		//! Setzt die Position des fensters auf dem Bildschirm
+		//! \param pos Die Position in Pixeln
+		DLLEXPORT void setPosition(Punkt& pos);
+		//! Setzt die Position des fensters auf dem Bildschirm
+		//! \param x Die X Position in Pixeln
+		//! \param y Die Y Position in Pixeln
+		DLLEXPORT void setPosition(int x, int y);
+		//! Setzt die Größe des Fensters auf dem Bildschirm
+		//! \param größe Die Größe in Pixeln
+		DLLEXPORT void setSize(Punkt& größe);
+		//! Setzt die Größe des Fensters auf dem Bildschirm
+		//! \param breite Die Breite in Pixeln
+		//! \param höhe Die Höhe in Pixeln
+		DLLEXPORT void setSize(int breite, int höhe);
+		//! Setzt die Position und die Größe des Fensters
+		//! \param pos Die Position in Pixeln
+		//! \param größe Die Größe in Pixeln
+		DLLEXPORT void setBounds(Punkt& pos, Punkt& größe);
+		//! Setzt das Verwendete Bildschirm Objekt, um Tastatur und Maus Eingaben an die Objekte des Frameworks weiterzugeben. Muss vor dem Zerstören des Fensters mit 0 aufgerufen werden.
+		//! \param screen Das Bildschirm Objekt
+		DLLEXPORT void setBildschirm(Bildschirm* screen);
+		//! Zerstört das Fenster
+		DLLEXPORT void zerstören();
+		//! Verarbeitet Maus Nachrichten. Ruft MausAktion auf und gibt die Ereignisse an den Bildschirm mit den Objekten weiter, wenn MausAktion 1 zurückgibt
+		//! \param me Das Ereignis, was durch die Mauseingabe ausgelößt wurde
+		DLLEXPORT void doMausAktion(MausEreignis& me);
+		//! Ruft die VSchließAktion Rückruffunktion auf
+		DLLEXPORT void doVSchließAktion();
+		//! Ruft die NSchließAktion Rückruffunktion auf
+		DLLEXPORT void doNSchließAktion();
+		//! Verarbeitet Tastatur Nachrichten. Ruft TastaturAktion auf und gibt die Ereignisse an den Bildschirm mit den Objekten weiter, wenn TastaturAktion 1 zurückgibt
+		//! \param me Das Ereignis, was durch die Tastatureingabe ausgelößt wurde
+		DLLEXPORT void doTastaturAktion(TastaturEreignis& et);
+		//! Macht den Rahmen des Fensters sichtbar, fals ladeRahmenFenster aufgerufen wurde
+		DLLEXPORT void doRestoreMessage();
+		//! setzt den Parameter, der bei einem Maus Ereignis an die Rückruffunktion übergeben wird
+		//! \param p Der Parameter
+		DLLEXPORT void setMausEreignisParameter(void* p);
+		//! setzt den Parameter, der beim Schließen an die Rückruffunktion übergeben wird
+		//! \param p Der Parameter
+		DLLEXPORT void setSchließEreignisParameter(void* p);
+		//! Setzt den Parameter, der bei einem Tastatur Ereignis an die Rückruffunktion übergeben wird
+		//! \param p Der Parameter
+		DLLEXPORT void setTastaturEreignisParameter(void* p);
+		//! Setzt die Rückruffunktion, die bei einem Maus Ereignis aufgerufen werden soll.
+		//! Wenn die Rückruffunktion 0 zurückgiebt, oder nicht gesetzt wurde, wird ein Maus Ereignis von dem Fenster nicht weiter beachtet
+		//! Es kann die Standartfunktion __ret1ME verwendet werden, die in MausEreignis.h definiert ist und immer 1 zurückgibt
+		//! \param ak Ein Zeiger auf die Rückruffunktion
+		DLLEXPORT void setMausAktion(MausAktion ak);
+		//! Setzt die Rückruffunktion, die bei vor dem Schließen aufgerufen werden soll.
+		//! \param ak Ein Zeiger auf die Rückruffunktion
+		DLLEXPORT void setVSchließAktion(std::function< void(void*, void*) > ak);
+		//! Setzt die Rückruffunktion, die bei nach dem Schließen aufgerufen werden soll.
+		//! \param ak Ein Zeiger auf die Rückruffunktion
+		DLLEXPORT void setNSchließAktion(std::function< void(void*, void*) > ak);
+		//! Setzt die Rückruffunktion, die bei einem Tastatur Ereignis aufgerufen werdne soll.
+		//! Wenn die Rückruffunktion 0 zurückgiebt, oder nicht gesetzt wurde, wird ein Tastatur Ereignis von der Zeichnung nicht weiter beachtet
+		//! Es kann die Standartfunktion __ret1TE verwendet werden, die in TastaturEreignis.h definiert ist und immer 1 zurückgibt
+		//! Weitere Standartfunktionen sind _nurNummernTE und _nurHexTE ebenfals aus TastaturEreignis.h
+		//! \param ak Ein Zeiger auf die Rückruffunktion
+		DLLEXPORT void setTastaturAktion(TastaturAktion ak);
+		//!  Setzt das Handle zum Fenster, das von dieser Klasse verwaltet werden soll
+		//! \param hwnd Das Handle
+		DLLEXPORT void setFensterHandle(HWND hWnd);
+		//! legt fest, ob das Fenster durch ziehen mit Maus verschoben werden kann
+		//! \param verschiebbar 1, wenn das Fenster verschoben werden darf
+		DLLEXPORT void setVerschiebbar(bool verschiebbar);
+		//! Setzt einen Transparenten Rahmen um das Fenster
+		//! \param zBild Ein Bild, was den Rahmen enthält
+		//! \param hins Die HINSTANCE des Programms (Wird vom Framework an die Start funktion in der Startparam Struktur übergeben)
+		DLLEXPORT void ladeRahmenFenster(Bild* zBild, HINSTANCE hinst); //! setzt einen Transpatenten Rahmen um das Fenster
+		//! Gibt das Handle des verwalteten Fensters zurück
+		DLLEXPORT HWND getFensterHandle() const;
+		//! Gibt die Position des Fensters in Pixeln zurück
+		DLLEXPORT Punkt getPosition() const;
+		//! Gibt die Größe des Fensters in Pixeln zurück
+		DLLEXPORT Punkt getGröße() const;
+		//! Gibt die Größe des Fensterkörpers in Pixeln zurück
+		DLLEXPORT Punkt getKörperGröße() const;
+		//! Gibt die Breite des Fensterkörpers in Pixeln zurück
+		DLLEXPORT int getKörperBreite() const;
+		//! Gibt die Höhe des Fensterkörpers in Pixeln zurück
+		DLLEXPORT int getKörperHöhe() const;
+		//! Gibt zurück, ob eine Rückruffunktion für ein MausEreignis gesetzt wurde
+		DLLEXPORT bool hatMausAktion() const;
+		//! Gibt zurück, ob eine Rückruffunktion für das Ereignis vor dem Schließen des Fensters gesetzt wurde
+		DLLEXPORT bool hatVSchließAktion() const;
+		//! Gibt zurück, ob eine Rückruffunktion für das Ereignis nach dem Schließen des Fensters gesetzt wurde
+		DLLEXPORT bool hatNSchließAktion() const;
+		//! Gibt zurück, ob eine Rückruffunktion für ein TastaturEreignis gesetzt wurde
+		DLLEXPORT bool hatTastaturAktion() const;
+		//! Gibt den Bidschirm zurück, an dessen Zeichnungen die Ereignisse Weitergegeben werden
+		DLLEXPORT Bildschirm* getBildschirm() const;
+		//! Gibt den Bildschirm ohne erhöhten Reference Counter zurück, an dessen Zeichnungen die Ereignisse Weitergegeben werden
+		DLLEXPORT Bildschirm* zBildschirm() const;
+		//! Gibt zurück, ob das Fenster verschiebbar ist
+		DLLEXPORT bool istVerschiebbar() const;
+	};
 
-    //! Verwaltet alle Windows API Fenster im Framework
-    class WFensterArray
-    {
-    private:
-        WFensterArray* next;
-        WFenster* This;
+	//! Verwaltet alle Windows API Fenster im Framework
+	class WFensterArray
+	{
+	private:
+		WFensterArray* next;
+		WFenster* This;
 
-    public:
-        //! Konstruktor 
-        DLLEXPORT WFensterArray();
-        //! Destruktor 
-        DLLEXPORT ~WFensterArray();
-        //! Fügt ein neues Fenster hinzu
-        //! \param fenster Das Fenster
-        DLLEXPORT bool addFenster( WFenster* fenster );
-        //! Entfernt ein Fenster
-        //! \param fenster Das Fenster
-        DLLEXPORT bool removeFenster( WFenster* fenster );
-        //! gibt das nächste Element zurück
-        DLLEXPORT WFensterArray* getNext();
-        //! Setzt das nächste Element auf 0
-        DLLEXPORT void setNext0();
-        //! Löscht das Element
-        DLLEXPORT void del();
-        //! Sendet das Ereignis, was vor dem Schließen aufgerufen wird an ein bestimmtes Fenster
-        //! \param hWnd Das Handle zum Fenster
-        DLLEXPORT bool sendVSchließMessage( HWND hWnd );
-        //! Sendet das Ereignis, was nach dem Schließen aufgerufen wird an ein bestimmtes Fenster
-        //! \param hWnd Das Handle zum Fenster
-        DLLEXPORT bool sendNSchließMessage( HWND hwnd );
-        //! Sendet ein Maus Ereignis an ein bestimmtes Fenster
-        //! \param hWnd Das Handle zum Fenster
-        //! \param me Das Ereignis, was durch die Mauseingabe ausgelößt wurde
-        DLLEXPORT bool sendMausMessage( HWND hWnd, MausEreignis& me );
-        //! Sendet ein Tastatur Ereignis an ein bestimmtes Fenster
-        //! \param hWnd Das Handle zum Fenster
-        //! \param me Das Ereignis, was durch die Tastatureingabe ausgelößt wurde
-        DLLEXPORT bool sendTastaturMessage( HWND hwnd, TastaturEreignis& te );
-        //! Sendet das Ereignis, was durch das öffnen des Fensters ausgelößt wurde an ein bestimmtes Fenster
-        //! \param hWnd Das Handle zum Fenster
-        DLLEXPORT bool sendRestoreMessage( HWND hwnd );
-        //! Gibt das Fenster dieses Eintrags zurück
-        DLLEXPORT WFenster* getThis();
-    };
+	public:
+		//! Konstruktor 
+		DLLEXPORT WFensterArray();
+		//! Destruktor 
+		DLLEXPORT ~WFensterArray();
+		//! Fügt ein neues Fenster hinzu
+		//! \param fenster Das Fenster
+		DLLEXPORT bool addFenster(WFenster* fenster);
+		//! Entfernt ein Fenster
+		//! \param fenster Das Fenster
+		DLLEXPORT bool removeFenster(WFenster* fenster);
+		//! gibt das nächste Element zurück
+		DLLEXPORT WFensterArray* getNext();
+		//! Setzt das nächste Element auf 0
+		DLLEXPORT void setNext0();
+		//! Löscht das Element
+		DLLEXPORT void del();
+		//! Sendet das Ereignis, was vor dem Schließen aufgerufen wird an ein bestimmtes Fenster
+		//! \param hWnd Das Handle zum Fenster
+		DLLEXPORT bool sendVSchließMessage(HWND hWnd);
+		//! Sendet das Ereignis, was nach dem Schließen aufgerufen wird an ein bestimmtes Fenster
+		//! \param hWnd Das Handle zum Fenster
+		DLLEXPORT bool sendNSchließMessage(HWND hwnd);
+		//! Sendet ein Maus Ereignis an ein bestimmtes Fenster
+		//! \param hWnd Das Handle zum Fenster
+		//! \param me Das Ereignis, was durch die Mauseingabe ausgelößt wurde
+		DLLEXPORT bool sendMausMessage(HWND hWnd, MausEreignis& me);
+		//! Sendet ein Tastatur Ereignis an ein bestimmtes Fenster
+		//! \param hWnd Das Handle zum Fenster
+		//! \param me Das Ereignis, was durch die Tastatureingabe ausgelößt wurde
+		DLLEXPORT bool sendTastaturMessage(HWND hwnd, TastaturEreignis& te);
+		//! Sendet das Ereignis, was durch das öffnen des Fensters ausgelößt wurde an ein bestimmtes Fenster
+		//! \param hWnd Das Handle zum Fenster
+		DLLEXPORT bool sendRestoreMessage(HWND hwnd);
+		//! Gibt das Fenster dieses Eintrags zurück
+		DLLEXPORT WFenster* getThis();
+	};
 
-    //! Erzeugt ein Windows API Popup Fenster, mit einer Meldung
-    //! \param hWnd Ein Handle zu dem Fenster, was blockiert werden soll, bis das Popup Fenster geschlossen wurde. Kann 0 sein
-    //! \param titel Der Titel des Popup Fensters
-    //! \param meldung Die Meldung, die im Fenster angezeigt werden soll
-    //! \param style Bestimmt das Icon, was im Fenster angezeigt wird. Beispiel: MB_ICONERROR, MB_ICONINFORMATION
-    DLLEXPORT void WMessageBox( HWND hWnd, Text* titel, Text* meldung, UINT style );
+	//! Erzeugt ein Windows API Popup Fenster, mit einer Meldung
+	//! \param hWnd Ein Handle zu dem Fenster, was blockiert werden soll, bis das Popup Fenster geschlossen wurde. Kann 0 sein
+	//! \param titel Der Titel des Popup Fensters
+	//! \param meldung Die Meldung, die im Fenster angezeigt werden soll
+	//! \param style Bestimmt das Icon, was im Fenster angezeigt wird. Beispiel: MB_ICONERROR, MB_ICONINFORMATION
+	DLLEXPORT void WMessageBox(HWND hWnd, Text* titel, Text* meldung, UINT style);
 #endif
-    //! Fenster Klasse im Programm
-    class Fenster : public Zeichnung
-    {
-    public:
-        class Style : public Zeichnung::Style
-        {
-        public:
-            const static __int64 BodyHintergrund = 0x000000008; //! Legt fest, ob der Körper des Fensters einen Hintergrund hat
-            const static __int64 BodyHAlpha = 0x000000010; //! Legt fest, ob beim zeichnen des Körperhintergrundes alpha blending verwendet werden soll
-            const static __int64 BodyHBild = 0x000000020; //! Legt fest, ob ein Bild als Hintergrund des Körpers verwendet werden soll
-            const static __int64 BodyBuffered = 0x000000040; //! Legt fest, ob der Körper einen Farbübergang besitzt
-            const static __int64 Titel = 0x000000080; //! Legt fest, ob das Fenster eine Titelleiste hat
-            const static __int64 TitelHintergrund = 0x000000100; //! Legt fest, ob die titelleiste des Fensters einen Hintergrund hat
-            const static __int64 TitelHAlpha = 0x000000200; //! Legt fest, ob zum zeichnen des Titel Hintergrundes alpha blending verwendet werden soll
-            const static __int64 TitelHBild = 0x000000400; //! Legt fest, ob für den Titelhintergrund ein Bild verwendet werden soll
-            const static __int64 TitelBuffered = 0x000000800; //! Legt fest, ob die Titel Leiste einen Farbübergang besitzt
-            const static __int64 Closable = 0x000001000; //! Legt fest, ob in der Titelleiste ein Knopf zum Schließen des Fensters angezeigt werden soll
-            const static __int64 ClosingHintergrund = 0x000002000; //! Legt fest, ob der Schließen Knopf einen Hintergrund hat
-            const static __int64 ClosingHAlpha = 0x000004000; //! Legt fest, ob beim Zeichnen des Hintergrunds des Schließen Knopfes alpha blending verwendet werden soll
-            const static __int64 ClosingHBild = 0x000008000; //! Legt fest, ob für den Hintergrund des Schließen Knopfes ein Bild verwendet werden soll
-            const static __int64 ClosingBuffer = 0x000010000; //! Legt fest, ob der Schließen Knopf einen Farbübergang besitzt
-            const static __int64 ClosingKlickBuffer = 0x000020000; //! Legt fest, ob der Schließen Knopf einen Farbübergang besitzt, während er gedrückt wird
-            const static __int64 Beweglich = 0x000040000; //! Legt fest, ob der Benutzer das Fenster durch gedrückt halten der linken Maustaste in der Titelleiste das Fenster verschieben kann
-            const static __int64 BreiteChangeable = 0x000080000; //! Legt fest, ob der Benutzer die Breite des Fensters durch das gedrückt halten der linken Maustaste auf dem rechten oder linken Fensterrand verändern kann
-            const static __int64 HeightChangeable = 0x000100000;  //! Legt fest, ob der Benutzer die Höhe des Fensters durch das gedrückt halten der linken Maustaste auf dem oberen oder unteren Fensterrand verändern kann
-            const static __int64 TitelHeightChangeable = 0x000200000; //! Legt fest, ob der Benutzer die Höhe der Titel Leiste durch gedrückt halten der linken Maustaste auf dem unteren Rand der Titelleiste verändern kann
-            const static __int64 MinBr = 0x000400000; //! Legt fest, ob es eine Minimale Breite des Fensters gibt
-            const static __int64 MaxBr = 0x000800000; //! Legt fest, ob es eine Maximale Breite des Fensters gibt
-            const static __int64 MinHi = 0x001000000; //! Legt fest, ob es eine Minimale Höhe des Fensters gibt
-            const static __int64 MaxHi = 0x002000000; //! Legt fest, ob es eine Maximale Höhe des Fensters gibt
-            const static __int64 BodyMinBr = 0x004000000; //! Legt fest, ob es eine Minimale Breite des Körpers gibt
-            const static __int64 BodyMaxBr = 0x008000000; //! Legt fest, ob es eine Maximale Breite des Körpers gibt
-            const static __int64 BodyMinHi = 0x010000000; //! Legt fest, ob es eine Minimale Höhe des Körpers gibt
-            const static __int64 BodyMaxHi = 0x020000000; //! Legt fest, ob es eine Maximale Höhe des Körpers gibt
-            const static __int64 VScroll = 0x040000000; //! Legt fest, ob eine ScrollBar am rechten Fensterrand erscheinen soll
-            const static __int64 HScroll = 0x080000000; //! Legt fest, ob eine ScrollBar am unteren Fensterrand erscheinen soll
-            const static __int64 METransparenz = 0x100000000; //! Legt fest, ob die Mausereignisse auch noch von Zeichnungen hinter dem Fenster verarbeitet werden sollen
-            const static __int64 Rahmen = 0x200000000; //! Legt fest, ob das Fenster einen Rahmen haben soll
+	//! Fenster Klasse im Programm
+	class Fenster : public Zeichnung
+	{
+	public:
+		class Style : public Zeichnung::Style
+		{
+		public:
+			const static __int64 BodyHintergrund = 0x000000008; //! Legt fest, ob der Körper des Fensters einen Hintergrund hat
+			const static __int64 BodyHAlpha = 0x000000010; //! Legt fest, ob beim zeichnen des Körperhintergrundes alpha blending verwendet werden soll
+			const static __int64 BodyHBild = 0x000000020; //! Legt fest, ob ein Bild als Hintergrund des Körpers verwendet werden soll
+			const static __int64 BodyBuffered = 0x000000040; //! Legt fest, ob der Körper einen Farbübergang besitzt
+			const static __int64 Titel = 0x000000080; //! Legt fest, ob das Fenster eine Titelleiste hat
+			const static __int64 TitelHintergrund = 0x000000100; //! Legt fest, ob die titelleiste des Fensters einen Hintergrund hat
+			const static __int64 TitelHAlpha = 0x000000200; //! Legt fest, ob zum zeichnen des Titel Hintergrundes alpha blending verwendet werden soll
+			const static __int64 TitelHBild = 0x000000400; //! Legt fest, ob für den Titelhintergrund ein Bild verwendet werden soll
+			const static __int64 TitelBuffered = 0x000000800; //! Legt fest, ob die Titel Leiste einen Farbübergang besitzt
+			const static __int64 Closable = 0x000001000; //! Legt fest, ob in der Titelleiste ein Knopf zum Schließen des Fensters angezeigt werden soll
+			const static __int64 ClosingHintergrund = 0x000002000; //! Legt fest, ob der Schließen Knopf einen Hintergrund hat
+			const static __int64 ClosingHAlpha = 0x000004000; //! Legt fest, ob beim Zeichnen des Hintergrunds des Schließen Knopfes alpha blending verwendet werden soll
+			const static __int64 ClosingHBild = 0x000008000; //! Legt fest, ob für den Hintergrund des Schließen Knopfes ein Bild verwendet werden soll
+			const static __int64 ClosingBuffer = 0x000010000; //! Legt fest, ob der Schließen Knopf einen Farbübergang besitzt
+			const static __int64 ClosingKlickBuffer = 0x000020000; //! Legt fest, ob der Schließen Knopf einen Farbübergang besitzt, während er gedrückt wird
+			const static __int64 Beweglich = 0x000040000; //! Legt fest, ob der Benutzer das Fenster durch gedrückt halten der linken Maustaste in der Titelleiste das Fenster verschieben kann
+			const static __int64 BreiteChangeable = 0x000080000; //! Legt fest, ob der Benutzer die Breite des Fensters durch das gedrückt halten der linken Maustaste auf dem rechten oder linken Fensterrand verändern kann
+			const static __int64 HeightChangeable = 0x000100000;  //! Legt fest, ob der Benutzer die Höhe des Fensters durch das gedrückt halten der linken Maustaste auf dem oberen oder unteren Fensterrand verändern kann
+			const static __int64 TitelHeightChangeable = 0x000200000; //! Legt fest, ob der Benutzer die Höhe der Titel Leiste durch gedrückt halten der linken Maustaste auf dem unteren Rand der Titelleiste verändern kann
+			const static __int64 MinBr = 0x000400000; //! Legt fest, ob es eine Minimale Breite des Fensters gibt
+			const static __int64 MaxBr = 0x000800000; //! Legt fest, ob es eine Maximale Breite des Fensters gibt
+			const static __int64 MinHi = 0x001000000; //! Legt fest, ob es eine Minimale Höhe des Fensters gibt
+			const static __int64 MaxHi = 0x002000000; //! Legt fest, ob es eine Maximale Höhe des Fensters gibt
+			const static __int64 BodyMinBr = 0x004000000; //! Legt fest, ob es eine Minimale Breite des Körpers gibt
+			const static __int64 BodyMaxBr = 0x008000000; //! Legt fest, ob es eine Maximale Breite des Körpers gibt
+			const static __int64 BodyMinHi = 0x010000000; //! Legt fest, ob es eine Minimale Höhe des Körpers gibt
+			const static __int64 BodyMaxHi = 0x020000000; //! Legt fest, ob es eine Maximale Höhe des Körpers gibt
+			const static __int64 VScroll = 0x040000000; //! Legt fest, ob eine ScrollBar am rechten Fensterrand erscheinen soll
+			const static __int64 HScroll = 0x080000000; //! Legt fest, ob eine ScrollBar am unteren Fensterrand erscheinen soll
+			const static __int64 METransparenz = 0x100000000; //! Legt fest, ob die Mausereignisse auch noch von Zeichnungen hinter dem Fenster verarbeitet werden sollen
+			const static __int64 Rahmen = 0x200000000; //! Legt fest, ob das Fenster einen Rahmen haben soll
 
-            const static __int64 min_max = MinHi | MaxHi | MaxBr | MaxHi; //! Vereint die Flags MinHö, MaxHö, MaxBr, MaxHö
-            const static __int64 body_min_max = BodyMinBr | BodyMaxBr | BodyMinHi | BodyMaxBr; //! Vereint die Flags Körper_minBr, Körper_maxBr, Körper_minHö, Körper_maxBr
-            const static __int64 scroll = VScroll | HScroll; //! Vereint die Flags VScroll, HScroll
-            const static __int64 nichtfixiert = TitelHeightChangeable | HeightChangeable | BreiteChangeable | Beweglich; //! Vereint die Flags TitelHöheÄnderbar, HöheÄnderbar, BreiteÄnderbar, Beweglich
+			const static __int64 min_max = MinHi | MaxHi | MaxBr | MaxHi; //! Vereint die Flags MinHö, MaxHö, MaxBr, MaxHö
+			const static __int64 body_min_max = BodyMinBr | BodyMaxBr | BodyMinHi | BodyMaxBr; //! Vereint die Flags Körper_minBr, Körper_maxBr, Körper_minHö, Körper_maxBr
+			const static __int64 scroll = VScroll | HScroll; //! Vereint die Flags VScroll, HScroll
+			const static __int64 nichtfixiert = TitelHeightChangeable | HeightChangeable | BreiteChangeable | Beweglich; //! Vereint die Flags TitelHöheÄnderbar, HöheÄnderbar, BreiteÄnderbar, Beweglich
 
-            const static __int64 normal = Sichtbar | Erlaubt | Rahmen | Titel | TitelBuffered | Closable | ClosingHBild | ClosingKlickBuffer | Beweglich | MEIgnoreVerarbeitet | MEIgnoreSichtbar | MEIgnoreParentInside | MEIgnoreInside; //! Vereint die Flags Sichtbar, Erlaubt, Rahmen, Titel, TitelBuffered, Schließbar, SchließHBild, SchließKlickBuffer, Beweglich
-        };
-    private:
-        MausAktion closingMe;
-        void* closingMeParam;
-        Rahmen* rahmen;
-        TextFeld* titel;
-        RCArray<Zeichnung>* members;
-        int bgBodyColor;
-        Bild* bgBodyPicture;
-        AlphaFeld* bodyBuffer;
-        int bgClosingFarbe;
-        Bild* bgClosingBild;
-        AlphaFeld* closeBuffer;
-        AlphaFeld* closeKlickBuffer;
-        VScrollBar* vScroll;
-        HScrollBar* hScroll;
-        Punkt min, max;
-        Punkt kMin, kMax;
-        bool closeKlick, klick;
-        int moving;
-        int mx, my;
-        //! Verarbeitet Maus Nachrichten
-        //! \param me Das Ereignis, was durch die Mauseingabe ausgelößt wurde
-        DLLEXPORT void doMausEreignis( MausEreignis& me, bool userRet ) override;
+			const static __int64 normal = Sichtbar | Erlaubt | Rahmen | Titel | TitelBuffered | Closable | ClosingHBild | ClosingKlickBuffer | Beweglich | MEIgnoreVerarbeitet | MEIgnoreSichtbar | MEIgnoreParentInside | MEIgnoreInside; //! Vereint die Flags Sichtbar, Erlaubt, Rahmen, Titel, TitelBuffered, Schließbar, SchließHBild, SchließKlickBuffer, Beweglich
+		};
+	private:
+		MausAktion closingMe;
+		void* closingMeParam;
+		Rahmen* rahmen;
+		TextFeld* titel;
+		RCArray<Zeichnung>* members;
+		int bgBodyColor;
+		Bild* bgBodyPicture;
+		AlphaFeld* bodyBuffer;
+		int bgClosingFarbe;
+		Bild* bgClosingBild;
+		AlphaFeld* closeBuffer;
+		AlphaFeld* closeKlickBuffer;
+		VScrollBar* vScroll;
+		HScrollBar* hScroll;
+		Punkt min, max;
+		Punkt kMin, kMax;
+		bool closeKlick, klick;
+		int moving;
+		int mx, my;
 
-    public:
-        //! Konstruktor 
-        DLLEXPORT Fenster();
-        //! Destruktor 
-        DLLEXPORT virtual ~Fenster();
-        //! Setzt einen Zeiger auf den Rahmen des Fensters
-        //! \param ram Der Rahmen
-        DLLEXPORT void setRahmenZ( Rahmen* ram );
-        //! Setzt die Farbe des Fensterrahmens
-        //! \param f Die Farbe im A8R8G8B8 Format
-        DLLEXPORT void setRFarbe( int f );
-        //! Setzt die Breite des Fensterrahmens
-        //! \param br Die Breite in Pixeln
-        DLLEXPORT void setRBreite( int br );
-        //! Setzt den Titel des Fensters
-        //! \param txt Der Text
-        DLLEXPORT void setTitel( Text* txt );
-        //! Setzt einen Zeiger auf den Titel Text
-        //! \param txt Der neue Text
-        DLLEXPORT void setTitelZ( Text* txt );
-        //! Setzt den Titel des Fensters
-        //! \param txt Der Textv
-        DLLEXPORT void setTitel( const char* txt );
-        //! Setzt einen Zeiger auf das TextFeld, das den Titeltext zeichnet
-        //! \param tf Das TextFeld
-        DLLEXPORT void setTTextFeldZ( TextFeld* tf );
-        //! Setzt die Schrift, die für den Titel verwendet werden soll
-        //! \param schrift Die Schrift
-        DLLEXPORT void setTSchriftZ( Schrift* schrift );
-        //! Setzt die Farbe der Schrift, die für den Titel verwendet werden soll
-        //! \param f Die Farbe im A8R8G8B8 Format
-        DLLEXPORT void setTSFarbe( int f );
-        //! Setzt die Größe der Schrift, die für den Titel verwendet werden soll
-        //! \param gr Die Höhe einer zeile in Pixeln
-        DLLEXPORT void setTSSize( int gr );
-        //! Setzt die Hintergrund Farbe des Titels
-        //! \param f Die Farbe im A8R8G8B8 Format
-        DLLEXPORT void setTBgFarbe( int f );
-        //! Setzt einen Zeiger auf den Farbübergang des Titels
-        //! \param af Der Farbübergang
-        DLLEXPORT void setTAlphaFeldZ( AlphaFeld* af );
-        //! Setzt die Farbe des Farbübergangs des Titels
-        //! \param f Die Farbe im A8R8G8B8 Format
-        DLLEXPORT void setTAfFarbe( int f );
-        //! Setzt die Stärke des Farbübergangs des Titels
-        //! \param st Die Stärke
-        DLLEXPORT void setTAfStrength( int st );
-        //! Setzt das Hintergrund Bild des Titels durch kopieren
-        //! \param b Das Bild, was kopiert werden soll
-        DLLEXPORT void setTBgBild( Bild* b );
-        //! Setzt einen Zeiger auf das Hintergrund Bild des Titels
-        //! \param b Das Bild
-        DLLEXPORT void setTBgBildZ( Bild* b );
-        //! Setzt einen Zeiger auf den Rahmen des Titels
-        //! \param ram Der Rahmen
-        DLLEXPORT void setTRahmenZ( Rahmen* ram );
-        //! Setzt die Farbe des Rahmens des Titels
-        //! \param f Die Farbe im A8R8G8B8 Format
-        DLLEXPORT void setTRFarbe( int f );
-        //! Setzt die Breite des Rahmens des Titels
-        //! \param br Die Breite in Pixeln
-        DLLEXPORT void setTRBreite( int br );
-        //! Setzt die Hintergrundfarbe des Körpers 
-        //! \param f Die Farbe im A8R8G8B8 Format
-        DLLEXPORT void setKBgFarbe( int f );
-        //! Setzt das Hintergrund Bild des Körpers durch kopieren
-        //! \param b Das Bild, das kopiert werden soll
-        DLLEXPORT void setKBgBild( Bild* b );
-        //! Setzt einen Zeiger auf das Hintergrund Bild des Körpers
-        //! \param b Das Bild
-        DLLEXPORT void setKBgBildZ( Bild* b );
-        //! Setzt einen Zeiger auf den Farbübergang des Körpers
-        //! \param af Der Farbübergang
-        DLLEXPORT void setKAlphaFeldZ( AlphaFeld* af );
-        //! Setzt die Farbe des Farbübergangs des Körpers
-        //! \param f Die Farbe im A8R8G8B8 Format
-        DLLEXPORT void setKAfFarbe( int f );
-        //! Setzt die Stärke des Farbübergangs des Körpers
-        //! \param st Die Stärke
-        DLLEXPORT void setKAfStrength( int st );
-        //! Setzt den Parameter der Rückruffunktion, die aufgerufen wird, wenn der Schließen Knopf ein MausEreignis erhält
-        //! \param param Der Parameter
-        DLLEXPORT void setClosingMeParam( void* param );
-        //! Setzt die Rückruffunktion, die Aufgerufen wird, wenn der Schließen Knopf ein MausEreignis erhält
-        //! Wenn die Rückruffunktion 0 zurückgiebt, oder nicht gesetzt wurde, wird ein Maus Ereignis von der Zeichnung nicht weiter beachtet
-        //! Das Fenster wird nicht von selbst geschlossen, sondern sollte in der Rückruffunktion durch den aufruf von löscheStyle( Fenster::Style::Sichtbar ); geschlossen werden
-        //! \param ak Ein Zeiger auf die Rückruffunktion
-        DLLEXPORT void setClosingMe( MausAktion closingMe );
-        //! Setzt die Hintergrund Farbe des Schließen Knopfes
-        //! \param f Die Farbe im A8R8G8B8 Format
-        DLLEXPORT void setSBgFarbe( int f );
-        //! Setzt das Hintergrund Bild des Schließen Knopfes durch kopieren
-        //! \param b Das Bild, das kopiert werden soll
-        DLLEXPORT void setSBgBild( Bild* b );
-        //! Setzt einen Zeiger auf das Hintergrund Bild des Schließen Knopfes
-        //! \param b Das Bild
-        DLLEXPORT void setSBgBildZ( Bild* b );
-        //! Setzt einen Zeiger auf den Farbübergang des Schließen Knopfes
-        //! \param af Der Farbübergang
-        DLLEXPORT void setSAlphaFeldZ( AlphaFeld* af );
-        //! Setzt die Farbe des Farbübergangs des Schließen Knopfes
-        //! \param f Die Farbe im A8R8G8B8 Format
-        DLLEXPORT void setSAfFarbe( int f );
-        //! Setzt die Stärke des Farbübergangs des Schließen Knopfes
-        //! \param st Die Stärke
-        DLLEXPORT void setSAfStrength( int st );
-        //! Setzt einen Zeiger auf den Farbübergang, der beim Klicken des Schließen Knopfes verwendet wird
-        //! \param af Der Farbübergnag
-        DLLEXPORT void setSKAlphaFeldZ( AlphaFeld* af );
-        //! Setzt die Farbe des Farbübergangs, der beim Klicken des Schließen Knopfes verwendet wird
-        //! \param f Die Farbe im A8R8G8B8 Format
-        DLLEXPORT void setSKAfFarbe( int f );
-        //! Setzt die Stärke des Farbübergangs, der beim Klicken des Schließen Knopfes verwendet wird
-        //! \param st Die Stärke
-        DLLEXPORT void setSKAfStrength( int st );
-        //! Setzt die Minimale Größe des Fensters
-        //! \param mx Die Minimale Breite in Pixeln
-        //! \param my Die Minimale Höhe in Pixeln
-        DLLEXPORT void setMin( int mx, int my );
-        //! Setzt die Minimale Größe des Fensters
-        //! \param min Die Minimale Breite und Höhe in Pixeln
-        DLLEXPORT void setMin( const Punkt& min );
-        //! Setzt die Maximale Größe des Fensters
-        //! \param mx Die Maximale Breite in Pixeln
-        //! \param my Die Maximale Höhe in Pixeln
-        DLLEXPORT void setMax( int mx, int my );
-        //! Setzt die Maximale Größe des Fensters
-        //! \param min Die Maximale Breite und Höhe in Pixeln
-        DLLEXPORT void setMax( const Punkt& max );
-        //! Setzt die Minimale Größe des Fenster Körpers
-        //! \param mx Die Minimale Breite in Pixeln
-        //! \param my Die Minimale Höhe in Pixeln
-        DLLEXPORT void setKMin( int mx, int my );
-        //! Setzt die Minimale Größe des Fenster Körpers
-        //! \param min Die Minimale Breite und Höhe in Pixeln
-        DLLEXPORT void setKMin( const Punkt& min );
-        //! Setzt die Maximale Größe des Fenster Körpers
-        //! \param mx Die Maximale Breite in Pixeln
-        //! \param my Die Maximale Höhe in Pixeln
-        DLLEXPORT void setKMax( int mx, int my );
-        //! Setzt die Maximale Größe des Fenster Körpers
-        //! \param min Die Maximale Breite und Höhe in Pixeln
-        DLLEXPORT void setKMax( const Punkt& max );
-        //! Setzt einen Zeiger auf die Scrollbar am unteren Rand des Fensters
-        //! \param hScroll Die Scrollbar
-        DLLEXPORT void setHScrollBarZ( HScrollBar* hScroll );
-        //! Setzt einen Zeiger auf die Scrollbar am rechten Rand des Fensters
-        //! \param vScroll Die Scrollbar
-        DLLEXPORT void setVScrollBarZ( VScrollBar* vScroll );
-        //! Setzt die Maximale Scroll breite des Fenster Körpers
-        //! \param max Die Breite in Pixeln
-        DLLEXPORT void setHSBMax( int max );
-        //! Setzt die Maximale Scroll höhe des Fenster Körpers
-        //! \param max Die Höhe in Pixeln
-        DLLEXPORT void setVSBMax( int max );
-        //! Scrollt zu einer bestimmten x Position im Fenster Körper
-        //! \param scroll Die Anzahl der Pixel, die der Inhalt nach links verschoben werden soll
-        DLLEXPORT void setHSBScroll( int scroll );
-        //! Scrollt zu einer bestimmten y Position im Fenster Körper
-        //! \param scroll Die Anzahl der Pixel, die der Inhalt nach oben verschoben werden soll
-        DLLEXPORT void setVSBScroll( int scroll );
-        //! Fügt dem Fenster eine Zeichnung hinzu
-        //! \param obj Die Zeichnung
-        DLLEXPORT virtual void addMember( Zeichnung* obj );
-        //! Entfernt eine Zeichnung aus dem Fenster
-        //! \param zObj Die Zeichnung (ohne erhöhten reference Counter)
-        DLLEXPORT virtual void removeMember( Zeichnung* zObj );
-        //! Entfernt alle Zeichnungen aus dem Fenster
-        DLLEXPORT virtual void removeAll();
-        //! 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 Fentster nach zRObj, falls es sichtbar ist
-        //! \param zRObj Das Bild, in welches gezeichnet werden soll
-        DLLEXPORT void render( Bild& zRObj ) override;
-        //! Gibt die Breite des Innenraumes in der Zeichnung in Pixeln zurück
-        DLLEXPORT int getInnenBreite() const override;
-        //! Gibt die Höhe des Innenraumes in der Zeichnung in Pixeln zurück
-        DLLEXPORT int getInnenHeight() const override;
-        //! Gibt den Rahmen des Fensters zurück
-        DLLEXPORT Rahmen* getRahmen() const;
-        //! Gibt den Rahmen des Fensters ohne erhöhen Reference Counter zurück
-        DLLEXPORT Rahmen* zRahmen() const;
-        //! Gibt die Farbe des Rahmens des Fensters im A8R8G8B8 Format zurück
-        DLLEXPORT int getRFarbe() const;
-        //! Gibt die Breite des Rahmens des Fensters in Pixeln zurück
-        DLLEXPORT int getRBreite() const;
-        //! Gibt den Titel des Fensters zurück
-        DLLEXPORT Text* getTitel() const;
-        //! Gibt den Titel des Fensters ohne erhöhten Reference Counter zurück
-        DLLEXPORT Text* zTitel() const;
-        //! Gibt das TextFeld zurück, das zum Zeichnen des Titels verwendet wird
-        DLLEXPORT TextFeld* getTTextFeld() const;
-        //! Gibt das TextFeld ohne erhöhten Reference Counter zurück, das zum Zeichnen des Titels verwendet wird
-        DLLEXPORT TextFeld* zTTextFeld() const;
-        //! Gibt die Schrift zurück, die für den Titel verwendet wird
-        DLLEXPORT Schrift* getTSchrift() const;
-        //! Gibt die Schrift ohne erhöten Reference Counter zurück, die für den Titel verwendet wird
-        DLLEXPORT Schrift* zTSchrift() const;
-        //! Gibt die Schrift Farbe des Titels im A8R8G8B8 Format zurück
-        DLLEXPORT int getTSFarbe() const;
-        //! Gibt die Höhe einer Zeile des Titels in Pixeln zurück
-        DLLEXPORT int getTSSize() const;
-        //! Gibt die Hintergrundfarbe des Titels im A8R8G8B8 Format zurück
-        DLLEXPORT int getTBgFarbe() const;
-        //! Gibt den Farbübergang des Titels zurück
-        DLLEXPORT AlphaFeld* getTAlphaFeld() const;
-        //! Gibt den Farbübergang des Titels ohne erhöhten Reference COunter zurück
-        DLLEXPORT AlphaFeld* zTAlphaFeld() const;
-        //! Gibt die Farbe des Farbübergangs des Titels im A8R8G8B8 Format zurück
-        DLLEXPORT int getTAfFarbe() const;
-        //! Gibt die Stärke des Farbübergangs des Titels zurück
-        DLLEXPORT int getTAfStrength() const;
-        //! Gibt das Hintergrund Bild des titels zurück
-        DLLEXPORT Bild* getTBgBild() const;
-        //! Gibt das Hintergrund Bild des titels ohne erhöhten Reference Counter zurück
-        DLLEXPORT Bild* zTBgBild() const;
-        //! Gibt den Rahmen des Titels zurück
-        DLLEXPORT Rahmen* getTRahmen() const;
-        //! Gibt den Rahmen des Titels ohne erhöhten Reference Counter zurück
-        DLLEXPORT Rahmen* zTRahmen() const;
-        //! Gibt die Farbe des Rahmens des Titels im A8R8G8B8 Format zurück
-        DLLEXPORT int getTRFarbe() const;
-        //! Gibt die Stärke des Rahmens des Titels zurück
-        DLLEXPORT int getTRBreite() const;
-        //! Gibt die Hintergrund Farbe des Körpers zurück
-        DLLEXPORT int getKBgFarbe() const;
-        //! Gibt das Hintergrund Bild des Körpers zurück
-        DLLEXPORT Bild* getKBgBild() const;
-        //! Gibt das Hintergrund Bild des Körpers ohne erhöhten Reference Counter zurück
-        DLLEXPORT Bild* zKBgBild() const;
-        //! Gibt den Farbübergang des Körpers zurück
-        DLLEXPORT AlphaFeld* getKAlphaFeld() const;
-        //! Gibt den Farbübergang des Körpers ohne erhöhten Reference Counter zurück
-        DLLEXPORT AlphaFeld* zKAlphaFeld() const;
-        //! Gibt die Farbe des Farbübergangs des Körpers im A8R8G8B8 Format zurück
-        DLLEXPORT int getKAfFarbe() const;
-        //! Gibt die Stärke des Farbübergangs des Körpers zurück
-        DLLEXPORT int getKAfStrength() const;
-        //! Gibt die Hintergrund Farbe des Schließen Knopfes im A8R8G8B8 Format zurück
-        DLLEXPORT int getSBgFarbe() const;
-        //! Gibt das Hintergrund Bild des Schließen Knopfes zurück
-        DLLEXPORT Bild* getSBgBild() const;
-        //! Gibt das Hintergrund Bild des Schließen Knopfes ohne erhöhten Reference COunter zurück
-        DLLEXPORT Bild* zSBgBild() const;
-        //! Gibt den Farbübergang des Schließen Knopfes zurück
-        DLLEXPORT AlphaFeld* getSAlphaFeld() const;
-        //! Gibt den Farbübergang des Schließen Knopfes ohne erhöhten Reference COunter zurück
-        DLLEXPORT AlphaFeld* zSAlphaFeld() const;
-        //! Gibt die Farbe des Farbübergangs des Schließen Knopfes im A8R8G8B8 Format zurück
-        DLLEXPORT int getSAfFarbe() const;
-        //! Gibt die Stärke des Farbübergangs des Schließen Knopfes zurück
-        DLLEXPORT int getSAfStrength() const;
-        //! Gibt den Farbübergang zurück, der verwendet wird, wenn auf den Schließen Knopf gedrückt wird
-        DLLEXPORT AlphaFeld* getSKAlphaFeld() const;
-        //! Gibt den Farbübergang ohne erhöhten Reference Counter zurück, der verwendet wird, wenn auf den Schließen Knopf gedrückt wird
-        DLLEXPORT AlphaFeld* zSKAlphaFeld() const;
-        //! Gibt die Farbe des Farbübergangs im A8R8G8B8 Format zurück, der verwendet wird, wenn auf den Schließen Knopf gedrückt wird
-        DLLEXPORT int getSKAfFarbe() const;
-        //! Gibt die Stärke des Farbübergangs zurück, der verwendet wird, wenn auf den Schließen Knopf gedrückt wird
-        DLLEXPORT int getSKAfStrength() const;
-        //! Gibt die minimale Fenstergröße in Pixeln zurück
-        DLLEXPORT const Punkt& getMin() const;
-        //! Gibt die maximale Fenstergröße in Pixeln zurück
-        DLLEXPORT const Punkt& getMax() const;
-        //! Gibt die minimale Körpergröße in Pixeln zurück
-        DLLEXPORT const Punkt& getKMin() const;
-        //! Gibt die maximale Körpergröße in Pixeln zurück
-        DLLEXPORT const Punkt& getKMax() const;
-        //! Gibt die Scrollbar vom rechten Fensterrand zurück
-        DLLEXPORT VScrollBar* getVScrollBar() const;
-        //! Gibt die Scrollbar vom rechten Fensterrand ohne erhöhten Reference Counter zurück
-        DLLEXPORT VScrollBar* zVScrollBar() const;
-        //! Gibt die Scrollbar vom unteren Fensterrand zurück
-        DLLEXPORT HScrollBar* getHScrollBar() const;
-        //! Gibt die Scrollbar vom unteren Fensterrand ohne erhöhten Reference Counter zurück
-        DLLEXPORT HScrollBar* zHScrollBar() const;
-        //! Gibt eine Liste mit Zeichnungen zurück, die im Fenster sind
-        DLLEXPORT Iterator<Zeichnung*> getMembers() const;
-        //! Erzeugt eine Kopie des Fensters, die ohne Auswirkungen auf das Original verändert werden kann
-        DLLEXPORT Zeichnung* dublizieren() const override;
-    };
+	protected:
+		//! 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 Fenster();
+		//! Destruktor 
+		DLLEXPORT virtual ~Fenster();
+		//! Setzt einen Zeiger auf den Rahmen des Fensters
+		//! \param ram Der Rahmen
+		DLLEXPORT void setRahmenZ(Rahmen* ram);
+		//! Setzt die Farbe des Fensterrahmens
+		//! \param f Die Farbe im A8R8G8B8 Format
+		DLLEXPORT void setRFarbe(int f);
+		//! Setzt die Breite des Fensterrahmens
+		//! \param br Die Breite in Pixeln
+		DLLEXPORT void setRBreite(int br);
+		//! Setzt den Titel des Fensters
+		//! \param txt Der Text
+		DLLEXPORT void setTitel(Text* txt);
+		//! Setzt einen Zeiger auf den Titel Text
+		//! \param txt Der neue Text
+		DLLEXPORT void setTitelZ(Text* txt);
+		//! Setzt den Titel des Fensters
+		//! \param txt Der Textv
+		DLLEXPORT void setTitel(const char* txt);
+		//! Setzt einen Zeiger auf das TextFeld, das den Titeltext zeichnet
+		//! \param tf Das TextFeld
+		DLLEXPORT void setTTextFeldZ(TextFeld* tf);
+		//! Setzt die Schrift, die für den Titel verwendet werden soll
+		//! \param schrift Die Schrift
+		DLLEXPORT void setTSchriftZ(Schrift* schrift);
+		//! Setzt die Farbe der Schrift, die für den Titel verwendet werden soll
+		//! \param f Die Farbe im A8R8G8B8 Format
+		DLLEXPORT void setTSFarbe(int f);
+		//! Setzt die Größe der Schrift, die für den Titel verwendet werden soll
+		//! \param gr Die Höhe einer zeile in Pixeln
+		DLLEXPORT void setTSSize(int gr);
+		//! Setzt die Hintergrund Farbe des Titels
+		//! \param f Die Farbe im A8R8G8B8 Format
+		DLLEXPORT void setTBgFarbe(int f);
+		//! Setzt einen Zeiger auf den Farbübergang des Titels
+		//! \param af Der Farbübergang
+		DLLEXPORT void setTAlphaFeldZ(AlphaFeld* af);
+		//! Setzt die Farbe des Farbübergangs des Titels
+		//! \param f Die Farbe im A8R8G8B8 Format
+		DLLEXPORT void setTAfFarbe(int f);
+		//! Setzt die Stärke des Farbübergangs des Titels
+		//! \param st Die Stärke
+		DLLEXPORT void setTAfStrength(int st);
+		//! Setzt das Hintergrund Bild des Titels durch kopieren
+		//! \param b Das Bild, was kopiert werden soll
+		DLLEXPORT void setTBgBild(Bild* b);
+		//! Setzt einen Zeiger auf das Hintergrund Bild des Titels
+		//! \param b Das Bild
+		DLLEXPORT void setTBgBildZ(Bild* b);
+		//! Setzt einen Zeiger auf den Rahmen des Titels
+		//! \param ram Der Rahmen
+		DLLEXPORT void setTRahmenZ(Rahmen* ram);
+		//! Setzt die Farbe des Rahmens des Titels
+		//! \param f Die Farbe im A8R8G8B8 Format
+		DLLEXPORT void setTRFarbe(int f);
+		//! Setzt die Breite des Rahmens des Titels
+		//! \param br Die Breite in Pixeln
+		DLLEXPORT void setTRBreite(int br);
+		//! Setzt die Hintergrundfarbe des Körpers 
+		//! \param f Die Farbe im A8R8G8B8 Format
+		DLLEXPORT void setKBgFarbe(int f);
+		//! Setzt das Hintergrund Bild des Körpers durch kopieren
+		//! \param b Das Bild, das kopiert werden soll
+		DLLEXPORT void setKBgBild(Bild* b);
+		//! Setzt einen Zeiger auf das Hintergrund Bild des Körpers
+		//! \param b Das Bild
+		DLLEXPORT void setKBgBildZ(Bild* b);
+		//! Setzt einen Zeiger auf den Farbübergang des Körpers
+		//! \param af Der Farbübergang
+		DLLEXPORT void setKAlphaFeldZ(AlphaFeld* af);
+		//! Setzt die Farbe des Farbübergangs des Körpers
+		//! \param f Die Farbe im A8R8G8B8 Format
+		DLLEXPORT void setKAfFarbe(int f);
+		//! Setzt die Stärke des Farbübergangs des Körpers
+		//! \param st Die Stärke
+		DLLEXPORT void setKAfStrength(int st);
+		//! Setzt den Parameter der Rückruffunktion, die aufgerufen wird, wenn der Schließen Knopf ein MausEreignis erhält
+		//! \param param Der Parameter
+		DLLEXPORT void setClosingMeParam(void* param);
+		//! Setzt die Rückruffunktion, die Aufgerufen wird, wenn der Schließen Knopf ein MausEreignis erhält
+		//! Wenn die Rückruffunktion 0 zurückgiebt, oder nicht gesetzt wurde, wird ein Maus Ereignis von der Zeichnung nicht weiter beachtet
+		//! Das Fenster wird nicht von selbst geschlossen, sondern sollte in der Rückruffunktion durch den aufruf von löscheStyle( Fenster::Style::Sichtbar ); geschlossen werden
+		//! \param ak Ein Zeiger auf die Rückruffunktion
+		DLLEXPORT void setClosingMe(MausAktion closingMe);
+		//! Setzt die Hintergrund Farbe des Schließen Knopfes
+		//! \param f Die Farbe im A8R8G8B8 Format
+		DLLEXPORT void setSBgFarbe(int f);
+		//! Setzt das Hintergrund Bild des Schließen Knopfes durch kopieren
+		//! \param b Das Bild, das kopiert werden soll
+		DLLEXPORT void setSBgBild(Bild* b);
+		//! Setzt einen Zeiger auf das Hintergrund Bild des Schließen Knopfes
+		//! \param b Das Bild
+		DLLEXPORT void setSBgBildZ(Bild* b);
+		//! Setzt einen Zeiger auf den Farbübergang des Schließen Knopfes
+		//! \param af Der Farbübergang
+		DLLEXPORT void setSAlphaFeldZ(AlphaFeld* af);
+		//! Setzt die Farbe des Farbübergangs des Schließen Knopfes
+		//! \param f Die Farbe im A8R8G8B8 Format
+		DLLEXPORT void setSAfFarbe(int f);
+		//! Setzt die Stärke des Farbübergangs des Schließen Knopfes
+		//! \param st Die Stärke
+		DLLEXPORT void setSAfStrength(int st);
+		//! Setzt einen Zeiger auf den Farbübergang, der beim Klicken des Schließen Knopfes verwendet wird
+		//! \param af Der Farbübergnag
+		DLLEXPORT void setSKAlphaFeldZ(AlphaFeld* af);
+		//! Setzt die Farbe des Farbübergangs, der beim Klicken des Schließen Knopfes verwendet wird
+		//! \param f Die Farbe im A8R8G8B8 Format
+		DLLEXPORT void setSKAfFarbe(int f);
+		//! Setzt die Stärke des Farbübergangs, der beim Klicken des Schließen Knopfes verwendet wird
+		//! \param st Die Stärke
+		DLLEXPORT void setSKAfStrength(int st);
+		//! Setzt die Minimale Größe des Fensters
+		//! \param mx Die Minimale Breite in Pixeln
+		//! \param my Die Minimale Höhe in Pixeln
+		DLLEXPORT void setMin(int mx, int my);
+		//! Setzt die Minimale Größe des Fensters
+		//! \param min Die Minimale Breite und Höhe in Pixeln
+		DLLEXPORT void setMin(const Punkt& min);
+		//! Setzt die Maximale Größe des Fensters
+		//! \param mx Die Maximale Breite in Pixeln
+		//! \param my Die Maximale Höhe in Pixeln
+		DLLEXPORT void setMax(int mx, int my);
+		//! Setzt die Maximale Größe des Fensters
+		//! \param min Die Maximale Breite und Höhe in Pixeln
+		DLLEXPORT void setMax(const Punkt& max);
+		//! Setzt die Minimale Größe des Fenster Körpers
+		//! \param mx Die Minimale Breite in Pixeln
+		//! \param my Die Minimale Höhe in Pixeln
+		DLLEXPORT void setKMin(int mx, int my);
+		//! Setzt die Minimale Größe des Fenster Körpers
+		//! \param min Die Minimale Breite und Höhe in Pixeln
+		DLLEXPORT void setKMin(const Punkt& min);
+		//! Setzt die Maximale Größe des Fenster Körpers
+		//! \param mx Die Maximale Breite in Pixeln
+		//! \param my Die Maximale Höhe in Pixeln
+		DLLEXPORT void setKMax(int mx, int my);
+		//! Setzt die Maximale Größe des Fenster Körpers
+		//! \param min Die Maximale Breite und Höhe in Pixeln
+		DLLEXPORT void setKMax(const Punkt& max);
+		//! Setzt einen Zeiger auf die Scrollbar am unteren Rand des Fensters
+		//! \param hScroll Die Scrollbar
+		DLLEXPORT void setHScrollBarZ(HScrollBar* hScroll);
+		//! Setzt einen Zeiger auf die Scrollbar am rechten Rand des Fensters
+		//! \param vScroll Die Scrollbar
+		DLLEXPORT void setVScrollBarZ(VScrollBar* vScroll);
+		//! Setzt die Maximale Scroll breite des Fenster Körpers
+		//! \param max Die Breite in Pixeln
+		DLLEXPORT void setHSBMax(int max);
+		//! Setzt die Maximale Scroll höhe des Fenster Körpers
+		//! \param max Die Höhe in Pixeln
+		DLLEXPORT void setVSBMax(int max);
+		//! Scrollt zu einer bestimmten x Position im Fenster Körper
+		//! \param scroll Die Anzahl der Pixel, die der Inhalt nach links verschoben werden soll
+		DLLEXPORT void setHSBScroll(int scroll);
+		//! Scrollt zu einer bestimmten y Position im Fenster Körper
+		//! \param scroll Die Anzahl der Pixel, die der Inhalt nach oben verschoben werden soll
+		DLLEXPORT void setVSBScroll(int scroll);
+		//! Fügt dem Fenster eine Zeichnung hinzu
+		//! \param obj Die Zeichnung
+		DLLEXPORT virtual void addMember(Zeichnung* obj);
+		//! Entfernt eine Zeichnung aus dem Fenster
+		//! \param zObj Die Zeichnung (ohne erhöhten reference Counter)
+		DLLEXPORT virtual void removeMember(Zeichnung* zObj);
+		//! Entfernt alle Zeichnungen aus dem Fenster
+		DLLEXPORT virtual void removeAll();
+		//! 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 Fentster nach zRObj, falls es sichtbar ist
+		//! \param zRObj Das Bild, in welches gezeichnet werden soll
+		DLLEXPORT void render(Bild& zRObj) override;
+		//! Gibt die Breite des Innenraumes in der Zeichnung in Pixeln zurück
+		DLLEXPORT int getInnenBreite() const override;
+		//! Gibt die Höhe des Innenraumes in der Zeichnung in Pixeln zurück
+		DLLEXPORT int getInnenHeight() const override;
+		//! Gibt den Rahmen des Fensters zurück
+		DLLEXPORT Rahmen* getRahmen() const;
+		//! Gibt den Rahmen des Fensters ohne erhöhen Reference Counter zurück
+		DLLEXPORT Rahmen* zRahmen() const;
+		//! Gibt die Farbe des Rahmens des Fensters im A8R8G8B8 Format zurück
+		DLLEXPORT int getRFarbe() const;
+		//! Gibt die Breite des Rahmens des Fensters in Pixeln zurück
+		DLLEXPORT int getRBreite() const;
+		//! Gibt den Titel des Fensters zurück
+		DLLEXPORT Text* getTitel() const;
+		//! Gibt den Titel des Fensters ohne erhöhten Reference Counter zurück
+		DLLEXPORT Text* zTitel() const;
+		//! Gibt das TextFeld zurück, das zum Zeichnen des Titels verwendet wird
+		DLLEXPORT TextFeld* getTTextFeld() const;
+		//! Gibt das TextFeld ohne erhöhten Reference Counter zurück, das zum Zeichnen des Titels verwendet wird
+		DLLEXPORT TextFeld* zTTextFeld() const;
+		//! Gibt die Schrift zurück, die für den Titel verwendet wird
+		DLLEXPORT Schrift* getTSchrift() const;
+		//! Gibt die Schrift ohne erhöten Reference Counter zurück, die für den Titel verwendet wird
+		DLLEXPORT Schrift* zTSchrift() const;
+		//! Gibt die Schrift Farbe des Titels im A8R8G8B8 Format zurück
+		DLLEXPORT int getTSFarbe() const;
+		//! Gibt die Höhe einer Zeile des Titels in Pixeln zurück
+		DLLEXPORT int getTSSize() const;
+		//! Gibt die Hintergrundfarbe des Titels im A8R8G8B8 Format zurück
+		DLLEXPORT int getTBgFarbe() const;
+		//! Gibt den Farbübergang des Titels zurück
+		DLLEXPORT AlphaFeld* getTAlphaFeld() const;
+		//! Gibt den Farbübergang des Titels ohne erhöhten Reference COunter zurück
+		DLLEXPORT AlphaFeld* zTAlphaFeld() const;
+		//! Gibt die Farbe des Farbübergangs des Titels im A8R8G8B8 Format zurück
+		DLLEXPORT int getTAfFarbe() const;
+		//! Gibt die Stärke des Farbübergangs des Titels zurück
+		DLLEXPORT int getTAfStrength() const;
+		//! Gibt das Hintergrund Bild des titels zurück
+		DLLEXPORT Bild* getTBgBild() const;
+		//! Gibt das Hintergrund Bild des titels ohne erhöhten Reference Counter zurück
+		DLLEXPORT Bild* zTBgBild() const;
+		//! Gibt den Rahmen des Titels zurück
+		DLLEXPORT Rahmen* getTRahmen() const;
+		//! Gibt den Rahmen des Titels ohne erhöhten Reference Counter zurück
+		DLLEXPORT Rahmen* zTRahmen() const;
+		//! Gibt die Farbe des Rahmens des Titels im A8R8G8B8 Format zurück
+		DLLEXPORT int getTRFarbe() const;
+		//! Gibt die Stärke des Rahmens des Titels zurück
+		DLLEXPORT int getTRBreite() const;
+		//! Gibt die Hintergrund Farbe des Körpers zurück
+		DLLEXPORT int getKBgFarbe() const;
+		//! Gibt das Hintergrund Bild des Körpers zurück
+		DLLEXPORT Bild* getKBgBild() const;
+		//! Gibt das Hintergrund Bild des Körpers ohne erhöhten Reference Counter zurück
+		DLLEXPORT Bild* zKBgBild() const;
+		//! Gibt den Farbübergang des Körpers zurück
+		DLLEXPORT AlphaFeld* getKAlphaFeld() const;
+		//! Gibt den Farbübergang des Körpers ohne erhöhten Reference Counter zurück
+		DLLEXPORT AlphaFeld* zKAlphaFeld() const;
+		//! Gibt die Farbe des Farbübergangs des Körpers im A8R8G8B8 Format zurück
+		DLLEXPORT int getKAfFarbe() const;
+		//! Gibt die Stärke des Farbübergangs des Körpers zurück
+		DLLEXPORT int getKAfStrength() const;
+		//! Gibt die Hintergrund Farbe des Schließen Knopfes im A8R8G8B8 Format zurück
+		DLLEXPORT int getSBgFarbe() const;
+		//! Gibt das Hintergrund Bild des Schließen Knopfes zurück
+		DLLEXPORT Bild* getSBgBild() const;
+		//! Gibt das Hintergrund Bild des Schließen Knopfes ohne erhöhten Reference COunter zurück
+		DLLEXPORT Bild* zSBgBild() const;
+		//! Gibt den Farbübergang des Schließen Knopfes zurück
+		DLLEXPORT AlphaFeld* getSAlphaFeld() const;
+		//! Gibt den Farbübergang des Schließen Knopfes ohne erhöhten Reference COunter zurück
+		DLLEXPORT AlphaFeld* zSAlphaFeld() const;
+		//! Gibt die Farbe des Farbübergangs des Schließen Knopfes im A8R8G8B8 Format zurück
+		DLLEXPORT int getSAfFarbe() const;
+		//! Gibt die Stärke des Farbübergangs des Schließen Knopfes zurück
+		DLLEXPORT int getSAfStrength() const;
+		//! Gibt den Farbübergang zurück, der verwendet wird, wenn auf den Schließen Knopf gedrückt wird
+		DLLEXPORT AlphaFeld* getSKAlphaFeld() const;
+		//! Gibt den Farbübergang ohne erhöhten Reference Counter zurück, der verwendet wird, wenn auf den Schließen Knopf gedrückt wird
+		DLLEXPORT AlphaFeld* zSKAlphaFeld() const;
+		//! Gibt die Farbe des Farbübergangs im A8R8G8B8 Format zurück, der verwendet wird, wenn auf den Schließen Knopf gedrückt wird
+		DLLEXPORT int getSKAfFarbe() const;
+		//! Gibt die Stärke des Farbübergangs zurück, der verwendet wird, wenn auf den Schließen Knopf gedrückt wird
+		DLLEXPORT int getSKAfStrength() const;
+		//! Gibt die minimale Fenstergröße in Pixeln zurück
+		DLLEXPORT const Punkt& getMin() const;
+		//! Gibt die maximale Fenstergröße in Pixeln zurück
+		DLLEXPORT const Punkt& getMax() const;
+		//! Gibt die minimale Körpergröße in Pixeln zurück
+		DLLEXPORT const Punkt& getKMin() const;
+		//! Gibt die maximale Körpergröße in Pixeln zurück
+		DLLEXPORT const Punkt& getKMax() const;
+		//! Gibt die Scrollbar vom rechten Fensterrand zurück
+		DLLEXPORT VScrollBar* getVScrollBar() const;
+		//! Gibt die Scrollbar vom rechten Fensterrand ohne erhöhten Reference Counter zurück
+		DLLEXPORT VScrollBar* zVScrollBar() const;
+		//! Gibt die Scrollbar vom unteren Fensterrand zurück
+		DLLEXPORT HScrollBar* getHScrollBar() const;
+		//! Gibt die Scrollbar vom unteren Fensterrand ohne erhöhten Reference Counter zurück
+		DLLEXPORT HScrollBar* zHScrollBar() const;
+		//! Gibt eine Liste mit Zeichnungen zurück, die im Fenster sind
+		DLLEXPORT Iterator<Zeichnung*> getMembers() const;
+		//! Erzeugt eine Kopie des Fensters, die ohne Auswirkungen auf das Original verändert werden kann
+		DLLEXPORT Zeichnung* dublizieren() const override;
+	};
 }
 #endif

+ 1 - 1
Framework Linux.vcxproj

@@ -251,7 +251,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <ClCompile>
       <CppAdditionalWarning>switch;no-deprecated-declarations;empty-body;conversion;return-type;parentheses;no-format;uninitialized;unreachable-code;unused-function;unused-value;unused-variable;%(CppAdditionalWarning)</CppAdditionalWarning>
-      <AdditionalOptions>-fPIC</AdditionalOptions>
+      <AdditionalOptions>-fPIC -Wno-unknown-pragmas</AdditionalOptions>
       <PositionIndependentCode>true</PositionIndependentCode>
     </ClCompile>
     <Link>

+ 2 - 2
JSON.h

@@ -435,8 +435,8 @@ namespace Framework
 				StringValidationBuilder<T>* whichIsOneOf(RCArray<Text>& values)
 				{
 					JSONArray arr;
-					for (Text str : values)
-						arr.addValue(new JSONString(str));
+					for (Text* str : values)
+						arr.addValue(new JSONString(str->getText()));
 					element.setAttribute("oneOf", arr.toString());
 					return this;
 				}

+ 204 - 204
UIInitialization.cpp

@@ -17,239 +17,239 @@
 \
 using namespace Framework;
 
-AuswahlBox *createAuswahlBox( UIInitParam &p )
-{
-    AuswahlBox *ret = new AuswahlBox();
-    ret->setStyle( AuswahlBox::Style::Normal );
-    ret->setHintergrundFarbe( 0xFF000000 );
-    ret->setMausEreignis( _ret1ME );
-    if( p.schrift )
-        ret->setSchriftZ( dynamic_cast<Schrift *>( p.schrift->getThis() ) );
-    ret->setRahmenBreite( 1 );
-    ret->setRahmenFarbe( 0xFFFFFFFF );
-    ret->setMaxAuskappHeight( 100 );
-    ret->setMausRahmenBreite( 1 );
-    ret->setMausRahmenFarbe( 0xFF005500 );
-    ret->setMausAlphaFeldFarbe( 0x00008700 );
-    ret->setMausAlphaFeldStrength( -8 );
-    ret->setAuswRahmenBreite( 1 );
-    ret->setAuswRahmenFarbe( 0xFF00FF00 );
-    ret->setAuswAlphaFeldFarbe( 0x0000FF00 );
-    ret->setAuswAlphaFeldStrength( -8 );
-    return ret;
-}
-
-AuswahlListe *createAuswahlListe( UIInitParam &p )
-{
-    AuswahlListe *ret = new AuswahlListe();
-    ret->setStyle( AuswahlListe::Style::Normal );
-    if( p.schrift )
-        ret->setSchriftZ( dynamic_cast<Schrift *>( p.schrift->getThis() ) );
-    ret->setAlphaFeldFarbe( 0x5500FF00 );
-    ret->setAlphaFeldStrength( -5 );
-    ret->setRahmenBreite( 1 );
-    ret->setRahmenFarbe( 0xFFFFFFFF );
-    ret->setHintergrundFarbe( 0xFF000000 );
-    ret->setMausEreignis( _ret1ME );
-    ret->setALRBreite( 1 );
-    ret->setALRFarbe( 0xFF00FF00 );
-    ret->setAAFFarbe( 0x0000FF00 );
-    ret->setAAFStrength( -8 );
-    ret->update();
-    return ret;
-}
-
-BildZ *createBildZ( UIInitParam &p )
-{
-    BildZ *ret = new BildZ();
-    ret->setStyle( BildZ::Style::normal );
-    ret->setRahmenBreite( 1 );
-    ret->setRahmenFarbe( 0xFFFFFFFF );
-    return ret;
-}
-
-FBalken *createFBalken( UIInitParam &p )
-{
-    FBalken *ret = new FBalken();
-    ret->setStyle( FBalken::Style::normal );
-    if( p.schrift )
-        ret->setSchriftZ( dynamic_cast<Schrift *>( p.schrift->getThis() ) );
-    ret->setSFarbe( 0xFFFFFFFF );
-    ret->setSSize( 12 );
-    ret->setRahmenFarbe( 0xFFFFFFFF );
-    ret->setRahmenBreite( 1 );
+AuswahlBox* createAuswahlBox(const UIInitParam& p)
+{
+	AuswahlBox* ret = new AuswahlBox();
+	ret->setStyle(AuswahlBox::Style::Normal);
+	ret->setHintergrundFarbe(0xFF000000);
+	ret->setMausEreignis(_ret1ME);
+	if (p.schrift)
+		ret->setSchriftZ(dynamic_cast<Schrift*>(p.schrift->getThis()));
+	ret->setRahmenBreite(1);
+	ret->setRahmenFarbe(0xFFFFFFFF);
+	ret->setMaxAuskappHeight(100);
+	ret->setMausRahmenBreite(1);
+	ret->setMausRahmenFarbe(0xFF005500);
+	ret->setMausAlphaFeldFarbe(0x00008700);
+	ret->setMausAlphaFeldStrength(-8);
+	ret->setAuswRahmenBreite(1);
+	ret->setAuswRahmenFarbe(0xFF00FF00);
+	ret->setAuswAlphaFeldFarbe(0x0000FF00);
+	ret->setAuswAlphaFeldStrength(-8);
+	return ret;
+}
+
+AuswahlListe* createAuswahlListe(const UIInitParam& p)
+{
+	AuswahlListe* ret = new AuswahlListe();
+	ret->setStyle(AuswahlListe::Style::Normal);
+	if (p.schrift)
+		ret->setSchriftZ(dynamic_cast<Schrift*>(p.schrift->getThis()));
+	ret->setAlphaFeldFarbe(0x5500FF00);
+	ret->setAlphaFeldStrength(-5);
+	ret->setRahmenBreite(1);
+	ret->setRahmenFarbe(0xFFFFFFFF);
+	ret->setHintergrundFarbe(0xFF000000);
+	ret->setMausEreignis(_ret1ME);
+	ret->setALRBreite(1);
+	ret->setALRFarbe(0xFF00FF00);
+	ret->setAAFFarbe(0x0000FF00);
+	ret->setAAFStrength(-8);
+	ret->update();
+	return ret;
+}
+
+BildZ* createBildZ(const UIInitParam& p)
+{
+	BildZ* ret = new BildZ();
+	ret->setStyle(BildZ::Style::normal);
+	ret->setRahmenBreite(1);
+	ret->setRahmenFarbe(0xFFFFFFFF);
+	return ret;
+}
+
+FBalken* createFBalken(const UIInitParam& p)
+{
+	FBalken* ret = new FBalken();
+	ret->setStyle(FBalken::Style::normal);
+	if (p.schrift)
+		ret->setSchriftZ(dynamic_cast<Schrift*>(p.schrift->getThis()));
+	ret->setSFarbe(0xFFFFFFFF);
+	ret->setSSize(12);
+	ret->setRahmenFarbe(0xFFFFFFFF);
+	ret->setRahmenBreite(1);
 #ifdef WIN32
-    LTDBDatei *datei = new LTDBDatei();
-    datei->setDatei( new Text( "data/bilder/system.ltdb" ) ); // TODO integrate this into the dll
-    datei->leseDaten( 0 );
-    Bild *fbhb = datei->laden( 0, new Text( "fortschrittleh" ) );
-    ret->setHintergrundBildZ( fbhb );
-    Bild *fbfhb = datei->laden( 0, new Text( "fortschrittvol" ) );
-    datei->release();
-    ret->setFBgBildZ( fbfhb );
+	LTDBDatei* datei = new LTDBDatei();
+	datei->setDatei(new Text("data/bilder/system.ltdb")); // TODO integrate this into the dll
+	datei->leseDaten(0);
+	Bild* fbhb = datei->laden(0, new Text("fortschrittleh"));
+	ret->setHintergrundBildZ(fbhb);
+	Bild* fbfhb = datei->laden(0, new Text("fortschrittvol"));
+	datei->release();
+	ret->setFBgBildZ(fbfhb);
 #endif
-    ret->setFBgFarbe( 0xFF00FF00 );
-    return ret;
-}
-
-Kamera2D *createKamera2D( UIInitParam &p )
-{
-    Kamera2D *ret = new Kamera2D();
-    // TODO
-    return ret;
-}
-
-Fenster *createFenster( UIInitParam &p )
-{
-    Fenster *ret = new Fenster();
-    ret->setMausEreignis( _ret1ME );
-    ret->setTastaturEreignis( _ret1TE );
-    ret->setStyle( Fenster::Style::normal );
-    ret->setRBreite( 1 );
-    ret->setRFarbe( 0xFFFFFFFF );
-    ret->setTitel( "" );
-    if( p.schrift )
-        ret->setTSchriftZ( dynamic_cast<Schrift *>( p.schrift->getThis() ) );
-    ret->setTSFarbe( 0xFFFFFFFF );
-    ret->zTTextFeld()->setSize( 0, 20 );
-    ret->zTTextFeld()->addStyle( TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Rahmen );
-    ret->setTRFarbe( 0xFF00FF00 );
-    ret->setTRBreite( 1 );
-    ret->setTAfFarbe( 0x1000FF00 );
-    ret->setTAfStrength( -15 );
-    ret->setSKAfFarbe( 0xFF00FF00 );
-    ret->setSKAfStrength( 30 );
-    return ret;
-}
-
-Knopf *createKnopf( UIInitParam &p )
-{
-    Knopf *ret = new Knopf();
-    if( p.schrift )
-        ret->setSchriftZ( dynamic_cast<Schrift *>( p.schrift->getThis() ) );
-    ret->setStyle( Knopf::Style::Normal );
-    return ret;
-}
-
-KontrollKnopf *createKontrollKnopf( UIInitParam &p )
-{
-    KontrollKnopf *ret = new KontrollKnopf();
-    ret->setMausEreignis( _ret1ME );
-    ret->setStyle( KontrollKnopf::Style::Normal );
-    if( p.schrift )
-        ret->setSchriftZ( dynamic_cast<Schrift *>( p.schrift->getThis() ) );
-    ret->setSFarbe( 0xFFFFFFFF );
-    ret->setSSize( 12 );
-    ret->setAlphaFeldFarbe( 0x5500FF00 );
-    ret->setAlphaFeldStrength( -5 );
-    ret->setRahmenBreite( 1 );
-    ret->setRahmenFarbe( 0xFF00FF00 );
+	ret->setFBgFarbe(0xFF00FF00);
+	return ret;
+}
+
+Kamera2D* createKamera2D(const UIInitParam& p)
+{
+	Kamera2D* ret = new Kamera2D();
+	// TODO
+	return ret;
+}
+
+Fenster* createFenster(const  UIInitParam& p)
+{
+	Fenster* ret = new Fenster();
+	ret->setMausEreignis(_ret1ME);
+	ret->setTastaturEreignis(_ret1TE);
+	ret->setStyle(Fenster::Style::normal);
+	ret->setRBreite(1);
+	ret->setRFarbe(0xFFFFFFFF);
+	ret->setTitel("");
+	if (p.schrift)
+		ret->setTSchriftZ(dynamic_cast<Schrift*>(p.schrift->getThis()));
+	ret->setTSFarbe(0xFFFFFFFF);
+	ret->zTTextFeld()->setSize(0, 20);
+	ret->zTTextFeld()->addStyle(TextFeld::Style::Sichtbar | TextFeld::Style::Center | TextFeld::Style::Rahmen);
+	ret->setTRFarbe(0xFF00FF00);
+	ret->setTRBreite(1);
+	ret->setTAfFarbe(0x1000FF00);
+	ret->setTAfStrength(-15);
+	ret->setSKAfFarbe(0xFF00FF00);
+	ret->setSKAfStrength(30);
+	return ret;
+}
+
+Knopf* createKnopf(const  UIInitParam& p)
+{
+	Knopf* ret = new Knopf();
+	if (p.schrift)
+		ret->setSchriftZ(dynamic_cast<Schrift*>(p.schrift->getThis()));
+	ret->setStyle(Knopf::Style::Normal);
+	return ret;
+}
+
+KontrollKnopf* createKontrollKnopf(const UIInitParam& p)
+{
+	KontrollKnopf* ret = new KontrollKnopf();
+	ret->setMausEreignis(_ret1ME);
+	ret->setStyle(KontrollKnopf::Style::Normal);
+	if (p.schrift)
+		ret->setSchriftZ(dynamic_cast<Schrift*>(p.schrift->getThis()));
+	ret->setSFarbe(0xFFFFFFFF);
+	ret->setSSize(12);
+	ret->setAlphaFeldFarbe(0x5500FF00);
+	ret->setAlphaFeldStrength(-5);
+	ret->setRahmenBreite(1);
+	ret->setRahmenFarbe(0xFF00FF00);
 #ifdef WIN32
-    ret->loadData( "data/bilder/system.ltdb" ); // TODO integrate this into the dll
+	ret->loadData("data/bilder/system.ltdb"); // TODO integrate this into the dll
 #endif
-    return ret;
+	return ret;
 }
 
-LDiag *createLDiag( UIInitParam &p )
+LDiag* createLDiag(const UIInitParam& p)
 {
-    LDiag *ret = new LDiag();
-    ret->setStyle( LDiag::Style::normal );
-    if( p.schrift )
-        ret->setSchriftZ( dynamic_cast<Schrift *>( p.schrift->getThis() ) );
-    ret->setRahmenBreite( 1 );
-    ret->setRahmenFarbe( 0xFFFFFFFF );
-    ret->setDatenRahmenBreite( 1 );
-    ret->setDatenRahmenFarbe( 0xFFFFFFFF );
-    ret->setHintergrundFarbe( 0xFF000000 );
-    ret->setDatenHintergrundFarbe( 0xFF000000 );
-    return ret;
+	LDiag* ret = new LDiag();
+	ret->setStyle(LDiag::Style::normal);
+	if (p.schrift)
+		ret->setSchriftZ(dynamic_cast<Schrift*>(p.schrift->getThis()));
+	ret->setRahmenBreite(1);
+	ret->setRahmenFarbe(0xFFFFFFFF);
+	ret->setDatenRahmenBreite(1);
+	ret->setDatenRahmenFarbe(0xFFFFFFFF);
+	ret->setHintergrundFarbe(0xFF000000);
+	ret->setDatenHintergrundFarbe(0xFF000000);
+	return ret;
 }
 
-M2DVorschau *createM2DVorschau( UIInitParam &p )
+M2DVorschau* createM2DVorschau(const UIInitParam& p)
 {
-    M2DVorschau *ret = new M2DVorschau();
-    // TODO
-    return ret;
+	M2DVorschau* ret = new M2DVorschau();
+	// TODO
+	return ret;
 }
 
-Model2D *createModel2D( UIInitParam &p )
+Model2D* createModel2D(const UIInitParam& p)
 {
-    Model2D *ret = new Model2D();
-    // TODO
-    return ret;
+	Model2D* ret = new Model2D();
+	// TODO
+	return ret;
 }
 
-Animation2D *createAnimation2D( UIInitParam &p )
+Animation2D* createAnimation2D(const UIInitParam& p)
 {
-    Animation2D *ret = new Animation2D();
-    // TODO
-    return ret;
+	Animation2D* ret = new Animation2D();
+	// TODO
+	return ret;
 }
 
-TextFeld *createTextFeld( UIInitParam &p )
+TextFeld* createTextFeld(const  UIInitParam& p)
 {
-    TextFeld *ret = new TextFeld();
-    ret->setStyle( TextFeld::Style::Text );
-    if( p.schrift )
-        ret->setSchriftZ( dynamic_cast<Schrift *>( p.schrift->getThis() ) );
-    ret->setSchriftFarbe( 0xFFFFFFFF );
-    ret->setSchriftSize( 12 );
-    ret->setAlphaFeldFarbe( 0x5500FF00 );
-    ret->setAlphaFeldStrength( -5 );
-    ret->setRahmenBreite( 1 );
-    ret->setRahmenFarbe( 0xFF00FF00 );
-    return ret;
+	TextFeld* ret = new TextFeld();
+	ret->setStyle(TextFeld::Style::Text);
+	if (p.schrift)
+		ret->setSchriftZ(dynamic_cast<Schrift*>(p.schrift->getThis()));
+	ret->setSchriftFarbe(0xFFFFFFFF);
+	ret->setSchriftSize(12);
+	ret->setAlphaFeldFarbe(0x5500FF00);
+	ret->setAlphaFeldStrength(-5);
+	ret->setRahmenBreite(1);
+	ret->setRahmenFarbe(0xFF00FF00);
+	return ret;
 }
 
-ObjTabelle *createObjTabelle( UIInitParam &p )
+ObjTabelle* createObjTabelle(const UIInitParam& p)
 {
-    ObjTabelle *ret = new ObjTabelle();
-    ret->setStyle( ObjTabelle::Style::normal );
-    ret->setMausEreignis( _ret1ME );
-    ret->setRahmenBreite( 1 );
-    ret->setRahmenFarbe( 0xFFFFFFFF );
-    ret->setRasterBreite( 1 );
-    ret->setRasterFarbe( 0xFFFFFFFF );
-    ret->setVertikalKlickScroll( 5 );
-    ret->setHorizontalKlickScroll( 5 );
-    return ret;
+	ObjTabelle* ret = new ObjTabelle();
+	ret->setStyle(ObjTabelle::Style::normal);
+	ret->setMausEreignis(_ret1ME);
+	ret->setRahmenBreite(1);
+	ret->setRahmenFarbe(0xFFFFFFFF);
+	ret->setRasterBreite(1);
+	ret->setRasterFarbe(0xFFFFFFFF);
+	ret->setVertikalKlickScroll(5);
+	ret->setHorizontalKlickScroll(5);
+	return ret;
 }
 
-SLDiag *createSLDiag( UIInitParam &p )
+SLDiag* createSLDiag(const UIInitParam& p)
 {
-    SLDiag *ret = new SLDiag();
-    // TODO
-    return ret;
+	SLDiag* ret = new SLDiag();
+	// TODO
+	return ret;
 }
 
-UIMLView *createUIMLView( UIInitParam &p )
+UIMLView* createUIMLView(const UIInitParam& p)
 {
-    UIMLView *ret = new UIMLView();
-    // TODO
-    return ret;
+	UIMLView* ret = new UIMLView();
+	// TODO
+	return ret;
 }
 
-UIInit Framework::defaultUI( Schrift *zSchrift, Bildschirm *zScreen )
+UIInit Framework::defaultUI(Schrift* zSchrift, Bildschirm* zScreen)
 {
-    UIInit uii;
-    uii.initParam.schrift = zSchrift;
-    uii.initParam.bildschirm = zScreen;
-    uii.initParam.data = 0;
-    uii.createAuswahlBox = createAuswahlBox;
-    uii.createAuswahlListe = createAuswahlListe;
-    uii.createBildZ = createBildZ;
-    uii.createFBalken = createFBalken;
-    uii.createKamera2D = createKamera2D;
-    uii.createFenster = createFenster;
-    uii.createKnopf = createKnopf;
-    uii.createKontrollKnopf = createKontrollKnopf;
-    uii.createLDiag = createLDiag;
-    uii.createM2DVorschau = createM2DVorschau;
-    uii.createModel2D = createModel2D;
-    uii.createAnimation2D = createAnimation2D;
-    uii.createTextFeld = createTextFeld;
-    uii.createObjTabelle = createObjTabelle;
-    uii.createSLDiag = createSLDiag;
-    uii.createUIMLView = createUIMLView;
-    return uii;
+	UIInit uii;
+	uii.initParam.schrift = zSchrift;
+	uii.initParam.bildschirm = zScreen;
+	uii.initParam.data = 0;
+	uii.createAuswahlBox = createAuswahlBox;
+	uii.createAuswahlListe = createAuswahlListe;
+	uii.createBildZ = createBildZ;
+	uii.createFBalken = createFBalken;
+	uii.createKamera2D = createKamera2D;
+	uii.createFenster = createFenster;
+	uii.createKnopf = createKnopf;
+	uii.createKontrollKnopf = createKontrollKnopf;
+	uii.createLDiag = createLDiag;
+	uii.createM2DVorschau = createM2DVorschau;
+	uii.createModel2D = createModel2D;
+	uii.createAnimation2D = createAnimation2D;
+	uii.createTextFeld = createTextFeld;
+	uii.createObjTabelle = createObjTabelle;
+	uii.createSLDiag = createSLDiag;
+	uii.createUIMLView = createUIMLView;
+	return uii;
 }

+ 48 - 48
UIInitialization.h

@@ -5,55 +5,55 @@
 
 namespace Framework
 {
-    class AuswahlBox;
-    class AuswahlListe;
-    class BildZ;
-    class FBalken;
-    class Kamera2D;
-    class Fenster;
-    class Knopf;
-    class KontrollKnopf;
-    class LDiag;
-    class M2DVorschau;
-    class Model2D;
-    class Animation2D;
-    class TextFeld;
-    class ObjTabelle;
-    class SLDiag;
-    class UIMLView;
-    class Schrift;
-    class Bildschirm;
+	class AuswahlBox;
+	class AuswahlListe;
+	class BildZ;
+	class FBalken;
+	class Kamera2D;
+	class Fenster;
+	class Knopf;
+	class KontrollKnopf;
+	class LDiag;
+	class M2DVorschau;
+	class Model2D;
+	class Animation2D;
+	class TextFeld;
+	class ObjTabelle;
+	class SLDiag;
+	class UIMLView;
+	class Schrift;
+	class Bildschirm;
 
-    struct UIInitParam
-    {
-        Schrift *schrift;
-        Bildschirm *bildschirm;
-        void *data;
-    };
+	struct UIInitParam
+	{
+		Schrift* schrift;
+		Bildschirm* bildschirm;
+		void* data;
+	};
 
-    struct UIInit
-    {
-        UIInitParam initParam;
-        std::function< AuswahlBox *( UIInitParam &p ) > createAuswahlBox;
-        std::function< AuswahlListe *( UIInitParam &p ) > createAuswahlListe;
-        std::function< BildZ *( UIInitParam &p ) > createBildZ;
-        std::function< FBalken *( UIInitParam &p ) > createFBalken;
-        std::function< Kamera2D *( UIInitParam &p ) > createKamera2D;
-        std::function< Fenster *( UIInitParam &p ) > createFenster;
-        std::function< Knopf *( UIInitParam &p ) > createKnopf;
-        std::function< KontrollKnopf *( UIInitParam &p ) > createKontrollKnopf;
-        std::function< LDiag *( UIInitParam &p ) > createLDiag;
-        std::function< M2DVorschau *( UIInitParam &p ) > createM2DVorschau;
-        std::function< Model2D *( UIInitParam &p ) > createModel2D;
-        std::function< Animation2D *( UIInitParam &p ) > createAnimation2D;
-        std::function< TextFeld *( UIInitParam &p ) > createTextFeld;
-        std::function< ObjTabelle *( UIInitParam &p ) > createObjTabelle;
-        std::function< SLDiag *( UIInitParam &p ) > createSLDiag;
-        std::function< UIMLView *( UIInitParam &p ) > createUIMLView;
-    };
+	struct UIInit
+	{
+		UIInitParam initParam;
+		std::function< AuswahlBox* (const UIInitParam& p) > createAuswahlBox;
+		std::function< AuswahlListe* (const UIInitParam& p) > createAuswahlListe;
+		std::function< BildZ* (const UIInitParam& p) > createBildZ;
+		std::function< FBalken* (const UIInitParam& p) > createFBalken;
+		std::function< Kamera2D* (const UIInitParam& p) > createKamera2D;
+		std::function< Fenster* (const UIInitParam& p) > createFenster;
+		std::function< Knopf* (const UIInitParam& p) > createKnopf;
+		std::function< KontrollKnopf* (const UIInitParam& p) > createKontrollKnopf;
+		std::function< LDiag* (const UIInitParam& p) > createLDiag;
+		std::function< M2DVorschau* (const UIInitParam& p) > createM2DVorschau;
+		std::function< Model2D* (const UIInitParam& p) > createModel2D;
+		std::function< Animation2D* (const UIInitParam& p) > createAnimation2D;
+		std::function< TextFeld* (const UIInitParam& p) > createTextFeld;
+		std::function< ObjTabelle* (const UIInitParam& p) > createObjTabelle;
+		std::function< SLDiag* (const UIInitParam& p) > createSLDiag;
+		std::function< UIMLView* (const UIInitParam& p) > createUIMLView;
+	};
 
-    //! gibt eine liste mit default initialisierungsfunktionen zurück
-    //! \param zSchrift Die schrift die verwendet werden soll (ohne erhöhten reference Counter)
-    //! \param zScreen Der Bildschirm der verwendet werden soll (ohne erhöhten reference Counter)
-    DLLEXPORT UIInit defaultUI( Schrift *zSchrift, Bildschirm *zScreen );
+	//! gibt eine liste mit default initialisierungsfunktionen zurück
+	//! \param zSchrift Die schrift die verwendet werden soll (ohne erhöhten reference Counter)
+	//! \param zScreen Der Bildschirm der verwendet werden soll (ohne erhöhten reference Counter)
+	DLLEXPORT UIInit defaultUI(Schrift* zSchrift, Bildschirm* zScreen);
 }

+ 516 - 377
UIMLView.cpp

@@ -13,6 +13,402 @@
 using namespace Framework;
 
 
+UIMLElement::UIMLElement()
+	: ReferenceCounter()
+{}
+
+UIMLElement::~UIMLElement()
+{}
+
+//! wendet die layout parameter zu einer Zeichnung an
+void UIMLElement::layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter)
+{
+	int width = z.getBreite();
+	int height = z.getHeight();
+	if (element.hasAttribute("width"))
+	{
+		Text w = element.getAttributeValue("width");
+		width = w;
+		if (w.getText()[w.getLength() - 1] == '%')
+			width = (int)((pWidth / 100.0) * width);
+	}
+	if (element.hasAttribute("height"))
+	{
+		Text h = element.getAttributeValue("height");
+		height = h;
+		if (h.getText()[h.getLength() - 1] == '%')
+			height = (int)((pHeight / 100.0) * height);
+	}
+	z.setSize(width, height);
+	if (element.hasAttribute("align-left"))
+	{
+		Text la = element.getAttributeValue("align-left");
+		int x = 0;
+		if (la.istGleich("start"))
+			x = 0;
+		else if (la.istGleich("end"))
+			x = pWidth;
+		else
+		{
+			XML::Editor ed = element.zParent()->selectChildsByAttribute("id", la);
+			generalLayouter.layout(*ed.begin().val(), *generalLayouter.zZeichnungById(la), pWidth, pHeight, generalLayouter);
+			Zeichnung* laz = generalLayouter.zZeichnungById(la);
+			if (laz)
+				x = laz->getX() + laz->getBreite();
+		}
+		if (element.hasAttribute("margin-left"))
+		{
+			Text mt = element.getAttributeValue("margin-left");
+			int m = mt;
+			if (mt.getText()[mt.getLength() - 1] == '%')
+				m = (int)((pWidth / 100.0) * m);
+			x += m;
+		}
+		z.setX(x);
+	}
+	else if (element.hasAttribute("align-right"))
+	{
+		Text ra = element.getAttributeValue("align-right");
+		int x = 0;
+		if (ra.istGleich("start"))
+			x = -z.getBreite();
+		else if (ra.istGleich("end"))
+			x = pWidth - z.getBreite();
+		else
+		{
+			XML::Editor ed = element.zParent()->selectChildsByAttribute("id", ra);
+			generalLayouter.layout(*ed.begin().val(), *generalLayouter.zZeichnungById(ra), pWidth, pHeight, generalLayouter);
+			Zeichnung* raz = generalLayouter.zZeichnungById(ra);
+			if (raz)
+				x = raz->getX() - z.getBreite();
+		}
+		if (element.hasAttribute("margin-right"))
+		{
+			Text mt = element.getAttributeValue("margin-right");
+			int m = mt;
+			if (mt.getText()[mt.getLength() - 1] == '%')
+				m = (int)((pWidth / 100.0) * m);
+			x -= m;
+		}
+		z.setX(x);
+	}
+	if (element.hasAttribute("align-top"))
+	{
+		Text ta = element.getAttributeValue("align-top");
+		int y = 0;
+		if (ta.istGleich("start"))
+			y = 0;
+		else if (ta.istGleich("end"))
+			y = pHeight;
+		else
+		{
+			XML::Editor ed = element.zParent()->selectChildsByAttribute("id", ta);
+			generalLayouter.layout(*ed.begin().val(), *generalLayouter.zZeichnungById(ta), pWidth, pHeight, generalLayouter);
+			Zeichnung* taz = generalLayouter.zZeichnungById(ta);
+			if (taz)
+				y = taz->getY() + taz->getHeight();
+		}
+		if (element.hasAttribute("margin-top"))
+		{
+			Text mt = element.getAttributeValue("margin-top");
+			int m = mt;
+			if (mt.getText()[mt.getLength() - 1] == '%')
+				m = (int)((pHeight / 100.0) * m);
+			y += m;
+		}
+		z.setY(y);
+	}
+	else if (element.hasAttribute("align-bottom"))
+	{
+		Text ba = element.getAttributeValue("align-bottom");
+		int y = 0;
+		if (ba.istGleich("start"))
+			y = -z.getHeight();
+		else if (ba.istGleich("end"))
+			y = pHeight - z.getHeight();
+		else
+		{
+			XML::Editor ed = element.zParent()->selectChildsByAttribute("id", ba);
+			generalLayouter.layout(*ed.begin().val(), *generalLayouter.zZeichnungById(ba), pWidth, pHeight, generalLayouter);
+			Zeichnung* baz = generalLayouter.zZeichnungById(ba);
+			if (baz)
+				y = baz->getY() - z.getHeight();
+		}
+		if (element.hasAttribute("margin-bottom"))
+		{
+			Text mt = element.getAttributeValue("margin-bottom");
+			int m = mt;
+			if (mt.getText()[mt.getLength() - 1] == '%')
+				m = (int)((pHeight / 100.0) * m);
+			y -= m;
+		}
+		z.setY(y);
+	}
+	int x = z.getX();
+	int y = z.getY();
+	if (element.hasAttribute("x"))
+	{
+		Text xt = element.getAttributeValue("x");
+		x = xt;
+		if (xt.getText()[xt.getLength() - 1] == '%')
+			x = (int)((pWidth / 100.0) * x);
+	}
+	if (element.hasAttribute("y"))
+	{
+		Text yt = element.getAttributeValue("y");
+		y = yt;
+		if (yt.getText()[yt.getLength() - 1] == '%')
+			y = (int)((pHeight / 100.0) * y);
+	}
+	z.setPosition(x, y);
+	pWidth = z.getInnenBreite();
+	pHeight = z.getInnenHeight();
+	// recursive layout
+	for (auto i = element.getChilds(); i; i++)
+		generalLayouter.layout(*i.val(), *generalLayouter.zZeichnungById(i->getAttributeValue("id")), pWidth, pHeight, generalLayouter);
+}
+
+
+UIMLContainer::UIMLContainer()
+	: UIMLElement()
+{}
+
+UIMLContainer::~UIMLContainer()
+{}
+
+
+UIMLTextField::UIMLTextField()
+	: UIMLElement()
+{}
+
+bool UIMLTextField::isApplicableFor(XML::Element& element)
+{
+	return element.getName().istGleich("textfield");
+}
+
+Zeichnung* UIMLTextField::parseElement(XML::Element& element, UIMLContainer& generalFactory)
+{
+	TextFeld* t = generalFactory.getFactory().createTextFeld(generalFactory.getFactory().initParam);
+	t->addStyle(TextFeld::Style::TextFeld);
+	return t;
+}
+
+void UIMLTextField::layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter)
+{
+	z.setStyle(TextFeld::Style::HCenter, element.hasAttribute("text-align-horizontal") && element.getAttributeValue("text-align-horizontal").istGleich("center"));
+	z.setStyle(TextFeld::Style::VCenter, element.hasAttribute("text-align-vertical") && element.getAttributeValue("text-align-vertical").istGleich("center"));
+	if (element.hasAttribute("font-size"))
+		((TextFeld*)&z)->setSchriftSize((unsigned char)(int)element.getAttributeValue("font-size"));
+	z.setStyle(TextFeld::Style::Editierbar, !element.hasAttribute("disabled") || (element.getAttributeValue("disabled").getLength() != 0 && !element.getAttributeValue("disabled").istGleich("true")));
+	((TextFeld*)&z)->setText(element.getText());
+	UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
+}
+
+
+UIMLButton::UIMLButton()
+	: UIMLElement()
+{}
+
+bool UIMLButton::isApplicableFor(XML::Element& element)
+{
+	return element.getName().istGleich("button");
+}
+
+Zeichnung* UIMLButton::parseElement(XML::Element& element, UIMLContainer& generalFactory)
+{
+	Knopf* k = generalFactory.getFactory().createKnopf(generalFactory.getFactory().initParam);
+	return k;
+}
+
+void UIMLButton::layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter)
+{
+	if (element.hasAttribute("font-size"))
+		((Knopf*)&z)->setSchriftSize((unsigned char)(int)element.getAttributeValue("font-size"));
+	((Knopf*)&z)->setText(element.getText());
+	UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
+}
+
+
+UIMLCheck::UIMLCheck()
+	: UIMLElement()
+{}
+
+bool UIMLCheck::isApplicableFor(XML::Element& element)
+{
+	return element.getName().istGleich("check");
+}
+
+Zeichnung* UIMLCheck::parseElement(XML::Element& element, UIMLContainer& generalFactory)
+{
+	KontrollKnopf* k = generalFactory.getFactory().createKontrollKnopf(generalFactory.getFactory().initParam);
+	return k;
+}
+
+void UIMLCheck::layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter)
+{
+	((KontrollKnopf*)&z)->setText(element.getText());
+	((KontrollKnopf*)&z)->setSText(element.getText());
+	z.setStyle(KontrollKnopf::Style::Selected, element.hasAttribute("selected"));
+	if (element.hasAttribute("font-size"))
+		((KontrollKnopf*)&z)->setSSize((unsigned char)(int)element.getAttributeValue("font-size"));
+	UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
+}
+
+
+UIMLText::UIMLText()
+	: UIMLElement()
+{}
+
+bool UIMLText::isApplicableFor(XML::Element& element)
+{
+	return element.getName().istGleich("text");
+}
+
+Zeichnung* UIMLText::parseElement(XML::Element& element, UIMLContainer& generalFactory)
+{
+	TextFeld* t = generalFactory.getFactory().createTextFeld(generalFactory.getFactory().initParam);
+	t->addStyle(TextFeld::Style::Text);
+	return t;
+}
+
+void UIMLText::layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter)
+{
+	z.setStyle(TextFeld::Style::HCenter, element.hasAttribute("text-align-horizontal") && element.getAttributeValue("text-align-horizontal").istGleich("center"));
+	z.setStyle(TextFeld::Style::VCenter, element.hasAttribute("text-align-vertical") && element.getAttributeValue("text-align-vertical").istGleich("center"));
+	if (element.hasAttribute("font-size"))
+		((TextFeld*)&z)->setSchriftSize((unsigned char)(int)element.getAttributeValue("font-size"));
+	z.setStyle(TextFeld::Style::Editierbar, !element.hasAttribute("disabled") || (element.getAttributeValue("disabled").getLength() != 0 && !element.getAttributeValue("disabled").istGleich("true")));
+	((TextFeld*)&z)->setText(element.getText());
+	UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
+}
+
+
+UIMLTextArea::UIMLTextArea()
+	: UIMLElement()
+{}
+
+bool UIMLTextArea::isApplicableFor(XML::Element& element)
+{
+	return element.getName().istGleich("textarea");
+}
+
+Zeichnung* UIMLTextArea::parseElement(XML::Element& element, UIMLContainer& generalFactory)
+{
+	TextFeld* t = generalFactory.getFactory().createTextFeld(generalFactory.getFactory().initParam);
+	t->addStyle(TextFeld::Style::TextGebiet);
+	return t;
+}
+
+void UIMLTextArea::layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter)
+{
+	z.setStyle(TextFeld::Style::HCenter, element.hasAttribute("text-align-horizontal") && element.getAttributeValue("text-align-horizontal").istGleich("center"));
+	z.setStyle(TextFeld::Style::VCenter, element.hasAttribute("text-align-vertical") && element.getAttributeValue("text-align-vertical").istGleich("center"));
+	if (element.hasAttribute("font-size"))
+		((TextFeld*)&z)->setSchriftSize((unsigned char)(int)element.getAttributeValue("font-size"));
+	z.setStyle(TextFeld::Style::Editierbar, !element.hasAttribute("disabled") || (element.getAttributeValue("disabled").getLength() != 0 && !element.getAttributeValue("disabled").istGleich("true")));
+	((TextFeld*)&z)->setText(element.getText());
+	((TextFeld*)&z)->zTextRenderer()->textFormatieren(((TextFeld*)&z)->zText(), z.getInnenBreite());
+	UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
+}
+
+
+UIMLTable::UIMLTable()
+	: UIMLElement()
+{}
+
+bool UIMLTable::isApplicableFor(XML::Element& element)
+{
+	return element.getName().istGleich("table");
+}
+
+Zeichnung* UIMLTable::parseElement(XML::Element& element, UIMLContainer& generalFactory)
+{
+	ObjTabelle* t = generalFactory.getFactory().createObjTabelle(generalFactory.getFactory().initParam);
+	int index = 0;
+	for (auto i = element.getChilds(); i; i++)
+	{
+		Text id;
+		if (i->hasAttribute("id"))
+			id = i->getAttributeValue("id");
+		else
+		{
+			id = Text("_") += index++;
+			i->setAttribute("id", id);
+		}
+		if (i->getName().istGleich("tr"))
+		{
+			t->addZeile(id);
+			Text line = id;
+			int c = 1;
+			for (auto j = i->getChilds(); j; j++)
+			{
+				Zeichnung* z = generalFactory.parseElement(*i.val(), generalFactory);
+				if (t->getSpaltenAnzahl() < c)
+					t->addSpalte(Text(c - 1));
+				if (z)
+					t->setZeichnungZ((char*)Text(c - 1), (char*)line, dynamic_cast<Zeichnung*>(z->getThis()));
+				c++;
+			}
+		}
+	}
+	return t;
+}
+
+void UIMLTable::layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter)
+{
+	z.setStyle(ObjTabelle::Style::HScroll, element.hasAttribute("scroll") && element.getAttributeValue("scroll").istGleich("horizontal"));
+	z.setStyle(ObjTabelle::Style::VScroll, element.hasAttribute("scroll") && element.getAttributeValue("scroll").istGleich("vertical"));
+	z.setStyle(ObjTabelle::Style::scroll, element.hasAttribute("scroll") && element.getAttributeValue("scroll").istGleich("both"));
+	UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
+	ObjTabelle* objT = (ObjTabelle*)&z;
+	if (objT->getZeilenAnzahl() > 0)
+	{
+		if (element.hasAttribute("line-height"))
+		{
+			int height = element.getAttributeValue("line-height");
+			for (int i = 0; i < objT->getZeilenAnzahl(); i++)
+				objT->setZeilenHeight(i, height);
+		}
+		for (int i = 0; i < objT->getSpaltenAnzahl(); i++)
+		{
+			if (objT->zZeichnung(i, 0))
+				objT->setSpaltenBreite(i, objT->zZeichnung(i, 0)->getBreite());
+		}
+	}
+}
+
+
+UIMLFrame::UIMLFrame()
+	: UIMLElement()
+{}
+
+bool UIMLFrame::isApplicableFor(XML::Element& element)
+{
+	return element.getName().istGleich("frame");
+}
+
+Zeichnung* UIMLFrame::parseElement(XML::Element& element, UIMLContainer& generalFactory)
+{
+	Fenster* f = generalFactory.getFactory().createFenster(generalFactory.getFactory().initParam);
+	for (auto i = element.getChilds(); i; i++)
+	{
+		Zeichnung* z = generalFactory.parseElement(*i.val(), generalFactory);
+		if (z)
+			f->addMember(dynamic_cast<Zeichnung*>(z->getThis()));
+	}
+	return f;
+}
+
+void UIMLFrame::layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter)
+{
+	if (element.hasAttribute("title"))
+		((Fenster*)&z)->setTitel(element.getAttributeValue("title"));
+	if (element.hasAttribute("title-height"))
+		((Fenster*)&z)->zTTextFeld()->setSize(((Fenster*)&z)->zTTextFeld()->getBreite(), element.getAttributeValue("title-height"));
+	UIMLElement::layout(element, z, pWidth, pHeight, generalLayouter);
+}
+
+
 // Erstellt eine UIML View
 UIMLView::UIMLView()
 	: ZeichnungHintergrund()
@@ -97,376 +493,6 @@ void UIMLView::doMausEreignis(MausEreignis& me, bool userRet)
 	}
 }
 
-void UIMLView::parseTable(Iterator<XML::Element*> childs, ObjTabelle* table)
-{
-	for (auto i = childs; i; i++)
-	{
-		Text id;
-		if (i->hasAttribute("id"))
-			id = i->getAttributeValue("id");
-		else
-		{
-			id = Text("_") += nextId++;
-			i->setAttribute("id", id);
-		}
-		if (i->getName().istGleich("tr"))
-		{
-			table->addZeile(id);
-			Text line = id;
-			int c = 1;
-			for (auto j = i->getChilds(); j; j++)
-			{
-				Zeichnung* z = parseElement(j._);
-				if (table->getSpaltenAnzahl() < c)
-					table->addSpalte(Text(c - 1));
-				if (z)
-					table->setZeichnungZ((char*)Text(c - 1), (char*)line, dynamic_cast<Zeichnung*>(z->getThis()));
-				c++;
-			}
-		}
-	}
-}
-
-void UIMLView::parseFrame(Iterator<XML::Element*> childs, Fenster* frame)
-{
-	for (auto i = childs; i; i++)
-	{
-		Zeichnung* z = parseElement(i._);
-		if (z)
-			frame->addMember(dynamic_cast<Zeichnung*>(z->getThis()));
-	}
-}
-
-Zeichnung* UIMLView::parseElement(XML::Element* e)
-{
-	Text id;
-	if (e->hasAttribute("id"))
-		id = e->getAttributeValue("id");
-	else
-	{
-		id = Text("_") += nextId++;
-		e->setAttribute("id", id);
-	}
-	Zeichnung* z = members->z(id, id.getLength());
-	if (!z)
-	{
-		// precompute attributes
-		if (e->hasAttribute("margin"))
-		{
-			Text m = e->getAttributeValue("margin");
-			if (!e->hasAttribute("margin-left"))
-				e->setAttribute("margin-left", m);
-			if (!e->hasAttribute("margin-top"))
-				e->setAttribute("margin-top", m);
-			if (!e->hasAttribute("margin-right"))
-				e->setAttribute("margin-right", m);
-			if (!e->hasAttribute("margin-bottom"))
-				e->setAttribute("margin-bottom", m);
-		}
-		if (e->hasAttribute("class"))
-		{
-			Text c = e->getAttributeValue("class");
-			while (1)
-			{
-				Text* t;
-				if (c.hat(","))
-					t = c.getTeilText(0, c.positionVon(','));
-				else
-					t = new Text(c);
-				XML::Editor ce = dom->selectChildsByName("class").whereAttributeEquals("id", *t);
-				for (auto i = ce.begin(); i; i++)
-				{
-					for (auto j = i->getAttributeNames(), k = i->getAttributeValues(); j && k; j++, k++)
-					{
-						if (!e->hasAttribute(j->getText()))
-							e->setAttribute(j->getText(), i->getText());
-					}
-				}
-				t->release();
-				if (c.hat(","))
-					c.remove(0, c.positionVon(',' + 1));
-				else
-					break;
-			}
-		}
-		if (e->hasAttribute("text-align"))
-		{
-			if (!e->hasAttribute("text-align-horizontal"))
-				e->setAttribute("text-align-horizontal", e->getAttributeValue("text-align"));
-			if (!e->hasAttribute("text-align-vertical"))
-				e->setAttribute("text-align-vertical", e->getAttributeValue("text-align"));
-		}
-		// create objects
-		if (e->getName().istGleich("textfield") ||
-			e->getName().istGleich("text") ||
-			e->getName().istGleich("textarea"))
-		{
-			TextFeld* t = init.createTextFeld(init.initParam);
-			if (e->getName().istGleich("textfield"))
-				t->addStyle(TextFeld::Style::TextFeld);
-			if (e->getName().istGleich("text"))
-				t->addStyle(TextFeld::Style::Text);
-			if (e->getName().istGleich("textarea"))
-				t->addStyle(TextFeld::Style::TextGebiet);
-			t->setText(e->getText());
-			if (e->hasAttribute("font-size"))
-				t->setSchriftSize((unsigned char)(int)e->getAttributeValue("font-size"));
-			if (e->hasAttribute("text-align-horizontal"))
-			{
-				if (e->getAttributeValue("text-align-horizontal").istGleich("center"))
-					t->addStyle(TextFeld::Style::HCenter);
-			}
-			if (e->hasAttribute("text-align-vertical"))
-			{
-				if (e->getAttributeValue("text-align-vertical").istGleich("center"))
-					t->addStyle(TextFeld::Style::VCenter);
-			}
-			if (e->hasAttribute("disabled"))
-				t->removeStyle(TextFeld::Style::Editierbar);
-			z = t;
-		}
-		if (e->getName().istGleich("button"))
-		{
-			Knopf* k = init.createKnopf(init.initParam);
-			k->setText(e->getText());
-			if (e->hasAttribute("font-size"))
-				k->setSchriftSize((unsigned char)(int)e->getAttributeValue("font-size"));
-			z = k;
-		}
-		if (e->getName().istGleich("check"))
-		{
-			KontrollKnopf* k = init.createKontrollKnopf(init.initParam);
-			k->setText(e->getText());
-			k->setSText(e->getText());
-			k->setStyle(KontrollKnopf::Style::Selected, e->hasAttribute("selected"));
-			if (e->hasAttribute("font-size"))
-				k->setSSize((unsigned char)(int)e->getAttributeValue("font-size"));
-			z = k;
-		}
-		if (e->getName().istGleich("table"))
-		{
-			ObjTabelle* t = init.createObjTabelle(init.initParam);
-			parseTable(e->getChilds(), t);
-			if (e->hasAttribute("scroll"))
-			{
-				if (e->getAttributeValue("scroll").istGleich("horizontal"))
-					t->addStyle(ObjTabelle::Style::HScroll);
-				if (e->getAttributeValue("scroll").istGleich("vertical"))
-					t->addStyle(ObjTabelle::Style::VScroll);
-				if (e->getAttributeValue("scroll").istGleich("both"))
-					t->addStyle(ObjTabelle::Style::scroll);
-			}
-			z = t;
-		}
-		if (e->getName().istGleich("frame"))
-		{
-			Fenster* f = init.createFenster(init.initParam);
-			parseFrame(e->getChilds(), f);
-			if (e->hasAttribute("title"))
-				f->setTitel(e->getAttributeValue("title"));
-			if (e->hasAttribute("title-height"))
-				f->zTTextFeld()->setSize(f->zTTextFeld()->getBreite(), e->getAttributeValue("title-height"));
-			z = f;
-		}
-		// add general attributes
-		if (z && e->hasAttribute("tooltip"))
-			z->setToolTipText(e->getAttributeValue("tooltip"), init.initParam.bildschirm, init.initParam.schrift);
-		if (z && e->hasAttribute("style"))
-			z->setStyle((__int64)e->getAttributeValue("style"));
-		if (z && e->hasAttribute("hidden"))
-			z->removeStyle(Zeichnung::Style::Sichtbar);
-		if (z && e->hasAttribute("disabled"))
-			z->removeStyle(Zeichnung::Style::Erlaubt);
-		if (z)
-			members->set(id, id.getLength(), z);
-	}
-	return z;
-}
-
-void UIMLView::layout(XML::Element* e, int pWidth, int pHeight)
-{
-	Text id = e->getAttributeValue("id");
-	Zeichnung* z = members->z(id, id.getLength());
-	if (z)
-	{
-		int width = z->getBreite();
-		int height = z->getHeight();
-		if (e->hasAttribute("width"))
-		{
-			Text w = e->getAttributeValue("width");
-			width = w;
-			if (w.getText()[w.getLength() - 1] == '%')
-				width = (int)((pWidth / 100.0) * width);
-		}
-		if (e->hasAttribute("height"))
-		{
-			Text h = e->getAttributeValue("height");
-			height = h;
-			if (h.getText()[h.getLength() - 1] == '%')
-				height = (int)((pHeight / 100.0) * height);
-		}
-		z->setSize(width, height);
-		if (e->hasAttribute("align-left"))
-		{
-			Text la = e->getAttributeValue("align-left");
-			int x = 0;
-			if (la.istGleich("start"))
-				x = 0;
-			else if (la.istGleich("end"))
-				x = pWidth;
-			else
-			{
-				XML::Editor ed = e->zParent()->selectChildsByAttribute("id", la);
-				for (auto i = ed.begin(); i; i++)
-					layout(i, pWidth, pHeight);
-				Zeichnung* laz = members->z(la, la.getLength());
-				if (laz)
-					x = laz->getX() + laz->getBreite();
-			}
-			if (e->hasAttribute("margin-left"))
-			{
-				Text mt = e->getAttributeValue("margin-left");
-				int m = mt;
-				if (mt.getText()[mt.getLength() - 1] == '%')
-					m = (int)((pWidth / 100.0) * m);
-				x += m;
-			}
-			z->setX(x);
-		}
-		else if (e->hasAttribute("align-right"))
-		{
-			Text ra = e->getAttributeValue("align-right");
-			int x = 0;
-			if (ra.istGleich("start"))
-				x = -z->getBreite();
-			else if (ra.istGleich("end"))
-				x = pWidth - z->getBreite();
-			else
-			{
-				XML::Editor ed = e->zParent()->selectChildsByAttribute("id", ra);
-				for (auto i = ed.begin(); i; i++)
-					layout(i, pWidth, pHeight);
-				Zeichnung* raz = members->z(ra, ra.getLength());
-				if (raz)
-					x = raz->getX() - z->getBreite();
-			}
-			if (e->hasAttribute("margin-right"))
-			{
-				Text mt = e->getAttributeValue("margin-right");
-				int m = mt;
-				if (mt.getText()[mt.getLength() - 1] == '%')
-					m = (int)((pWidth / 100.0) * m);
-				x -= m;
-			}
-			z->setX(x);
-		}
-		if (e->hasAttribute("align-top"))
-		{
-			Text ta = e->getAttributeValue("align-top");
-			int y = 0;
-			if (ta.istGleich("start"))
-				y = 0;
-			else if (ta.istGleich("end"))
-				y = pHeight;
-			else
-			{
-				XML::Editor ed = e->zParent()->selectChildsByAttribute("id", ta);
-				for (auto i = ed.begin(); i; i++)
-					layout(i, pWidth, pHeight);
-				Zeichnung* taz = members->z(ta, ta.getLength());
-				if (taz)
-					y = taz->getY() + taz->getHeight();
-			}
-			if (e->hasAttribute("margin-top"))
-			{
-				Text mt = e->getAttributeValue("margin-top");
-				int m = mt;
-				if (mt.getText()[mt.getLength() - 1] == '%')
-					m = (int)((pHeight / 100.0) * m);
-				y += m;
-			}
-			z->setY(y);
-		}
-		else if (e->hasAttribute("align-bottom"))
-		{
-			Text ba = e->getAttributeValue("align-bottom");
-			int y = 0;
-			if (ba.istGleich("start"))
-				y = -z->getHeight();
-			else if (ba.istGleich("end"))
-				y = pHeight - z->getHeight();
-			else
-			{
-				XML::Editor ed = e->zParent()->selectChildsByAttribute("id", ba);
-				for (auto i = ed.begin(); i; i++)
-					layout(i, pWidth, pHeight);
-				Zeichnung* baz = members->z(ba, ba.getLength());
-				if (baz)
-					y = baz->getY() - z->getHeight();
-			}
-			if (e->hasAttribute("margin-bottom"))
-			{
-				Text mt = e->getAttributeValue("margin-bottom");
-				int m = mt;
-				if (mt.getText()[mt.getLength() - 1] == '%')
-					m = (int)((pHeight / 100.0) * m);
-				y -= m;
-			}
-			z->setY(y);
-		}
-		int x = z->getX();
-		int y = z->getY();
-		if (e->hasAttribute("x"))
-		{
-			Text xt = e->getAttributeValue("x");
-			x = xt;
-			if (xt.getText()[xt.getLength() - 1] == '%')
-				x = (int)((pWidth / 100.0) * x);
-		}
-		if (e->hasAttribute("y"))
-		{
-			Text yt = e->getAttributeValue("y");
-			y = yt;
-			if (yt.getText()[yt.getLength() - 1] == '%')
-				y = (int)((pHeight / 100.0) * y);
-		}
-		z->setPosition(x, y);
-		if (e->getName().istGleich("textarea"))
-		{
-			((TextFeld*)z)->zTextRenderer()->textFormatieren(((TextFeld*)z)->zText(), z->getInnenBreite());
-		}
-	}
-	if (z)
-	{
-		pWidth = z->getInnenBreite();
-		pHeight = z->getInnenHeight();
-	}
-	// recursive layout
-	for (auto i = e->getChilds(); i; i++)
-		layout(i, pWidth, pHeight);
-	if (z)
-	{
-		if (e->getName().istGleich("table"))
-		{
-			ObjTabelle* objT = (ObjTabelle*)z;
-			if (objT->getZeilenAnzahl() > 0)
-			{
-				if (e->hasAttribute("line-height"))
-				{
-					int height = e->getAttributeValue("line-height");
-					for (int i = 0; i < objT->getZeilenAnzahl(); i++)
-						objT->setZeilenHeight(i, height);
-				}
-				for (int i = 0; i < objT->getSpaltenAnzahl(); i++)
-				{
-					if (objT->zZeichnung(i, 0))
-						objT->setSpaltenBreite(i, objT->zZeichnung(i, 0)->getBreite());
-				}
-			}
-		}
-	}
-}
-
 // setzt den inhalt der view
 //  uiml: Ein xml element gemät des ksg uiml standarts
 void UIMLView::setUIML(XML::Element* uiml)
@@ -480,7 +506,7 @@ void UIMLView::setUIML(XML::Element* uiml)
 	{
 		for (auto i = dom->getChilds(); i; i++)
 		{
-			parseElement(i._);
+			parseElement(*i.val(), *this);
 		}
 	}
 }
@@ -494,9 +520,16 @@ void UIMLView::setUIML(Text uiml)
 
 // Gibt eine zeichnung zurück, welche in uiml eine bestimmte id hat
 //  id: die id der Zeichnung
-Zeichnung* UIMLView::zZeichnung(Text id)
+Zeichnung* UIMLView::zZeichnungById(const char* id)
 {
-	return members->z(id, id.getLength());
+	return members->z(id, textLength(id));
+}
+
+// Gibt eine zeichnung zurück, welche in uiml eine bestimmte id hat
+//  id: die id der Zeichnung
+Zeichnung* UIMLView::getZeichnungById(const char* id)
+{
+	return members->get(id, textLength(id));
 }
 
 // aktualisiert größe und position aller Zeichnungen gemäß den spezifikationen in UIML
@@ -506,7 +539,12 @@ void UIMLView::layout()
 	{
 		for (auto i = dom->getChilds(); i; i++)
 		{
-			layout(i._, this->getInnenBreite(), this->getInnenHeight());
+			Text id = i->getAttributeValue("id");
+			Zeichnung* z = zZeichnungById(id);
+			if (z)
+			{
+				layout(*i.val(), *z, this->getInnenBreite(), this->getInnenHeight(), *this);
+			}
 		}
 	}
 }
@@ -516,7 +554,7 @@ void UIMLView::layout()
 Text UIMLView::addMember(Text uiml)
 {
 	XML::Element* e = new XML::Element(uiml);
-	if (parseElement(e))
+	if (parseElement(*e, *this))
 		dom->addChildAtFront(e);
 	return e->getAttributeValue("id");
 }
@@ -534,7 +572,7 @@ Text UIMLView::addMember(Text uiml, Text parentId)
 		{
 			if (ed2.begin()->getName().istGleich("frame"))
 			{
-				Zeichnung* z = parseElement(e);
+				Zeichnung* z = parseElement(*e, *this);
 				if (z)
 				{
 					dynamic_cast<Fenster*>(members->z(parentId, parentId.getLength()))->addMember(dynamic_cast<Zeichnung*>(z->getThis()));
@@ -627,4 +665,105 @@ XML::Element* UIMLView::zDom() const
 XML::Element* UIMLView::getDom() const
 {
 	return dom ? dynamic_cast<XML::Element*>(dom->getThis()) : 0;
-}
+}
+
+bool UIMLView::isApplicableFor(XML::Element& element)
+{
+	for (UIMLElement* e : knownElements)
+	{
+		if (e->isApplicableFor(element))
+			return 1;
+	}
+	return 0;
+}
+
+Zeichnung* UIMLView::parseElement(XML::Element& element, UIMLContainer& generalFactory)
+{
+	Text id;
+	if (element.hasAttribute("id"))
+		id = element.getAttributeValue("id");
+	else
+	{
+		id = Text("_") += nextId++;
+		element.setAttribute("id", id);
+	}
+	Zeichnung* z = members->z(id, id.getLength());
+	if (!z)
+	{
+		// precompute attributes
+		if (element.hasAttribute("margin"))
+		{
+			Text m = element.getAttributeValue("margin");
+			if (!element.hasAttribute("margin-left"))
+				element.setAttribute("margin-left", m);
+			if (!element.hasAttribute("margin-top"))
+				element.setAttribute("margin-top", m);
+			if (!element.hasAttribute("margin-right"))
+				element.setAttribute("margin-right", m);
+			if (!element.hasAttribute("margin-bottom"))
+				element.setAttribute("margin-bottom", m);
+		}
+		if (element.hasAttribute("class"))
+		{
+			Text c = element.getAttributeValue("class");
+			while (1)
+			{
+				Text* t;
+				if (c.hat(","))
+					t = c.getTeilText(0, c.positionVon(','));
+				else
+					t = new Text(c);
+				XML::Editor ce = dom->selectChildsByName("class").whereAttributeEquals("id", *t);
+				for (auto i = ce.begin(); i; i++)
+				{
+					for (auto j = i->getAttributeNames(), k = i->getAttributeValues(); j && k; j++, k++)
+					{
+						if (!element.hasAttribute(j->getText()))
+							element.setAttribute(j->getText(), i->getText());
+					}
+				}
+				t->release();
+				if (c.hat(","))
+					c.remove(0, c.positionVon(',' + 1));
+				else
+					break;
+			}
+		}
+		if (element.hasAttribute("text-align"))
+		{
+			if (!element.hasAttribute("text-align-horizontal"))
+				element.setAttribute("text-align-horizontal", element.getAttributeValue("text-align"));
+			if (!element.hasAttribute("text-align-vertical"))
+				element.setAttribute("text-align-vertical", element.getAttributeValue("text-align"));
+		}
+		// create objects
+		for (UIMLElement* e : knownElements)
+		{
+			if (e->isApplicableFor(element))
+			{
+				z = e->parseElement(element, *this);
+				break;
+			}
+		}
+		if (z)
+			members->set(id, id.getLength(), z);
+	}
+	return z;
+}
+
+void UIMLView::layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter)
+{
+	for (UIMLElement* e : knownElements)
+	{
+		if (e->isApplicableFor(element))
+		{
+			e->layout(element, z, pWidth, pHeight, *this);
+			break;
+		}
+	}
+}
+
+const UIInit& UIMLView::getFactory()
+{
+	return init;
+}

+ 231 - 132
UIMLView.h

@@ -7,136 +7,235 @@
 
 namespace Framework
 {
-    class Text;
-    class ObjTabelle;
-    class Schrift;
-    class Bildschirm;
-
-    namespace XML
-    {
-        class Element;
-    }
-
-    /**
-      KSG UIML Standart
-      possible XML elements:
-        - uimlview (the root element of uiml),
-        - class (only as direct child of uimlview),
-        - textfield,
-        - button,
-        - check, (KontrollKnopf)
-        - text,
-        - textarea,
-        - table (allowed child elements: tr),
-        - tr (allowed child elements: textfield, button, table, text, textarea, frame),
-        - frame (allowed child elements: textfield, button, table, text, textarea, frame).
-      possible global XML attributes:
-        - id (string should be unique),
-        - x (integer, optional % char at end),
-        - y (integer, optional % char at end),
-        - width (integer, optional % char at end),
-        - height (integer, optional % char at end),
-        - margin (integer, optional % char at end),
-        - margin-left (integer, optional % char at end),
-        - margin-top (integer, optional % char at end),
-        - margin-right (integer, optional % char at end),
-        - margin-bottom (integer, optional % char at end),
-        - align-left (string (id values of other elements or keywords: start, end)),
-        - align-top (string (id values of other elements or keywords: start, end)),
-        - align-bottom ((string (id values of other elements or keywords: start, end)),
-        - align-right (string (id values of other elements or keywords: start, end)),
-        - tooltip (string),
-        - style (hex __int64),
-        - class (string (id of class element))
-
-        attribute die sich gegenseitig ausschließen:
-        - align-left / align-right
-        - align-top / align-bottom
-
-      spezific attributes:
-         - font-size (textfield, text, textarea, button)
-         - text-align (textfield, text, textarea)
-         - text-align-horizontal (textfield, text, textarea)
-         - text-align-vertical (textfield, text, textarea)
-
-      example:
-        \code
-        <view>
-          <textfield id="element_at_top_left" align-left="start", align-top="start", margin-left="5", margin-top="5" width="90%" height="30"/>
-          <table id="element_below_textfield" align-left="start", aliign-top="element_at_top_left", margin-left="5", margin-top="5" width="90%" height="300">
-            <tr>
-              <button id="a_button_in_a_table"/>
-              <textfield id="a_textfield_in_a_table"/>
-            </tr>
-          </table>
-        </view>
-        \endcode
-    */
-    class UIMLView : public ZeichnungHintergrund
-    {
-    private:
-        UIInit init;
-        Trie< Zeichnung > *members;
-        XML::Element *dom;
-        int nextId;
-        void parseTable( Iterator<XML::Element*> childs, ObjTabelle *table );
-        void parseFrame( Iterator<XML::Element*> childs, Fenster *frame );
-        Zeichnung *parseElement( XML::Element *e );
-        void layout( XML::Element *e, int pWidth, int pHeight );
-        //! Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
-        //! \param me Das Ereignis
-        DLLEXPORT virtual void doMausEreignis( MausEreignis &me, bool userRet ) override;
-
-    public:
-        //! Erstellt eine UIML View
-        DLLEXPORT UIMLView();
-        //! Erstellt eine UIML View zu einem UIML Text
-        //! \param uiml Ein xml element gemät des KSG UIML standarts
-        //! \param screen Ein zeiger für den Belschirm auf dem die tooltips angezeigt werden sollen
-        //! \param schrift Die schrift mit der der Text gezeichnet werden soll
-        DLLEXPORT UIMLView( XML::Element *uiml, UIInit &init );
-        //! Erstellt eine UIML View zu einem UIML Text
-        //! \param uiml Ein xml text gemät des KSG UIML standarts
-        //! \param screen Ein zeiger für den Belschirm auf dem die tooltips angezeigt werden sollen
-        //! \param schrift Die schrift mit der der Text gezeichnet werden soll
-        DLLEXPORT UIMLView( Text uiml, UIInit &init );
-        DLLEXPORT ~UIMLView();
-        //! setzt den inhalt der view
-        //! \param uiml Ein xml element gemät des KSG UIML standarts
-        DLLEXPORT void setUIML( XML::Element *uiml );
-        //! setzt den inhalt der view
-        //! \param uiml Ein xml text gemät des KSG UIML standarts
-        DLLEXPORT void setUIML( Text uiml );
-        //! aktualisiert größe und position aller Zeichnungen gemäß den spezifikationen in UIML
-        DLLEXPORT void layout();
-        //! fügt ein element hinzu
-        //! \param uiml Ein xml text gemät des KSG UIML standarts, welcher das neue Objekt darstellt
-        //! \return id des neuen Elements
-        DLLEXPORT Text addMember( Text uiml );
-        //! fügt ein element zu einem Elternelement hinzu (funktioniert momentan nur mit frame Objekten)
-        //! \param uiml Ein xml text gemät des KSG UIML standarts, welcher das neue Objekt darstellt
-        //! \return id des neuen Elements
-        DLLEXPORT Text addMember( Text uiml, Text parentId );
-        //! entfernt ein element
-        //! \param id id des Elements
-        DLLEXPORT void removeMember( Text id );
-        //! Gibt eine zeichnung zurück, welche in uiml eine bestimmte id hat
-        //! \param id die id der Zeichnung
-        DLLEXPORT Zeichnung *zZeichnung( Text id );
-        //! Verarbeitet ein Tastatur Ereignis. Wird vom Framework automatisch aufgerufen
-        //! \param te Das Ereignis
-        DLLEXPORT virtual void doTastaturEreignis( TastaturEreignis &te );
-        //! Updated den Zeichenhintergrund
-        //! \param tickVal Die vergangene Zeit in Sekunden, die seit dem Letzten Aufruf dieser Funktion verstrichen ist
-        //! \return 1, wenn das Bild neu gezeichnet werden muss. 0 sonnst
-        DLLEXPORT bool tick( double tickVal ) override;
-        //! Zeichnet den Hintergrund eines Zeichnunges nach rObj
-        DLLEXPORT void render( Bild &rObj ) override;
-        //! Gibt den Dom Tree ohne erhöhten reference counter zurück
-        //! Änderungen am Dom Tree sollten vermieden werden (nur änderungen von attributen einzelner elemente sind erlaubt)
-        DLLEXPORT XML::Element *zDom() const;
-        //! Gibt den Dom Tree zurück
-        //! Änderungen am Dom Tree sollten vermieden werden (nur änderungen von attributen einzelner elemente sind erlaubt)
-        DLLEXPORT XML::Element *getDom() const;
-    };
+	class Text;
+	class ObjTabelle;
+	class Schrift;
+	class Bildschirm;
+	class UIMLContainer;
+
+	namespace XML
+	{
+		class Element;
+	}
+
+
+	class UIMLElement : public virtual ReferenceCounter
+	{
+	public:
+		DLLEXPORT UIMLElement();
+		DLLEXPORT virtual ~UIMLElement();
+		//! prüft, ob dieses UIML Element für ein bestimmtes xml Element zuständig ist
+		virtual bool isApplicableFor(XML::Element& element) = 0;
+		//! erstellt eine neue Zeichnung zu einem gegebenen xml Element
+		virtual Zeichnung* parseElement(XML::Element& element, UIMLContainer& generalFactory) = 0;
+		//! wendet die layout parameter zu einer Zeichnung an
+		virtual void layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter);
+	};
+
+	class UIMLContainer : public UIMLElement
+	{
+	public:
+		DLLEXPORT UIMLContainer();
+		DLLEXPORT virtual ~UIMLContainer();
+		virtual Zeichnung* zZeichnungById(const char* id) = 0;
+		virtual Zeichnung* getZeichnungById(const char* id) = 0;
+		virtual const UIInit& getFactory() = 0;
+	};
+
+	class UIMLTextField : public UIMLElement
+	{
+	public:
+		DLLEXPORT UIMLTextField();
+		DLLEXPORT bool isApplicableFor(XML::Element& element) override;
+		DLLEXPORT Zeichnung* parseElement(XML::Element& element, UIMLContainer& generalFactory) override;
+		DLLEXPORT void layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter) override;
+	};
+
+	class UIMLButton : public UIMLElement
+	{
+	public:
+		DLLEXPORT UIMLButton();
+		DLLEXPORT bool isApplicableFor(XML::Element& element) override;
+		DLLEXPORT Zeichnung* parseElement(XML::Element& element, UIMLContainer& generalFactory) override;
+		DLLEXPORT void layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter) override;
+	};
+
+	class UIMLCheck : public UIMLElement
+	{
+	public:
+		DLLEXPORT UIMLCheck();
+		DLLEXPORT bool isApplicableFor(XML::Element& element) override;
+		DLLEXPORT Zeichnung* parseElement(XML::Element& element, UIMLContainer& generalFactory) override;
+		DLLEXPORT void layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter) override;
+	};
+
+	class UIMLText : public UIMLElement
+	{
+	public:
+		DLLEXPORT UIMLText();
+		DLLEXPORT bool isApplicableFor(XML::Element& element) override;
+		DLLEXPORT Zeichnung* parseElement(XML::Element& element, UIMLContainer& generalFactory) override;
+		DLLEXPORT void layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter) override;
+	};
+
+	class UIMLTextArea : public UIMLElement
+	{
+	public:
+		DLLEXPORT UIMLTextArea();
+		DLLEXPORT bool isApplicableFor(XML::Element& element) override;
+		DLLEXPORT Zeichnung* parseElement(XML::Element& element, UIMLContainer& generalFactory) override;
+		DLLEXPORT void layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter) override;
+	};
+
+	class UIMLTable : public UIMLElement
+	{
+	public:
+		DLLEXPORT UIMLTable();
+		DLLEXPORT bool isApplicableFor(XML::Element& element) override;
+		DLLEXPORT Zeichnung* parseElement(XML::Element& element, UIMLContainer& generalFactory) override;
+		DLLEXPORT void layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter) override;
+	};
+
+	class UIMLFrame : public UIMLElement
+	{
+	public:
+		DLLEXPORT UIMLFrame();
+		DLLEXPORT bool isApplicableFor(XML::Element& element) override;
+		DLLEXPORT Zeichnung* parseElement(XML::Element& element, UIMLContainer& generalFactory) override;
+		DLLEXPORT void layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter) override;
+	};
+
+	/**
+	  KSG UIML Standart
+	  possible XML elements:
+		- uimlview (the root element of uiml),
+		- class (only as direct child of uimlview),
+		- textfield,
+		- button,
+		- check, (KontrollKnopf)
+		- text,
+		- textarea,
+		- table (allowed child elements: tr),
+		- tr (allowed child elements: textfield, button, table, text, textarea, frame),
+		- frame (allowed child elements: textfield, button, table, text, textarea, frame).
+	  possible global XML attributes:
+		- id (string should be unique),
+		- x (integer, optional % char at end),
+		- y (integer, optional % char at end),
+		- width (integer, optional % char at end),
+		- height (integer, optional % char at end),
+		- margin (integer, optional % char at end),
+		- margin-left (integer, optional % char at end),
+		- margin-top (integer, optional % char at end),
+		- margin-right (integer, optional % char at end),
+		- margin-bottom (integer, optional % char at end),
+		- align-left (string (id values of other elements or keywords: start, end)),
+		- align-top (string (id values of other elements or keywords: start, end)),
+		- align-bottom ((string (id values of other elements or keywords: start, end)),
+		- align-right (string (id values of other elements or keywords: start, end)),
+		- tooltip (string),
+		- style (hex __int64),
+		- class (string (id of class element))
+
+		attribute die sich gegenseitig ausschließen:
+		- align-left / align-right
+		- align-top / align-bottom
+
+	  spezific attributes:
+		 - font-size (textfield, text, textarea, button)
+		 - text-align (textfield, text, textarea)
+		 - text-align-horizontal (textfield, text, textarea)
+		 - text-align-vertical (textfield, text, textarea)
+
+	  example:
+		\code
+		<view>
+		  <textfield id="element_at_top_left" align-left="start", align-top="start", margin-left="5", margin-top="5" width="90%" height="30"/>
+		  <table id="element_below_textfield" align-left="start", aliign-top="element_at_top_left", margin-left="5", margin-top="5" width="90%" height="300">
+			<tr>
+			  <button id="a_button_in_a_table"/>
+			  <textfield id="a_textfield_in_a_table"/>
+			</tr>
+		  </table>
+		</view>
+		\endcode
+	*/
+	class UIMLView : public ZeichnungHintergrund, public UIMLContainer
+	{
+	private:
+		RCArray<UIMLElement> knownElements;
+		UIInit init;
+		Trie< Zeichnung >* members;
+		XML::Element* dom;
+		int nextId;
+
+		//! Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
+		//! \param me Das Ereignis
+		DLLEXPORT virtual void doMausEreignis(MausEreignis& me, bool userRet) override;
+
+	public:
+		//! Erstellt eine UIML View
+		DLLEXPORT UIMLView();
+		//! Erstellt eine UIML View zu einem UIML Text
+		//! \param uiml Ein xml element gemät des KSG UIML standarts
+		//! \param screen Ein zeiger für den Belschirm auf dem die tooltips angezeigt werden sollen
+		//! \param schrift Die schrift mit der der Text gezeichnet werden soll
+		DLLEXPORT UIMLView(XML::Element* uiml, UIInit& init);
+		//! Erstellt eine UIML View zu einem UIML Text
+		//! \param uiml Ein xml text gemät des KSG UIML standarts
+		//! \param screen Ein zeiger für den Belschirm auf dem die tooltips angezeigt werden sollen
+		//! \param schrift Die schrift mit der der Text gezeichnet werden soll
+		DLLEXPORT UIMLView(Text uiml, UIInit& init);
+		DLLEXPORT ~UIMLView();
+		//! entfernt alle bekannten elemente, die im uiml verwendet werden können
+		DLLEXPORT void removeAllKnownElements();
+		//! fügt ein neues bekanntes element hinzu, dass danach im uiml verwendet werden kann.
+		DLLEXPORT void addKnownElement(UIMLElement* element);
+		//! prüft, ob ein xml Element ein bekanntes uiml Element ist;
+		DLLEXPORT void isKnownElement(XML::Element* zElement);
+		//! setzt den inhalt der view
+		//! \param uiml Ein xml element gemät des KSG UIML standarts
+		DLLEXPORT void setUIML(XML::Element* uiml);
+		//! setzt den inhalt der view
+		//! \param uiml Ein xml text gemät des KSG UIML standarts
+		DLLEXPORT void setUIML(Text uiml);
+		//! aktualisiert größe und position aller Zeichnungen gemäß den spezifikationen in UIML
+		DLLEXPORT void layout();
+		//! fügt ein element hinzu
+		//! \param uiml Ein xml text gemät des KSG UIML standarts, welcher das neue Objekt darstellt
+		//! \return id des neuen Elements
+		DLLEXPORT Text addMember(Text uiml);
+		//! fügt ein element zu einem Elternelement hinzu (funktioniert momentan nur mit frame Objekten)
+		//! \param uiml Ein xml text gemät des KSG UIML standarts, welcher das neue Objekt darstellt
+		//! \return id des neuen Elements
+		DLLEXPORT Text addMember(Text uiml, Text parentId);
+		//! entfernt ein element
+		//! \param id id des Elements
+		DLLEXPORT void removeMember(Text id);
+		//! Gibt eine zeichnung zurück, welche in uiml eine bestimmte id hat
+		//! \param id die id der Zeichnung
+		DLLEXPORT Zeichnung* zZeichnungById(const char* id) override;
+		//! Gibt eine zeichnung zurück, welche in uiml eine bestimmte id hat
+		//! \param id die id der Zeichnung
+		DLLEXPORT Zeichnung* getZeichnungById(const char* id) override;
+		//! Verarbeitet ein Tastatur Ereignis. Wird vom Framework automatisch aufgerufen
+		//! \param te Das Ereignis
+		DLLEXPORT virtual void doTastaturEreignis(TastaturEreignis& te);
+		//! Updated den Zeichenhintergrund
+		//! \param tickVal Die vergangene Zeit in Sekunden, die seit dem Letzten Aufruf dieser Funktion verstrichen ist
+		//! \return 1, wenn das Bild neu gezeichnet werden muss. 0 sonnst
+		DLLEXPORT bool tick(double tickVal) override;
+		//! Zeichnet den Hintergrund eines Zeichnunges nach rObj
+		DLLEXPORT void render(Bild& rObj) override;
+		//! Gibt den Dom Tree ohne erhöhten reference counter zurück
+		//! Änderungen am Dom Tree sollten vermieden werden (nur änderungen von attributen einzelner elemente sind erlaubt)
+		DLLEXPORT XML::Element* zDom() const;
+		//! Gibt den Dom Tree zurück
+		//! Änderungen am Dom Tree sollten vermieden werden (nur änderungen von attributen einzelner elemente sind erlaubt)
+		DLLEXPORT XML::Element* getDom() const;
+		DLLEXPORT bool isApplicableFor(XML::Element& element) override;
+		DLLEXPORT Zeichnung* parseElement(XML::Element& element, UIMLContainer& generalFactory) override;
+		DLLEXPORT void layout(XML::Element& element, Zeichnung& z, int pWidth, int pHeight, UIMLContainer& generalLayouter) override;
+		DLLEXPORT const UIInit& getFactory() override;
+	};
 }