Browse Source

fix monitor iteration order

Kolja Strohm 2 years ago
parent
commit
ec8eca06e6
2 changed files with 576 additions and 568 deletions
  1. 383 376
      Bildschirm.cpp
  2. 193 192
      Bildschirm.h

+ 383 - 376
Bildschirm.cpp

@@ -25,353 +25,360 @@ using namespace Framework;
 
 // Inhalt der Bildschirmklass aus Bildschirm.h
 // Konstruktor 
-Bildschirm::Bildschirm( WFenster *f )
-    : ReferenceCounter(),
-    api( 0 ),
-    fenster( f ),
-    members( new RCArray<Zeichnung>() ),
-    fillColor( 0xFF000000 ),
-    deckFarbe( 0 ),
-    onTop( 0 ),
-    renderOnTop( 0 ),
-    renderZeichnungen( 1 ),
-    rendering( 0 ),
-    renderZeit( new ZeitMesser() ),
-    tips( new RCArray< ToolTip >() ),
-    tipAnzahl( 0 ),
-    testRend( 1 ),
-    fill( 1 ),
-    rend( 0 )
+Bildschirm::Bildschirm(WFenster* f)
+	: ReferenceCounter(),
+	api(0),
+	fenster(f),
+	members(new RCArray<Zeichnung>()),
+	fillColor(0xFF000000),
+	deckFarbe(0),
+	onTop(0),
+	renderOnTop(0),
+	renderZeichnungen(1),
+	rendering(0),
+	renderZeit(new ZeitMesser()),
+	tips(new RCArray< ToolTip >()),
+	tipAnzahl(0),
+	testRend(1),
+	fill(1),
+	rend(0)
 {}
 
 // Destruktor 
 Bildschirm::~Bildschirm()
 {
-    lock();
+	lock();
 #ifdef WIN32
-    if( fenster )
-        fenster->release();
+	if (fenster)
+		fenster->release();
 #endif
-    members->release();
-    tipAnzahl = 0;
-    tips->release();
-    renderZeit->release();
-    if( onTop )
-        onTop->release();
-    if( api )
-        api->release();
-    unlock();
+	members->release();
+	tipAnzahl = 0;
+	tips->release();
+	renderZeit->release();
+	if (onTop)
+		onTop->release();
+	if (api)
+		api->release();
+	unlock();
 }
 
 // nicht konstant 
 void Bildschirm::lock()
 {
-    cs.lock();
+	cs.lock();
 }
 
 void Bildschirm::unlock()
 {
-    cs.unlock();
+	cs.unlock();
 }
 
-void Bildschirm::setFill( bool f )
+void Bildschirm::setFill(bool f)
 {
-    fill = f;
+	fill = f;
 }
 
 // Aktualisiert die Objekte, mit der die Grafikkarte verwaltet wird
 void Bildschirm::update()
 {
-    lock();
-    api->update();
-    unlock();
+	lock();
+	api->update();
+	unlock();
 }
 
-void Bildschirm::setTestRend( bool tr ) // legt fest, ob vo rendern auf updates geprüft werden soll
+void Bildschirm::setTestRend(bool tr) // legt fest, ob vo rendern auf updates geprüft werden soll
 {
-    testRend = tr;
+	testRend = tr;
 }
 
-void Bildschirm::setRenderZeichnungen( bool rO ) // legt fest, ob die Zeichnunge gerendert werden
+void Bildschirm::setRenderZeichnungen(bool rO) // legt fest, ob die Zeichnunge gerendert werden
 {
-    lock();
-    renderZeichnungen = rO;
-    rend = 1;
-    unlock();
+	lock();
+	renderZeichnungen = rO;
+	rend = 1;
+	unlock();
 }
 
-void Bildschirm::setOnTop( bool onTop ) // legt fest, ob das onTop Zeichnung gerendert wid
+void Bildschirm::setOnTop(bool onTop) // legt fest, ob das onTop Zeichnung gerendert wid
 {
-    renderOnTop = onTop;
-    rend = 1;
+	renderOnTop = onTop;
+	rend = 1;
 }
 
-void Bildschirm::setOnTopZeichnung( Zeichnung *obj ) // setzt das OnTop Zeichnung
+void Bildschirm::setOnTopZeichnung(Zeichnung* obj) // setzt das OnTop Zeichnung
 {
-    lock();
-    if( onTop )
-        onTop->release();
-    onTop = obj;
-    rend = 1;
-    unlock();
+	lock();
+	if (onTop)
+		onTop->release();
+	onTop = obj;
+	rend = 1;
+	unlock();
 }
 
-void Bildschirm::setdeckFarbe( int f ) // setzt die deckFarbe
+void Bildschirm::setdeckFarbe(int f) // setzt die deckFarbe
 {
-    deckFarbe = f;
-    rend = 1;
+	deckFarbe = f;
+	rend = 1;
 }
 
-void Bildschirm::addMember( Zeichnung *obj ) // Fügt ein Zeichnung hinzu
+void Bildschirm::addMember(Zeichnung* obj) // Fügt ein Zeichnung hinzu
 {
-    lock();
-    members->add( obj );
-    rend = 1;
-    unlock();
+	lock();
+	members->add(obj);
+	rend = 1;
+	unlock();
 }
 
-void Bildschirm::removeMember( Zeichnung *zObj ) // Entfernt ein Zeichnung
+void Bildschirm::removeMember(Zeichnung* zObj) // Entfernt ein Zeichnung
 {
-    lock();
-    for( int i = 0; i < members->getEintragAnzahl(); i++ )
-    {
-        if( members->z( i ) == zObj )
-            members->remove( i );
-    }
-    rend = 1;
-    unlock();
+	lock();
+	for (int i = 0; i < members->getEintragAnzahl(); i++)
+	{
+		if (members->z(i) == zObj)
+			members->remove(i);
+	}
+	rend = 1;
+	unlock();
 }
 
 // Zeichnet ein Bild und präsentiert es auf dem Bildschirm
 void Bildschirm::render()
 {
-    lock();
-    api->update();
-    rend = 1;
-    unlock();
+	lock();
+	api->update();
+	rend = 1;
+	unlock();
 }
 
-void Bildschirm::setFillFarbe( int f ) // setzt die Fill Farbe
+void Bildschirm::setFillFarbe(int f) // setzt die Fill Farbe
 {
-    fillColor = f;
-    rend = 1;
+	fillColor = f;
+	rend = 1;
 }
 
-void Bildschirm::setVollbild( bool vollbild ) // setzt vollbild
+void Bildschirm::setVollbild(bool vollbild) // setzt vollbild
 {
-    lock();
-    api->setFullScreen( vollbild );
-    unlock();
+	lock();
+	api->setFullScreen(vollbild);
+	unlock();
 }
 
-void Bildschirm::tick( double tickval )
+void Bildschirm::tick(double tickval)
 {
-    lock();
-    if( !renderOnTop )
-    {
-        for( int i = 0; i < tipAnzahl; ++i )
-            rend |= tips->z( i )->tick( tickval );
-        for( Zeichnung *i : *members )
-            rend |= i->tick( tickval );
-    }
-    else if( onTop )
-    {
-        rend |= onTop->tick( tickval );
-        for( int i = 0; i < tipAnzahl; ++i )
-            rend |= tips->z( i )->tick( tickval );
-    }
-    unlock();
+	lock();
+	if (!renderOnTop)
+	{
+		for (int i = 0; i < tipAnzahl; ++i)
+			rend |= tips->z(i)->tick(tickval);
+		for (Zeichnung* i : *members)
+			rend |= i->tick(tickval);
+	}
+	else if (onTop)
+	{
+		rend |= onTop->tick(tickval);
+		for (int i = 0; i < tipAnzahl; ++i)
+			rend |= tips->z(i)->tick(tickval);
+	}
+	unlock();
 }
 
-void Bildschirm::setBackBufferSize( int breite, int height ) // setzt die Größe des Backbuffers
+void Bildschirm::setBackBufferSize(int breite, int height) // setzt die Größe des Backbuffers
 {
-    lock();
-    api->setBackBufferSize( Vec2< int >( breite, height ) );
-    unlock();
+	lock();
+	api->setBackBufferSize(Vec2< int >(breite, height));
+	unlock();
 }
 
-void Bildschirm::setBackBufferSize( Punkt &size )
+void Bildschirm::setBackBufferSize(Punkt& size)
 {
-    lock();
-    api->setBackBufferSize( size );
-    unlock();
+	lock();
+	api->setBackBufferSize(size);
+	unlock();
 }
 
-void Bildschirm::doMausEreignis( MausEreignis &me ) // sendet maus Ereignis
+void Bildschirm::doMausEreignis(MausEreignis& me) // sendet maus Ereignis
 {
-    int fBr = api->getBackBufferSize().x;
-    int fHi = api->getBackBufferSize().y;
+	int fBr = api->getBackBufferSize().x;
+	int fHi = api->getBackBufferSize().y;
 #ifdef WIN32
-    if( fenster )
-    {
-        fBr = fenster->getKörperBreite();
-        fHi = fenster->getKörperHöhe();
-    }
+	if (fenster)
+	{
+		fBr = fenster->getKörperBreite();
+		fHi = fenster->getKörperHöhe();
+	}
 #endif
-    me.mx = (int)( me.mx * api->getBackBufferSize().x / (double)fBr + 0.5 );
-    me.my = (int)( me.my * api->getBackBufferSize().y / (double)fHi + 0.5 );
-    lock();
-    if( !renderOnTop )
-    {
-        for( int i = tipAnzahl - 1; i >= 0; i-- )
-            tips->z( i )->doPublicMausEreignis( me );
-        for( int i = members->getEintragAnzahl() - 1; i >= 0; i-- )
-            members->z( i )->doPublicMausEreignis( me );
-    }
-    else if( onTop )
-    {
-        onTop->doPublicMausEreignis( me );
-        for( int i = tipAnzahl - 1; i >= 0; i-- )
-            tips->z( i )->doPublicMausEreignis( me );
-    }
-    unlock();
-}
-
-void Bildschirm::doTastaturEreignis( TastaturEreignis &te ) // sendet tastatur Ereignis
-{
-    lock();
-    if( !renderOnTop )
-    {
-        for( int i = members->getEintragAnzahl() - 1; i >= 0; i-- )
-            members->z( i )->doTastaturEreignis( te );
-    }
-    for( int i = tipAnzahl - 1; i >= 0; i-- )
-        tips->z( i )->doTastaturEreignis( te );
-    unlock();
-}
-
-void Bildschirm::addToolTip( ToolTip *tip ) // fügt ToolTip hinzu
-{
-    lock();
-    tips->add( tip, tipAnzahl );
-    ++tipAnzahl;
-    rend = 1;
-    unlock();
-}
-
-bool Bildschirm::removeToolTip( ToolTip *zTip ) // entfernt ToolTip
-{
-    lock();
-    bool gefunden = 0;
-    for( int i = 0; i < tipAnzahl; ++i )
-    {
-        ToolTip *tmp = tips->z( i );
-        if( tmp == zTip )
-        {
-            tips->remove( i );
-            --tipAnzahl;
-            gefunden = 1;
-            rend = 1;
-            break;
-        }
-    }
-    unlock();
-    return gefunden;
+	me.mx = (int)(me.mx * api->getBackBufferSize().x / (double)fBr + 0.5);
+	me.my = (int)(me.my * api->getBackBufferSize().y / (double)fHi + 0.5);
+	lock();
+	if (!renderOnTop)
+	{
+		for (int i = tipAnzahl - 1; i >= 0; i--)
+			tips->z(i)->doPublicMausEreignis(me);
+		for (int i = members->getEintragAnzahl() - 1; i >= 0; i--)
+			members->z(i)->doPublicMausEreignis(me);
+	}
+	else if (onTop)
+	{
+		onTop->doPublicMausEreignis(me);
+		for (int i = tipAnzahl - 1; i >= 0; i--)
+			tips->z(i)->doPublicMausEreignis(me);
+	}
+	unlock();
+}
+
+void Bildschirm::doTastaturEreignis(TastaturEreignis& te) // sendet tastatur Ereignis
+{
+	lock();
+	if (!renderOnTop)
+	{
+		for (int i = members->getEintragAnzahl() - 1; i >= 0; i--)
+			members->z(i)->doTastaturEreignis(te);
+	}
+	for (int i = tipAnzahl - 1; i >= 0; i--)
+		tips->z(i)->doTastaturEreignis(te);
+	unlock();
+}
+
+void Bildschirm::addToolTip(ToolTip* tip) // fügt ToolTip hinzu
+{
+	lock();
+	tips->add(tip, tipAnzahl);
+	++tipAnzahl;
+	rend = 1;
+	unlock();
+}
+
+bool Bildschirm::removeToolTip(ToolTip* zTip) // entfernt ToolTip
+{
+	lock();
+	bool gefunden = 0;
+	for (int i = 0; i < tipAnzahl; ++i)
+	{
+		ToolTip* tmp = tips->z(i);
+		if (tmp == zTip)
+		{
+			tips->remove(i);
+			--tipAnzahl;
+			gefunden = 1;
+			rend = 1;
+			break;
+		}
+	}
+	unlock();
+	return gefunden;
 }
 
 // constant 
-Bild *Bildschirm::getRenderBild() const
+Bild* Bildschirm::getRenderBild() const
 {
-    return dynamic_cast<Bild *>( api->zUIRenderBild()->getThis() );
+	return dynamic_cast<Bild*>(api->zUIRenderBild()->getThis());
 }
 
-Bild *Bildschirm::zRenderBild() const
+Bild* Bildschirm::zRenderBild() const
 {
-    return api->zUIRenderBild();
+	return api->zUIRenderBild();
 }
 
-Iterator<Zeichnung *> Bildschirm::getMembers() const // gibt die Zeichnunge zurück
+Iterator<Zeichnung*> Bildschirm::getMembers() const // gibt die Zeichnunge zurück
 {
-    return members->begin();
+	return members->begin();
 }
 
 int Bildschirm::getFillFarbe() const // gibt die Füll Farbe zurück
 {
-    return fillColor;
+	return fillColor;
 }
 
 bool Bildschirm::istVolbild() const // gibt zurück, ob vollbild an ist
 {
-    return api->isFullScreen();
+	return api->isFullScreen();
 }
 
 const Punkt Bildschirm::getBackBufferSize() const // gibt die Größe des Backbuffers zurück
 {
-    return api->getBackBufferSize();
+	return api->getBackBufferSize();
 }
 
 void Bildschirm::warteAufRendern() const // wartet auf die render Funktion
 {
-    while( rendering )
-    {
-        if( !rendering )
-            return;
-    }
+	while (rendering)
+	{
+		if (!rendering)
+			return;
+	}
 }
 
 double Bildschirm::getRenderZeit() const // gibt zurück wie viele Sekunden das Rendern dauert
 {
-    return renderZeit->getSekunden();
+	return renderZeit->getSekunden();
 }
 
 // Gibt die Grafik API zurück (ohne erhöhten Reference Counter)
-GraphicsApi *Bildschirm::zGraphicsApi() const
+GraphicsApi* Bildschirm::zGraphicsApi() const
 {
-    return api;
+	return api;
 }
 
 // Gibt die Grafik API zurück
-GraphicsApi *Bildschirm::getGraphicsApi() const
+GraphicsApi* Bildschirm::getGraphicsApi() const
 {
-    return api ? dynamic_cast<GraphicsApi *>( api->getThis() ) : 0;
+	return api ? dynamic_cast<GraphicsApi*>(api->getThis()) : 0;
 }
 
 #ifdef WIN32
-int MonitorEnum( HMONITOR m, HDC dc, LPRECT r, LPARAM p )
-{
-    Monitor *mon = new Monitor();
-    mon->existiert = 1;
-    mon->x = r->left;
-    mon->y = r->top;
-    mon->breite = r->right - r->left;
-    mon->height = r->bottom - r->top;
-    ( ( Array< Monitor * > * )p )->add( mon );
-    return 1;
-}
-
-Monitor Framework::getMonitor( int id )
-{
-    if( id < 0 )
-    {
-        Monitor m;
-        m.existiert = 0;
-        return m;
-    }
-    Array< Monitor * > *monitore = new Array< Monitor * >();
-    EnumDisplayMonitors( 0, 0, (MONITORENUMPROC)MonitorEnum, (LPARAM)monitore );
-    int anz = monitore->getEintragAnzahl();
-    if( id >= monitore->getEintragAnzahl() )
-    {
-        for( int i = 0; i < anz; ++i )
-            delete monitore->get( i );
-        delete monitore;
-        Monitor m;
-        m.existiert = 0;
-        return m;
-    }
-    Monitor m = *monitore->get( id );
-    for( int i = 0; i < anz; ++i )
-        delete monitore->get( i );
-    delete monitore;
-    return m;
+int MonitorEnum(HMONITOR m, HDC dc, LPRECT r, LPARAM p)
+{
+	MONITORINFOEXA info;
+	ZeroMemory(&info, sizeof(info));
+	info.cbSize = sizeof(info);
+	GetMonitorInfo(m, &info);
+	Monitor* mon = new Monitor();
+	mon->existiert = 1;
+	mon->x = r->left;
+	mon->y = r->top;
+	mon->breite = r->right - r->left;
+	mon->height = r->bottom - r->top;
+	mon->name = info.szDevice;
+	((Array< Monitor* > *)p)->add(mon);
+	return 1;
+}
+
+Monitor Framework::getMonitor(int id)
+{
+	if (id < 0)
+	{
+		Monitor m;
+		m.existiert = 0;
+		return m;
+	}
+	Array< Monitor* >* monitore = new Array< Monitor* >();
+	DISPLAY_DEVICE dispDev;
+	ZeroMemory(&dispDev, sizeof(dispDev));
+	dispDev.cb = sizeof(dispDev);
+	EnumDisplayDevices(NULL, id, &dispDev, 0);
+	EnumDisplayMonitors(0, 0, (MONITORENUMPROC)MonitorEnum, (LPARAM)monitore);
+	int anz = monitore->getEintragAnzahl();
+	Monitor result;
+	result.existiert = 0;
+	for (Monitor* m : *monitore)
+	{
+		if (m->name.istGleich(dispDev.DeviceName))
+		{
+			result = *m;
+		}
+		delete m;
+	}
+	monitore->release();
+	return result;
 }
 // Bildschirm2D
 // Konstruktor 
-Bildschirm2D::Bildschirm2D( WFenster *fenster )
-    : Bildschirm( fenster )
+Bildschirm2D::Bildschirm2D(WFenster* fenster)
+	: Bildschirm(fenster)
 {
-    api = new DirectX9();
-    api->initialize( dynamic_cast<WFenster *>( fenster->getThis() ), fenster->getKörperGröße(), 0 );
+	api = new DirectX9();
+	api->initialize(dynamic_cast<WFenster*>(fenster->getThis()), fenster->getKörperGröße(), 0);
 }
 
 // Destruktor 
@@ -380,180 +387,180 @@ Bildschirm2D::~Bildschirm2D()
 
 void Bildschirm2D::render() // Zeichnet das Bild
 {
-    if( !rend && testRend )
-        return;
-    rendering = 1;
-    Bild *ui = api->zUIRenderBild();
-    if( ui )
-    {
-        lock();
-        renderZeit->messungStart();
-        api->beginFrame( fill && ( rend || !testRend ), 0, fillColor );
-        if( renderZeichnungen )
-        {
-            if( renderOnTop && deckFarbe && ( deckFarbe & ( fillColor | 0xFF000000 ) ) == deckFarbe )
-            {
-                ui->setAlpha( 255 - (unsigned char)( deckFarbe >> 24 ) );
-                for( Zeichnung *z : *members )
-                    z->render( *ui ); // zeichnen nach zwischenbuffer
-                ui->releaseAlpha();
-            }
-            else
-            {
-                for( Zeichnung *z : *members )
-                    z->render( *ui ); // zeichnen nach zwischenbuffer
-                if( renderOnTop && deckFarbe )
-                    ui->alphaRegion( 0, 0, ui->getBreite(), ui->getHeight(), deckFarbe );
-            }
-            for( int i = 0; i < tipAnzahl; ++i )
-                tips->z( i )->render( *ui );
-        }
-        if( renderOnTop && onTop )
-            onTop->render( *ui );
-        api->presentFrame();
-        renderZeit->messungEnde();
-        unlock();
-    }
-    rendering = 0;
-    rend = 0;
+	if (!rend && testRend)
+		return;
+	rendering = 1;
+	Bild* ui = api->zUIRenderBild();
+	if (ui)
+	{
+		lock();
+		renderZeit->messungStart();
+		api->beginFrame(fill && (rend || !testRend), 0, fillColor);
+		if (renderZeichnungen)
+		{
+			if (renderOnTop && deckFarbe && (deckFarbe & (fillColor | 0xFF000000)) == deckFarbe)
+			{
+				ui->setAlpha(255 - (unsigned char)(deckFarbe >> 24));
+				for (Zeichnung* z : *members)
+					z->render(*ui); // zeichnen nach zwischenbuffer
+				ui->releaseAlpha();
+			}
+			else
+			{
+				for (Zeichnung* z : *members)
+					z->render(*ui); // zeichnen nach zwischenbuffer
+				if (renderOnTop && deckFarbe)
+					ui->alphaRegion(0, 0, ui->getBreite(), ui->getHeight(), deckFarbe);
+			}
+			for (int i = 0; i < tipAnzahl; ++i)
+				tips->z(i)->render(*ui);
+		}
+		if (renderOnTop && onTop)
+			onTop->render(*ui);
+		api->presentFrame();
+		renderZeit->messungEnde();
+		unlock();
+	}
+	rendering = 0;
+	rend = 0;
 }
 
 // Bildschirm3D
 // Konstruktor 
-Bildschirm3D::Bildschirm3D( WFenster *fenster )
-    : Bildschirm( fenster ),
-    kameras( new RCArray< Kam3D >() ),
-    rend3D( 0 )
-{
-    if( DirectX12::isAvailable() )
-        api = new DirectX12();
-    else if( DirectX11::isAvailable() )
-        api = new DirectX11();
-    else
-        api = new DirectX9();
-    api->initialize( dynamic_cast<WFenster *>( fenster->getThis() ), fenster->getKörperGröße(), 0 );
-}
-
-Bildschirm3D::Bildschirm3D( WFenster *fenster, GraphicApiType apiTyp )
-    : Bildschirm( fenster ),
-    kameras( new RCArray< Kam3D >() ),
-    rend3D( 0 )
-{
-    if( apiTyp == DIRECTX9 )
-        api = new DirectX9();
-    if( apiTyp == DIRECTX11 )
-        api = new DirectX11();
-    if( apiTyp == DIRECTX12 )
-        api = new DirectX12();
-    api->initialize( dynamic_cast<WFenster *>( fenster->getThis() ), fenster->getKörperGröße(), 0 );
+Bildschirm3D::Bildschirm3D(WFenster* fenster)
+	: Bildschirm(fenster),
+	kameras(new RCArray< Kam3D >()),
+	rend3D(0)
+{
+	if (DirectX12::isAvailable())
+		api = new DirectX12();
+	else if (DirectX11::isAvailable())
+		api = new DirectX11();
+	else
+		api = new DirectX9();
+	api->initialize(dynamic_cast<WFenster*>(fenster->getThis()), fenster->getKörperGröße(), 0);
+}
+
+Bildschirm3D::Bildschirm3D(WFenster* fenster, GraphicApiType apiTyp)
+	: Bildschirm(fenster),
+	kameras(new RCArray< Kam3D >()),
+	rend3D(0)
+{
+	if (apiTyp == DIRECTX9)
+		api = new DirectX9();
+	if (apiTyp == DIRECTX11)
+		api = new DirectX11();
+	if (apiTyp == DIRECTX12)
+		api = new DirectX12();
+	api->initialize(dynamic_cast<WFenster*>(fenster->getThis()), fenster->getKörperGröße(), 0);
 }
 
 // Destruktor 
 Bildschirm3D::~Bildschirm3D()
 {
-    kameras->release();
+	kameras->release();
 }
 
 // nicht constant 
-void Bildschirm3D::addKamera( Kam3D *obj ) // Fügt ein Zeichnung hinzu
+void Bildschirm3D::addKamera(Kam3D* obj) // Fügt ein Zeichnung hinzu
 {
-    lock();
-    kameras->add( obj );
-    rend3D = 1;
-    unlock();
+	lock();
+	kameras->add(obj);
+	rend3D = 1;
+	unlock();
 }
 
-void Bildschirm3D::removeKamera( Kam3D *zObj ) // Entfernt ein Zeichnung
+void Bildschirm3D::removeKamera(Kam3D* zObj) // Entfernt ein Zeichnung
 {
-    lock();
-    for( int i = 0; kameras->z( i ); i++ )
-    {
-        if( kameras->z( i ) == zObj )
-        {
-            kameras->remove( i );
-            break;
-        }
-    }
-    rend3D = 1;
-    unlock();
+	lock();
+	for (int i = 0; kameras->z(i); i++)
+	{
+		if (kameras->z(i) == zObj)
+		{
+			kameras->remove(i);
+			break;
+		}
+	}
+	rend3D = 1;
+	unlock();
 }
 
-void Bildschirm3D::tick( double tickval )
+void Bildschirm3D::tick(double tickval)
 {
-    lock();
-    __super::tick( tickval );
-    for( Kam3D *k : *kameras )
-        rend3D |= k->tick( tickval );
-    unlock();
+	lock();
+	__super::tick(tickval);
+	for (Kam3D* k : *kameras)
+		rend3D |= k->tick(tickval);
+	unlock();
 }
 
-void Bildschirm3D::doMausEreignis( MausEreignis &me ) // sendet maus Ereignis
+void Bildschirm3D::doMausEreignis(MausEreignis& me) // sendet maus Ereignis
 {
-    lock();
-    __super::doMausEreignis( me );
-    for( int i = kameras->getEintragAnzahl() - 1; i >= 0; i-- )
-        kameras->z( i )->doMausEreignis( me );
-    unlock();
+	lock();
+	__super::doMausEreignis(me);
+	for (int i = kameras->getEintragAnzahl() - 1; i >= 0; i--)
+		kameras->z(i)->doMausEreignis(me);
+	unlock();
 }
 
-void Bildschirm3D::doTastaturEreignis( TastaturEreignis &te ) // sendet tastatur Ereignis
+void Bildschirm3D::doTastaturEreignis(TastaturEreignis& te) // sendet tastatur Ereignis
 {
-    lock();
-    __super::doTastaturEreignis( te );
-    for( int i = kameras->getEintragAnzahl() - 1; i >= 0; i-- )
-        kameras->z( i )->doTastaturEreignis( te );
-    unlock();
+	lock();
+	__super::doTastaturEreignis(te);
+	for (int i = kameras->getEintragAnzahl() - 1; i >= 0; i--)
+		kameras->z(i)->doTastaturEreignis(te);
+	unlock();
 }
 
 void Bildschirm3D::render() // Zeichnet das Bild
 {
-    if( !rend && !rend3D && testRend )
-        return;
-    rendering = 1;
-    lock();
-    renderZeit->messungStart();
-    // Clear the back buffer.
-    api->beginFrame( fill && ( rend || !testRend ), fill && ( rend3D || !testRend || rend ), fillColor );
-    if( rend3D || !testRend || rend )
-    {
-        // Render 3d Objects
-        for( Kam3D *k : *kameras )
-            api->renderKamera( k );
-        rend3D = 0;
-    }
-    // render User Interface
-    Bild *ui = api->zUIRenderBild();
-    if( ( rend || !testRend ) && ui )
-    {
-        if( renderZeichnungen )
-        {
-            if( renderOnTop && deckFarbe && ( deckFarbe & ( fillColor | 0xFF000000 ) ) == deckFarbe )
-            {
-                ui->setAlpha( 255 - (unsigned char)( deckFarbe >> 24 ) );
-                for( Zeichnung *z : *members )
-                    z->render( *ui ); // zeichnen nach zwischenbuffer
-                ui->releaseAlpha();
-            }
-            else
-            {
-                for( Zeichnung *z : *members )
-                    z->render( *ui ); // zeichnen nach zwischenbuffer
-                if( renderOnTop && deckFarbe )
-                    ui->alphaRegion( 0, 0, ui->getBreite(), ui->getHeight(), deckFarbe );
-            }
-            for( int i = 0; i < tipAnzahl; ++i )
-                tips->z( i )->render( *ui );
-        }
-        if( renderOnTop && onTop )
-            onTop->render( *ui );
-    }
-    api->presentFrame();
-    unlock();
-    renderZeit->messungEnde();
+	if (!rend && !rend3D && testRend)
+		return;
+	rendering = 1;
+	lock();
+	renderZeit->messungStart();
+	// Clear the back buffer.
+	api->beginFrame(fill && (rend || !testRend), fill && (rend3D || !testRend || rend), fillColor);
+	if (rend3D || !testRend || rend)
+	{
+		// Render 3d Objects
+		for (Kam3D* k : *kameras)
+			api->renderKamera(k);
+		rend3D = 0;
+	}
+	// render User Interface
+	Bild* ui = api->zUIRenderBild();
+	if ((rend || !testRend) && ui)
+	{
+		if (renderZeichnungen)
+		{
+			if (renderOnTop && deckFarbe && (deckFarbe & (fillColor | 0xFF000000)) == deckFarbe)
+			{
+				ui->setAlpha(255 - (unsigned char)(deckFarbe >> 24));
+				for (Zeichnung* z : *members)
+					z->render(*ui); // zeichnen nach zwischenbuffer
+				ui->releaseAlpha();
+			}
+			else
+			{
+				for (Zeichnung* z : *members)
+					z->render(*ui); // zeichnen nach zwischenbuffer
+				if (renderOnTop && deckFarbe)
+					ui->alphaRegion(0, 0, ui->getBreite(), ui->getHeight(), deckFarbe);
+			}
+			for (int i = 0; i < tipAnzahl; ++i)
+				tips->z(i)->render(*ui);
+		}
+		if (renderOnTop && onTop)
+			onTop->render(*ui);
+	}
+	api->presentFrame();
+	unlock();
+	renderZeit->messungEnde();
 #ifdef _DEBUG
-    //std::cout << renderZeit->getSekunden() << "\n";
+	//std::cout << renderZeit->getSekunden() << "\n";
 #endif
-    rendering = 0;
-    rend = 0;
+	rendering = 0;
+	rend = 0;
 }
 #endif

+ 193 - 192
Bildschirm.h

@@ -29,205 +29,206 @@ struct _D3DLOCKED_RECT;
 
 namespace Framework
 {
-    class Bild; //! Bild.h
-    class WFenster; //! Fenster.h
-    class Bildschirm; //! aus dieser Datei
-    class Zeichnung; //! Zeichnung.h
-    class Zeichnung3D; //! Zeichnung3D.h
-    class ZeitMesser; //! Zeit.h
-    struct MausEreignis; //! MausEreignis.h
-    struct TastaturEreignis; //! TastaturEreignis.h
-    class ToolTip; //! Tooltip.h
-    class PixelShader; //! Shader.h
-    class VertexShader; //! Shader.h
-    class Kam3D; //! Kam3D.h
-    class Render3D; //! Render3D.h
-    class DXVertexBuffer; //! DXBuffer.h
-    class DXIndexBuffer; //! DXBuffer.h
-    class Textur; //! Textur.h
-    class TexturModel; //! TexturModel.h
-    class GraphicsApi; //! GraphicsApi.h
-    class DirectX9; //! GraphicsApi.h
-    enum GraphicApiType
-    {
-        NOT_SUPPORTED, //! no graphic api supported
-        DIRECTX9, //! only 2d
-        DIRECTX11, //! 3d simple phong model without shadows
-        DIRECTX12 //! 3d phong model with raytraycing
-    };
+	class Bild; //! Bild.h
+	class WFenster; //! Fenster.h
+	class Bildschirm; //! aus dieser Datei
+	class Zeichnung; //! Zeichnung.h
+	class Zeichnung3D; //! Zeichnung3D.h
+	class ZeitMesser; //! Zeit.h
+	struct MausEreignis; //! MausEreignis.h
+	struct TastaturEreignis; //! TastaturEreignis.h
+	class ToolTip; //! Tooltip.h
+	class PixelShader; //! Shader.h
+	class VertexShader; //! Shader.h
+	class Kam3D; //! Kam3D.h
+	class Render3D; //! Render3D.h
+	class DXVertexBuffer; //! DXBuffer.h
+	class DXIndexBuffer; //! DXBuffer.h
+	class Textur; //! Textur.h
+	class TexturModel; //! TexturModel.h
+	class GraphicsApi; //! GraphicsApi.h
+	class DirectX9; //! GraphicsApi.h
+	enum GraphicApiType
+	{
+		NOT_SUPPORTED, //! no graphic api supported
+		DIRECTX9, //! only 2d
+		DIRECTX11, //! 3d simple phong model without shadows
+		DIRECTX12 //! 3d phong model with raytraycing
+	};
 
-    //! Eine Struktur, die Informationen über einen Monitor beinhaltet
-    struct Monitor
-    {
-        int x, y, breite, height; //! Koordinaten des Monitors und die Auflösung
-        bool existiert; //! Speichert, ob der Monitor wirklich existiert
-    };
+	//! Eine Struktur, die Informationen über einen Monitor beinhaltet
+	struct Monitor
+	{
+		int x, y, breite, height; //! Koordinaten des Monitors und die Auflösung
+		bool existiert; //! Speichert, ob der Monitor wirklich existiert
+		Text name;
+	};
 
-    //! Diese Klasse verwaltet das Bild auf dem Bildschirm
-    class Bildschirm : public virtual ReferenceCounter
-    {
-    protected:
-        GraphicsApi *api;
-        WFenster *fenster;
-        RCArray<Zeichnung> *members;
-        int fillColor;
-        int deckFarbe;
-        Zeichnung *onTop;
-        bool renderOnTop;
-        bool renderZeichnungen;
-        bool rendering;
-        ZeitMesser *renderZeit;
-        Critical cs;
-        RCArray< ToolTip > *tips;
-        int tipAnzahl;
-        bool testRend;
-        bool fill;
-        bool rend;
+	//! Diese Klasse verwaltet das Bild auf dem Bildschirm
+	class Bildschirm : public virtual ReferenceCounter
+	{
+	protected:
+		GraphicsApi* api;
+		WFenster* fenster;
+		RCArray<Zeichnung>* members;
+		int fillColor;
+		int deckFarbe;
+		Zeichnung* onTop;
+		bool renderOnTop;
+		bool renderZeichnungen;
+		bool rendering;
+		ZeitMesser* renderZeit;
+		Critical cs;
+		RCArray< ToolTip >* tips;
+		int tipAnzahl;
+		bool testRend;
+		bool fill;
+		bool rend;
 
-    public:
-        //! Konstruktor 
-        //! \param fenster Das Fenster, dessen Inhalt verwaltet werden soll
-        DLLEXPORT Bildschirm( WFenster *fenster );
-        //! Destruktor 
-        DLLEXPORT virtual ~Bildschirm();
-        //! Dies ist notwendig, falls mehrere Threads gleichzeitig den Bildschirm benutzen.
-        //! Wenn lock() von zwei threads aufgerufen wird, wartet der letzte so lange, bis der erste unlock() aufgerufen hat.
-        DLLEXPORT virtual void lock();
-        //! Dies ist notwendig, falls mehrere Threads gleichzeitig den Bildschirm benutzen.
-        //! Wenn lock() von zwei threads aufgerufen wird, wartet der letzte so lange, bis der erste unlock() aufgerufen hat.
-        DLLEXPORT virtual void unlock();
-        //! Legt fest, ob der Bildschirm nach jedem Bild neu mit einer Farbe ausgefüllt wird (Standartmäßig gesetzt)
-        //! \param f 1, falls das Bild vor dem Zeichnen zurückgesetzt werden soll
-        DLLEXPORT virtual void setFill( bool f );
-        //! Aktualisiert die Objekte, mit der die Grafikkarte verwaltet wird
-        DLLEXPORT virtual void update();
-        //! Legt fest, ob von dem Zeichnen überprüft wird, ob sich das Bild vom letzten unterscheidet (Standartmäßig gesetzt)
-        //! \param tr 1, wenn nur gezeichnet werden soll, wenn es notwendig ist
-        DLLEXPORT virtual void setTestRend( bool tr );
-        //! Legt fest, ob die 2D GUI Zeichnungen gezeichnet werden sollen (Standartmäßig gesetzt)
-        //! \param rO 1, falls die Zeichnungen gezeichnet werden sollen
-        DLLEXPORT virtual void setRenderZeichnungen( bool rO );
-        //! Legt fest, ob eine Zeichnung über allen anderen Zeichnungen gezeichnet werden soll (Standartmäßig nicht gesetzt)
-        //! \param onTop 1, falls eine Zeichnung über allem gezeichnet werden soll
-        DLLEXPORT virtual void setOnTop( bool onTop );
-        //! Setzt die Zecihnung, die über allem gezeichnet werden soll, falls setOnTop( 1 ) gesetzt wurde
-        //! \param obj Die Zeichnung
-        DLLEXPORT virtual void setOnTopZeichnung( Zeichnung *obj );
-        //! Setzt eine Farbe, die nach den Zeichnungen mit alphablending über das gesamte Bild geblendet wird, wenn setOnTop( 1 ) gesetzt wurde. Die zeichnung, die mit setOnTopZeichnung() gesetzt wurde ist davon nicht betroffen
-        //! \param f Die Farbe im A8R8G8B8 Format
-        DLLEXPORT virtual void setdeckFarbe( int f );
-        //! Fügt dem Bild eine Zeichnung hinzu, die immer gezeichnet wird, wenn setRenderZeichnungen( 1 ) gesetzt wurde.
-        //! \param obj Die Zeichnung
-        DLLEXPORT virtual void addMember( Zeichnung *obj );
-        //! Entfernt eine Zeichnung aus dem Bild. Darf nicht aufgerufen werden, wärend doMausEreignis(), doTastaturEreignis(), tick() oder render() aufgerufen wird.
-        //! \param obj Die Zeichnung (ohne erhöhten reference Counter)
-        DLLEXPORT virtual void removeMember( Zeichnung *zObj );
-        //! Zeichnet ein Bild und präsentiert es auf dem Bildschirm
-        DLLEXPORT virtual void render();
-        //! Setzt die Farbe, mit der das Bild for dem Zeichnen gefüllt wird, wenn setFüll( 1 ) gesetzt wurde
-        //! \param f Die Farbe im A8R8G8B8 Format
-        DLLEXPORT virtual void setFillFarbe( int f );
-        //! Legt fest, ob das Bild im Vollbildmodus präsentiert werden soll. (Standartmäßig nicht gesetzt)
-        //! \param fullscreen 1, für Vollbildmodus
-        DLLEXPORT virtual void setVollbild( bool fullscreen );
-        //! Verarbeitet die Zeit, die seit dem letzten Aufruf der Funktion vergangen ist
-        //! Ruft die tick Funktionen aller sich im Bild befindenden Zeichnungen auf
-        //! \param tickval Die vergangene Zeit in Sekunden
-        DLLEXPORT virtual void tick( double tickval );
-        //! Setzt die Auflösung des Bildes, das angezeigt wird. Es wird von der Grafikkarte automatisch skalliert, so das es das Fenster ausfüllt
-        //! \param breite Die Breite des Bildes in Pixeln
-        //! \param height Die Höhe des Bildes in Pixeln
-        DLLEXPORT virtual void setBackBufferSize( int breite, int height );
-        //! Setzt die Auflösung des Bildes, das angezeigt wird. Es wird von der Grafikkarte automatisch skalliert, so das es das Fenster ausfüllt
-        //! \param size Die Breite und Höhe in Pixeln
-        DLLEXPORT virtual void setBackBufferSize( Punkt &size );
-        //! Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
-        //! Gibt das Ereignis automatisch an alle sich im Bild befindenden Zeichnungen weiter
-        //! \param me Das Ereignis
-        DLLEXPORT virtual void doMausEreignis( MausEreignis &me );
-        //! Verarbeitet ein Tastatur Ereignis. Wird vom Framework automatisch aufgerufen
-        //! Gibt das Ereignis automatisch an alle sich im Bild befindenden Zeichnungen weiter
-        //! \param te Das Ereignis
-        DLLEXPORT virtual void doTastaturEreignis( TastaturEreignis &te );
-        //! Fügt einen Tooltip hinzu.
-        //! \param tip Der Tooltip
-        DLLEXPORT virtual void addToolTip( ToolTip *tip );
-        //! Entfernt einen Tooltip
-        //! \param zTip Der Tooltip ohne erhöhten reference Counter
-        DLLEXPORT virtual bool removeToolTip( ToolTip *zTip );
-        //! Gibt das Bild zurück, in das die 2D GUI Zeichnungen des Frameworks gezeichnet werden
-        DLLEXPORT virtual Bild *getRenderBild() const;
-        //! Gibt das Bild ohne erhöhten Reference Counter zurück, in das die 2D GUI Zeichnungen des Frameworks gezeichnet werden
-        DLLEXPORT virtual Bild *zRenderBild() const;
-        //! Gibt ein Array von 2D GUI Zeichnungen zurück, die sich im Bild befinden
-        DLLEXPORT virtual Iterator<Zeichnung*> getMembers() const;
-        //! Gibt die Farbe im A8R8G8B8 Format zurück, mit der das Bild vor dem Zeichnen befüllt wird
-        DLLEXPORT virtual int getFillFarbe() const;
-        //! Gibt zurück, ob man sich im Vollbildmodus befindet
-        DLLEXPORT virtual bool istVolbild() const;
-        //! Gibt die Auflösung in Pixeln zurück, in der gezeichnet wird
-        DLLEXPORT virtual const Punkt getBackBufferSize() const;
-        //! Wartet, bis das Zeichnen des aktuellen Bildes abgeschlossen ist
-        DLLEXPORT virtual void warteAufRendern() const;
-        //! Gibt die Zeit in Sekunden zurück, die benötigt wurde, um das letzte Bild zu zeichnen
-        DLLEXPORT virtual double getRenderZeit() const;
-        //! Gibt die Grafik API zurück (ohne erhöhten Reference Counter)
-        DLLEXPORT GraphicsApi *zGraphicsApi() const;
-        //! Gibt die Grafik API zurück
-        DLLEXPORT GraphicsApi *getGraphicsApi() const;
-    };
+	public:
+		//! Konstruktor 
+		//! \param fenster Das Fenster, dessen Inhalt verwaltet werden soll
+		DLLEXPORT Bildschirm(WFenster* fenster);
+		//! Destruktor 
+		DLLEXPORT virtual ~Bildschirm();
+		//! Dies ist notwendig, falls mehrere Threads gleichzeitig den Bildschirm benutzen.
+		//! Wenn lock() von zwei threads aufgerufen wird, wartet der letzte so lange, bis der erste unlock() aufgerufen hat.
+		DLLEXPORT virtual void lock();
+		//! Dies ist notwendig, falls mehrere Threads gleichzeitig den Bildschirm benutzen.
+		//! Wenn lock() von zwei threads aufgerufen wird, wartet der letzte so lange, bis der erste unlock() aufgerufen hat.
+		DLLEXPORT virtual void unlock();
+		//! Legt fest, ob der Bildschirm nach jedem Bild neu mit einer Farbe ausgefüllt wird (Standartmäßig gesetzt)
+		//! \param f 1, falls das Bild vor dem Zeichnen zurückgesetzt werden soll
+		DLLEXPORT virtual void setFill(bool f);
+		//! Aktualisiert die Objekte, mit der die Grafikkarte verwaltet wird
+		DLLEXPORT virtual void update();
+		//! Legt fest, ob von dem Zeichnen überprüft wird, ob sich das Bild vom letzten unterscheidet (Standartmäßig gesetzt)
+		//! \param tr 1, wenn nur gezeichnet werden soll, wenn es notwendig ist
+		DLLEXPORT virtual void setTestRend(bool tr);
+		//! Legt fest, ob die 2D GUI Zeichnungen gezeichnet werden sollen (Standartmäßig gesetzt)
+		//! \param rO 1, falls die Zeichnungen gezeichnet werden sollen
+		DLLEXPORT virtual void setRenderZeichnungen(bool rO);
+		//! Legt fest, ob eine Zeichnung über allen anderen Zeichnungen gezeichnet werden soll (Standartmäßig nicht gesetzt)
+		//! \param onTop 1, falls eine Zeichnung über allem gezeichnet werden soll
+		DLLEXPORT virtual void setOnTop(bool onTop);
+		//! Setzt die Zecihnung, die über allem gezeichnet werden soll, falls setOnTop( 1 ) gesetzt wurde
+		//! \param obj Die Zeichnung
+		DLLEXPORT virtual void setOnTopZeichnung(Zeichnung* obj);
+		//! Setzt eine Farbe, die nach den Zeichnungen mit alphablending über das gesamte Bild geblendet wird, wenn setOnTop( 1 ) gesetzt wurde. Die zeichnung, die mit setOnTopZeichnung() gesetzt wurde ist davon nicht betroffen
+		//! \param f Die Farbe im A8R8G8B8 Format
+		DLLEXPORT virtual void setdeckFarbe(int f);
+		//! Fügt dem Bild eine Zeichnung hinzu, die immer gezeichnet wird, wenn setRenderZeichnungen( 1 ) gesetzt wurde.
+		//! \param obj Die Zeichnung
+		DLLEXPORT virtual void addMember(Zeichnung* obj);
+		//! Entfernt eine Zeichnung aus dem Bild. Darf nicht aufgerufen werden, wärend doMausEreignis(), doTastaturEreignis(), tick() oder render() aufgerufen wird.
+		//! \param obj Die Zeichnung (ohne erhöhten reference Counter)
+		DLLEXPORT virtual void removeMember(Zeichnung* zObj);
+		//! Zeichnet ein Bild und präsentiert es auf dem Bildschirm
+		DLLEXPORT virtual void render();
+		//! Setzt die Farbe, mit der das Bild for dem Zeichnen gefüllt wird, wenn setFüll( 1 ) gesetzt wurde
+		//! \param f Die Farbe im A8R8G8B8 Format
+		DLLEXPORT virtual void setFillFarbe(int f);
+		//! Legt fest, ob das Bild im Vollbildmodus präsentiert werden soll. (Standartmäßig nicht gesetzt)
+		//! \param fullscreen 1, für Vollbildmodus
+		DLLEXPORT virtual void setVollbild(bool fullscreen);
+		//! Verarbeitet die Zeit, die seit dem letzten Aufruf der Funktion vergangen ist
+		//! Ruft die tick Funktionen aller sich im Bild befindenden Zeichnungen auf
+		//! \param tickval Die vergangene Zeit in Sekunden
+		DLLEXPORT virtual void tick(double tickval);
+		//! Setzt die Auflösung des Bildes, das angezeigt wird. Es wird von der Grafikkarte automatisch skalliert, so das es das Fenster ausfüllt
+		//! \param breite Die Breite des Bildes in Pixeln
+		//! \param height Die Höhe des Bildes in Pixeln
+		DLLEXPORT virtual void setBackBufferSize(int breite, int height);
+		//! Setzt die Auflösung des Bildes, das angezeigt wird. Es wird von der Grafikkarte automatisch skalliert, so das es das Fenster ausfüllt
+		//! \param size Die Breite und Höhe in Pixeln
+		DLLEXPORT virtual void setBackBufferSize(Punkt& size);
+		//! Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
+		//! Gibt das Ereignis automatisch an alle sich im Bild befindenden Zeichnungen weiter
+		//! \param me Das Ereignis
+		DLLEXPORT virtual void doMausEreignis(MausEreignis& me);
+		//! Verarbeitet ein Tastatur Ereignis. Wird vom Framework automatisch aufgerufen
+		//! Gibt das Ereignis automatisch an alle sich im Bild befindenden Zeichnungen weiter
+		//! \param te Das Ereignis
+		DLLEXPORT virtual void doTastaturEreignis(TastaturEreignis& te);
+		//! Fügt einen Tooltip hinzu.
+		//! \param tip Der Tooltip
+		DLLEXPORT virtual void addToolTip(ToolTip* tip);
+		//! Entfernt einen Tooltip
+		//! \param zTip Der Tooltip ohne erhöhten reference Counter
+		DLLEXPORT virtual bool removeToolTip(ToolTip* zTip);
+		//! Gibt das Bild zurück, in das die 2D GUI Zeichnungen des Frameworks gezeichnet werden
+		DLLEXPORT virtual Bild* getRenderBild() const;
+		//! Gibt das Bild ohne erhöhten Reference Counter zurück, in das die 2D GUI Zeichnungen des Frameworks gezeichnet werden
+		DLLEXPORT virtual Bild* zRenderBild() const;
+		//! Gibt ein Array von 2D GUI Zeichnungen zurück, die sich im Bild befinden
+		DLLEXPORT virtual Iterator<Zeichnung*> getMembers() const;
+		//! Gibt die Farbe im A8R8G8B8 Format zurück, mit der das Bild vor dem Zeichnen befüllt wird
+		DLLEXPORT virtual int getFillFarbe() const;
+		//! Gibt zurück, ob man sich im Vollbildmodus befindet
+		DLLEXPORT virtual bool istVolbild() const;
+		//! Gibt die Auflösung in Pixeln zurück, in der gezeichnet wird
+		DLLEXPORT virtual const Punkt getBackBufferSize() const;
+		//! Wartet, bis das Zeichnen des aktuellen Bildes abgeschlossen ist
+		DLLEXPORT virtual void warteAufRendern() const;
+		//! Gibt die Zeit in Sekunden zurück, die benötigt wurde, um das letzte Bild zu zeichnen
+		DLLEXPORT virtual double getRenderZeit() const;
+		//! Gibt die Grafik API zurück (ohne erhöhten Reference Counter)
+		DLLEXPORT GraphicsApi* zGraphicsApi() const;
+		//! Gibt die Grafik API zurück
+		DLLEXPORT GraphicsApi* getGraphicsApi() const;
+	};
 #ifdef WIN32
-    //! Diese Klasse verwaltet das Bild auf dem Bildschirm ohne 3D Elemente
-    class Bildschirm2D : public Bildschirm
-    {
-    public:
-        //! Konstruktor 
-        //! \param fenster Das Fenster, dessen Inhalt verwaltet werden soll
-        DLLEXPORT Bildschirm2D( WFenster *fenster );
-        //! Destruktor 
-        DLLEXPORT virtual ~Bildschirm2D();
-        //! Zeichnet ein Bild und präsentiert es auf dem Bildschirm
-        DLLEXPORT virtual void render();
-    };
+	//! Diese Klasse verwaltet das Bild auf dem Bildschirm ohne 3D Elemente
+	class Bildschirm2D : public Bildschirm
+	{
+	public:
+		//! Konstruktor 
+		//! \param fenster Das Fenster, dessen Inhalt verwaltet werden soll
+		DLLEXPORT Bildschirm2D(WFenster* fenster);
+		//! Destruktor 
+		DLLEXPORT virtual ~Bildschirm2D();
+		//! Zeichnet ein Bild und präsentiert es auf dem Bildschirm
+		DLLEXPORT virtual void render();
+	};
 
-    //! Diese Klasse verwaltet das Bild auf dem Bildschirm mit 3D Elementen
-    class Bildschirm3D : public Bildschirm
-    {
-    private:
-        RCArray< Kam3D > *kameras;
-        bool rend3D;
+	//! Diese Klasse verwaltet das Bild auf dem Bildschirm mit 3D Elementen
+	class Bildschirm3D : public Bildschirm
+	{
+	private:
+		RCArray< Kam3D >* kameras;
+		bool rend3D;
 
-    public:
-        //! Konstruktor 
-        //! \param fenster Das Fenster, dessen Inhalt verwaltet werden soll
-        DLLEXPORT Bildschirm3D( WFenster *fenster );
-        DLLEXPORT Bildschirm3D( WFenster *fenster, GraphicApiType apiTyp );
-        //! Destruktor 
-        DLLEXPORT virtual ~Bildschirm3D();
-        //! Fügt dem Bildschirm eine Kamera hinzu
-        //! \param obj Die Kamera
-        DLLEXPORT void addKamera( Kam3D *obj );
-        //! Entfernt eine kamera von dem Bildschirm
-        DLLEXPORT void removeKamera( Kam3D *zObj );
-        //! Verarbeitet die Zeit, die seit dem letzten Aufruf der Funktion vergangen ist
-        //! Ruft die tick Funktionen aller sich im Bild befindenden Zeichnungen und der Kameras auf
-        //! \param tickval Die vergangene Zeit in Sekunden
-        DLLEXPORT void tick( double tickval );
-        //! Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
-        //! Gibt das Ereignis automatisch an alle sich im Bild befindenden Zeichnungen und Kameras weiter
-        //! \param me Das Ereignis
-        DLLEXPORT void doMausEreignis( MausEreignis &me );
-        //! Verarbeitet ein Tastatur Ereignis. Wird vom Framework automatisch aufgerufen
-        //! Gibt das Ereignis automatisch an alle sich im Bild befindenden Zeichnungen und Kameras weiter
-        //! \param te Das Ereignis
-        DLLEXPORT void doTastaturEreignis( TastaturEreignis &te );
-        //! Zeichnet ein Bild und präsentiert es auf dem Bildschirm
-        DLLEXPORT void render();
-    };
+	public:
+		//! Konstruktor 
+		//! \param fenster Das Fenster, dessen Inhalt verwaltet werden soll
+		DLLEXPORT Bildschirm3D(WFenster* fenster);
+		DLLEXPORT Bildschirm3D(WFenster* fenster, GraphicApiType apiTyp);
+		//! Destruktor 
+		DLLEXPORT virtual ~Bildschirm3D();
+		//! Fügt dem Bildschirm eine Kamera hinzu
+		//! \param obj Die Kamera
+		DLLEXPORT void addKamera(Kam3D* obj);
+		//! Entfernt eine kamera von dem Bildschirm
+		DLLEXPORT void removeKamera(Kam3D* zObj);
+		//! Verarbeitet die Zeit, die seit dem letzten Aufruf der Funktion vergangen ist
+		//! Ruft die tick Funktionen aller sich im Bild befindenden Zeichnungen und der Kameras auf
+		//! \param tickval Die vergangene Zeit in Sekunden
+		DLLEXPORT void tick(double tickval);
+		//! Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
+		//! Gibt das Ereignis automatisch an alle sich im Bild befindenden Zeichnungen und Kameras weiter
+		//! \param me Das Ereignis
+		DLLEXPORT void doMausEreignis(MausEreignis& me);
+		//! Verarbeitet ein Tastatur Ereignis. Wird vom Framework automatisch aufgerufen
+		//! Gibt das Ereignis automatisch an alle sich im Bild befindenden Zeichnungen und Kameras weiter
+		//! \param te Das Ereignis
+		DLLEXPORT void doTastaturEreignis(TastaturEreignis& te);
+		//! Zeichnet ein Bild und präsentiert es auf dem Bildschirm
+		DLLEXPORT void render();
+	};
 
-    //! Findet die Psition und Auflösung eines Monitors heraus
-    //! \param id Die ID des Monitors. Falls der Monitor nicht gefunden wurde ist der existiert flag der zurückgegebenen Monitor Struktur 0
-    DLLEXPORT Monitor getMonitor( int id );
+	//! Findet die Psition und Auflösung eines Monitors heraus
+	//! \param id Die ID des Monitors. Falls der Monitor nicht gefunden wurde ist der existiert flag der zurückgegebenen Monitor Struktur 0
+	DLLEXPORT Monitor getMonitor(int id);
 #endif
 }