Browse Source

Als Ereignisse können jetzt auch lamda Ausdrücke mit capture gesetzt werden

kolja 6 years ago
parent
commit
24ea3753af
21 changed files with 100 additions and 86 deletions
  1. 2 2
      AlphaFeld.cpp
  2. 3 5
      Animation.cpp
  3. 1 1
      Animation3D.cpp
  4. 4 4
      AuswahlBox.cpp
  5. 2 0
      Betriebssystem.h
  6. 4 4
      Bild.cpp
  7. 1 1
      Diagramm.cpp
  8. 9 11
      Fenster.cpp
  9. 2 2
      Fenster.h
  10. 4 4
      Knopf.cpp
  11. 3 3
      Liste.cpp
  12. 1 1
      M2DVorschau.cpp
  13. 2 2
      Model2D.cpp
  14. 4 1
      Model3D.cpp
  15. 1 1
      Model3D.h
  16. 2 2
      Rahmen.cpp
  17. 4 4
      Tabelle.cpp
  18. 6 6
      TextFeld.cpp
  19. 1 3
      ToolTip.cpp
  20. 31 21
      Zeichnung.cpp
  21. 13 8
      Zeichnung.h

+ 2 - 2
AlphaFeld.cpp

@@ -86,8 +86,8 @@ Zeichnung *AlphaFeld::dublizieren() const // Kopiert das Zeichnung
 	obj->setSize( gr );
 	obj->setMausEreignisParameter( makParam );
 	obj->setTastaturEreignisParameter( takParam );
-	obj->setMausEreignis( Mak );
-	obj->setTastaturEreignis( Tak );
+	obj->setMausEreignis( mak );
+	obj->setTastaturEreignis( tak );
 	if( toolTip )
 		obj->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
 	obj->setStrength( strength );

+ 3 - 5
Animation.cpp

@@ -322,10 +322,8 @@ bool Animation2D::tick( double zeit )
     data->unlock();
     if( tmp != jetzt )
         rend = 1;
-    bool ret = rend;
-    rend = 0;
     unlockZeichnung();
-    return ret;
+    return Zeichnung::tick( zeit );
 }
 
 void Animation2D::render( Bild &zRObj )
@@ -415,8 +413,8 @@ Zeichnung *Animation2D::dublizieren() const
     ret->setSize( gr );
     ret->setMausEreignisParameter( makParam );
     ret->setTastaturEreignisParameter( takParam );
-    ret->setMausEreignis( Mak );
-    ret->setTastaturEreignis( Tak );
+    ret->setMausEreignis( mak );
+    ret->setTastaturEreignis( tak );
     if( toolTip )
         ret->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
     if( data )

+ 1 - 1
Animation3D.cpp

@@ -92,7 +92,7 @@ void Animation3D::apply( Knochen *zK, double timeOffset, double sec ) const
             double left = d->time - timeOffset;
             if( left > 0 )
             {
-                float proc = (float)min( sec / left, 1 );
+                float proc = (float)MIN( sec / left, 1 );
                 zK->pos += ( d->pos - zK->pos ) * proc;
                 zK->winkel += ( d->rot - zK->winkel ) * proc;
                 sec -= left;

+ 4 - 4
AuswahlBox.cpp

@@ -884,7 +884,7 @@ void AuswahlBox::doMausEreignis( MausEreignis &me ) // Maus
     {
         if( removeFokus && me.id == ME_RLinks )
         {
-            if( Mak && ( me.verarbeitet || Mak( makParam, this, me ) ) )
+            if( mak && ( me.verarbeitet || mak( makParam, this, me ) ) )
                 removeStyle( Style::Fokus );
             ausgeklappt = 0;
             me.mx -= pos.x, me.my -= pos.y;
@@ -909,7 +909,7 @@ void AuswahlBox::doMausEreignis( MausEreignis &me ) // Maus
         doMausEreignis( me2 );
     }
     me.mx -= pos.x, me.my -= pos.y;
-    if( Mak && ( me.verarbeitet || Mak( makParam, this, me ) ) )
+    if( mak && ( me.verarbeitet || mak( makParam, this, me ) ) )
     {
         bool vera = me.verarbeitet;
         if( ausfahren )
@@ -2129,8 +2129,8 @@ Zeichnung *AuswahlBox::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     obj->setSize( gr );
     obj->setMausEreignisParameter( makParam );
     obj->setTastaturEreignisParameter( takParam );
-    obj->setMausEreignis( Mak );
-    obj->setTastaturEreignis( Tak );
+    obj->setMausEreignis( mak );
+    obj->setTastaturEreignis( tak );
     if( toolTip )
         obj->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
     obj->setStyle( style );

+ 2 - 0
Betriebssystem.h

@@ -2,6 +2,8 @@
 #define Betriebssystem_H
 #define MAX_KNOCHEN_ANZ 128
 #define _NOHEAP
+#define MAX(x, y) (((x) > (y)) ? (x) : (y))
+#define MIN(x, y) (((x) < (y)) ? (x) : (y))
 #ifdef _WIN32
 
 #ifdef _DEBUG

+ 4 - 4
Bild.cpp

@@ -1973,7 +1973,7 @@ BildZ::BildZ()
 	ref( 1 )
 {
 	style = 0;
-	Mak = _ret1ME;
+	mak = _ret1ME;
 }
 
 // Destruktor 
@@ -2053,7 +2053,7 @@ void BildZ::doMausEreignis( MausEreignis &me ) // ruft Mak auf
 	me.my -= pos.y;
 	if( hatStyle( Style::Sichtbar ) )
 	{
-		if( Mak && ( me.verarbeitet || Mak( makParam, this, me ) ) )
+		if( mak && ( me.verarbeitet || mak( makParam, this, me ) ) )
 		{
 			if( me.id != ME_Betritt && me.id != ME_Leaves )
 			{
@@ -2145,8 +2145,8 @@ Zeichnung *BildZ::dublizieren() const // erstellt eine Kopie des Zeichnungs
 	obj->setSize( gr );
 	obj->setMausEreignisParameter( makParam );
 	obj->setTastaturEreignisParameter( takParam );
-	obj->setMausEreignis( Mak );
-	obj->setTastaturEreignis( Tak );
+	obj->setMausEreignis( mak );
+	obj->setTastaturEreignis( tak );
 	if( toolTip )
 		obj->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
 	obj->setStyle( style );

+ 1 - 1
Diagramm.cpp

@@ -1507,7 +1507,7 @@ void LDiag::doMausEreignis( MausEreignis &me )
     me.my -= pos.y;
     if( hatDatenStyle( DiagDaten::Style::Sichtbar ) && ( hatStyle( Style::HScroll ) || hatStyle( Style::VScroll ) ) )
     {
-        if( Mak && ( me.verarbeitet || Mak( makParam, this, me ) ) )
+        if( mak && ( me.verarbeitet || mak( makParam, this, me ) ) )
         {
             if( me.id != ME_Betritt && me.id != ME_Leaves )
             {

+ 9 - 11
Fenster.cpp

@@ -1366,9 +1366,9 @@ void Fenster::setClosingMeParam( void *param )
     closingMeParam = param;
 }
 
-void Fenster::setClosingMe( bool( *closeMe )( void *, void *, MausEreignis ) ) // setzt das Schließen Mausereignis
+void Fenster::setClosingMe( std::function< bool( void*, void*, MausEreignis ) > closingMe ) // setzt das Schließen Mausereignis
 {
-    this->closingMe = closeMe;
+    this->closingMe = closingMe;
 }
 
 // -- Schließen Hintergrund -- 
@@ -1590,9 +1590,7 @@ bool Fenster::tick( double tickval ) // tick
         rend |= vScroll->getRend();
     if( hScroll && hatStyle( Style::HScroll ) )
         rend |= hScroll->getRend();
-    bool ret = rend;
-    rend = 0;
-    return ret;
+    return Zeichnung::tick( tickval );
 }
 
 void Fenster::doMausEreignis( MausEreignis &me )
@@ -1625,7 +1623,7 @@ void Fenster::doMausEreignis( MausEreignis &me )
     if( hatStyle( Style::Sichtbar ) )
     {
         bool mvtmp = me.verarbeitet;
-        if( !Mak )
+        if( !mak )
             return;
         if( hatStyleNicht( Style::Erlaubt ) )
             me.verarbeitet = 1;
@@ -1644,7 +1642,7 @@ void Fenster::doMausEreignis( MausEreignis &me )
         {
             if( hatStyle( Style::Beweglich ) || hatStyle( Style::HeightChangeable ) || hatStyle( Style::BreiteChangeable ) || hatStyle( Style::TitelHeightChangeable ) )
             {
-                if( Mak( makParam, this, me ) )
+                if( mak( makParam, this, me ) )
                 {
                     mpr = 1;
                     bool ret1 = 0;
@@ -1804,7 +1802,7 @@ void Fenster::doMausEreignis( MausEreignis &me )
             }
         }
         bool inside = me.mx >= 0 && me.mx <= gr.x && me.my >= 0 && me.my <= gr.y;
-        if( mpr || me.verarbeitet || ( !inside || Mak( makParam, this, me ) ) )
+        if( mpr || me.verarbeitet || ( !inside || mak( makParam, this, me ) ) )
         {
             if( me.id == ME_RLinks )
             {
@@ -1908,7 +1906,7 @@ void Fenster::doTastaturEreignis( TastaturEreignis &te )
         }
         else
         {
-            if( Tak && Tak( takParam, this, te ) )
+            if( tak && tak( takParam, this, te ) )
             {
                 if( members )
                     members->sendTastaturAll( te );
@@ -2396,8 +2394,8 @@ Zeichnung *Fenster::dublizieren() const // Erzeugt eine Kopie des Fensters
     ret->setSize( gr );
     ret->setMausEreignisParameter( makParam );
     ret->setTastaturEreignisParameter( takParam );
-    ret->setMausEreignis( Mak );
-    ret->setTastaturEreignis( Tak );
+    ret->setMausEreignis( mak );
+    ret->setTastaturEreignis( tak );
     if( toolTip )
         ret->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
     ret->setStyle( style );

+ 2 - 2
Fenster.h

@@ -277,7 +277,7 @@ namespace Framework
             const static __int64 normal = Sichtbar | Erlaubt | Rahmen | Titel | TitelBuffered | Closable | ClosingHBild | ClosingKlickBuffer | Beweglich; // Vereint die Flags Sichtbar, Erlaubt, Rahmen, Titel, TitelBuffered, Schließbar, SchließHBild, SchließKlickBuffer, Beweglich
         };
     private:
-        bool( *closingMe )( void *, void *, MausEreignis );
+        std::function< bool( void*, void*, MausEreignis ) > closingMe;
         void *closingMeParam;
         LRahmen *rahmen;
         TextFeld *titel;
@@ -384,7 +384,7 @@ namespace Framework
         // 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
         //  ak: Ein Zeiger auf die Rückruffunktion
-        __declspec( dllexport ) void setClosingMe( bool( *closingMe )( void *, void *, MausEreignis ) );
+        __declspec( dllexport ) void setClosingMe( std::function< bool( void*, void*, MausEreignis ) > closingMe );
         // Setzt die Hintergrund Farbe des Schließen Knopfes
         //  f: Die Farbe im A8R8G8B8 Format
         __declspec( dllexport ) void setSBgFarbe( int f );

+ 4 - 4
Knopf.cpp

@@ -147,7 +147,7 @@ void Knopf::doMausEreignis( MausEreignis &me ) // Maus Ereignis
     }
     ++ref;
     me.mx -= pos.x, me.my -= pos.y;
-    if( Mak && ( me.verarbeitet || Mak( makParam, this, me ) ) )
+    if( mak && ( me.verarbeitet || mak( makParam, this, me ) ) )
     {
         if( me.id == ME_Betritt )
         {
@@ -274,8 +274,8 @@ Zeichnung *Knopf::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     obj->setSize( gr );
     obj->setMausEreignisParameter( makParam );
     obj->setTastaturEreignisParameter( takParam );
-    obj->setMausEreignis( Mak );
-    obj->setTastaturEreignis( Tak );
+    obj->setMausEreignis( mak );
+    obj->setTastaturEreignis( tak );
     if( toolTip )
         obj->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
     obj->setStyle( style );
@@ -622,7 +622,7 @@ void KontrollKnopf::doMausEreignis( MausEreignis &me ) // Nachrichten verarbeitu
     }
     me.mx -= pos.x;
     me.my -= pos.y;
-    if( Mak && ( me.verarbeitet || Mak( makParam, this, me ) ) )
+    if( mak && ( me.verarbeitet || mak( makParam, this, me ) ) )
     {
         if( me.id == ME_Betritt && hatStyle( Style::MausKlick ) != MausStand[ M_Links ] )
             setStyle( Style::MausKlick, MausStand[ M_Links ] );

+ 3 - 3
Liste.cpp

@@ -506,7 +506,7 @@ void AuswahlListe::doMausEreignis( MausEreignis &me )
         doMausEreignis( me2 );
     }
     me.mx -= pos.x, me.my -= pos.y;
-    if( Mak && ( me.verarbeitet || Mak( makParam, this, me ) ) )
+    if( mak && ( me.verarbeitet || mak( makParam, this, me ) ) )
     {
         if( removeFokus && me.id == ME_RLinks )
             removeStyle( Style::Fokus );
@@ -578,10 +578,10 @@ void AuswahlListe::doMausEreignis( MausEreignis &me )
 void AuswahlListe::doTastaturEreignis( TastaturEreignis &te )
 {
     bool ntakc = !te.verarbeitet;
-    if( hatStyleNicht( Style::Fokus ) || !Tak || te.verarbeitet )
+    if( hatStyleNicht( Style::Fokus ) || !tak || te.verarbeitet )
         return;
     ++ref;
-    if( Tak( takParam, this, te ) )
+    if( tak( takParam, this, te ) )
     {
         if( te.id == TE_Press )
         {

+ 1 - 1
M2DVorschau.cpp

@@ -90,7 +90,7 @@ void M2DVorschau::doMausEreignis( MausEreignis &me )
         doMausEreignis( me2 );
     }
     me.mx -= pos.x, me.my -= pos.y;
-    if( Mak && Mak( makParam, this, me ) )
+    if( mak && mak( makParam, this, me ) )
     {
         if( hatStyle( Style::UsrScale ) )
         {

+ 2 - 2
Model2D.cpp

@@ -478,11 +478,11 @@ void Model2D::setFarbe( int f )
 
 void Model2D::doMausEreignis( MausEreignis &me )
 {
-    if( !Mak || me.verarbeitet || !istPunktInnen( Punkt( me.mx, me.my ) ) )
+    if( !mak || me.verarbeitet || !istPunktInnen( Punkt( me.mx, me.my ) ) )
         return;
     me.mx -= pos.x;
     me.my -= pos.y;
-    Mak( makParam, this, me );
+    mak( makParam, this, me );
     me.mx += pos.x;
     me.my += pos.y;
     me.verarbeitet = 1;

+ 4 - 1
Model3D.cpp

@@ -138,7 +138,7 @@ float Knochen::getRadius() const
 {
     float r = pos.getLength();
     if( geschwister )
-        r = max( r, geschwister->getRadius() );
+        r = MAX( r, geschwister->getRadius() );
     if( kinder )
         r += kinder->getRadius();
     return r;
@@ -629,7 +629,10 @@ bool Model3D::tick( double tickval )
     {
         radius += skelett->getRadius();
         for( auto i = animations->getArray(); i.set && i.var; i++ )
+        {
+            rend = i.var->speed > 0;
             i.var->a->apply( skelett, i.var->offset, tickval * i.var->speed );
+        }
     }
     return Zeichnung3D::tick( tickval );
 }

+ 1 - 1
Model3D.h

@@ -94,7 +94,7 @@ namespace Framework
         //  kamMatrix: Die vereiniegung der view und projektions Matrizen
         __declspec( dllexport ) int kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, Mat4< float > &kamMatrix );
         // Berechnet den Radius des Skeletts
-        _declspec( dllexport ) float getRadius() const;
+        __declspec( dllexport ) float getRadius() const;
         // Kopiert das Skelett
         __declspec( dllexport ) Skelett *kopiereSkelett() const;
         // Erhöht den Reference Counting Zähler.

+ 2 - 2
Rahmen.cpp

@@ -92,8 +92,8 @@ Zeichnung *LRahmen::dublizieren() const // Kopiert das Zeichnung
     obj->setSize( gr );
     obj->setMausEreignisParameter( makParam );
     obj->setTastaturEreignisParameter( takParam );
-    obj->setMausEreignis( Mak );
-    obj->setTastaturEreignis( Tak );
+    obj->setMausEreignis( mak );
+    obj->setTastaturEreignis( tak );
     if( toolTip )
         obj->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
     obj->setAlpha( alpha );

+ 4 - 4
Tabelle.cpp

@@ -847,7 +847,7 @@ void ObjTabelle::doMausEreignis( MausEreignis &me ) // verarbeitet Nachrichten
         removeFokus = 1;
     }
     bool ausserhalb = !( me.mx >= pos.x && me.mx <= pos.x + gr.x && me.my >= pos.y && me.my <= pos.y + gr.y ) && me.id != ME_Leaves;
-    bool MakB = Mak && ( me.verarbeitet || ausserhalb || Mak( makParam, this, me ) );
+    bool MakB = mak && ( me.verarbeitet || ausserhalb || mak( makParam, this, me ) );
     if( !( me.mx >= pos.x && me.mx <= pos.x + gr.x && me.my >= pos.y && me.my <= pos.y + gr.y ) && me.id != ME_Leaves )
     {
         if( removeFokus && me.id == ME_RLinks )
@@ -1004,7 +1004,7 @@ void ObjTabelle::doTastaturEreignis( TastaturEreignis &te )
     bool ntakc = !te.verarbeitet;
     if( hatStyleNicht( Style::Fokus ) || hatStyleNicht( Style::Erlaubt ) || hatStyleNicht( Style::Sichtbar ) )
         return;
-    if( Tak && ( te.verarbeitet || Tak( takParam, this, te ) ) )
+    if( tak && ( te.verarbeitet || tak( takParam, this, te ) ) )
     {
         lockZeichnung();
         if( zZeichnung( selected.x, selected.y ) )
@@ -1523,8 +1523,8 @@ Zeichnung *ObjTabelle::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     obj->setSize( gr );
     obj->setMausEreignisParameter( makParam );
     obj->setTastaturEreignisParameter( takParam );
-    obj->setMausEreignis( Mak );
-    obj->setTastaturEreignis( Tak );
+    obj->setMausEreignis( mak );
+    obj->setTastaturEreignis( tak );
     if( toolTip )
         obj->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
     obj->setStyle( style );

+ 6 - 6
TextFeld.cpp

@@ -306,7 +306,7 @@ void TextFeld::doMausEreignis( MausEreignis &me ) // Maus Ereignis
 		if( removeFokus && me.id == ME_RLinks )
 		{
 			me.mx -= pos.x, me.my -= pos.y;
-			if( hatStyle( Style::Fokus ) && Mak && ( me.verarbeitet || Mak( makParam, this, me ) ) )
+			if( hatStyle( Style::Fokus ) && mak && ( me.verarbeitet || mak( makParam, this, me ) ) )
 				removeStyle( Style::Fokus );
 			if( nmakc && me.verarbeitet && nMak )
 				me.verarbeitet = nMak( nmakParam, this, me );
@@ -329,7 +329,7 @@ void TextFeld::doMausEreignis( MausEreignis &me ) // Maus Ereignis
 		doMausEreignis( me2 );
 	}
 	me.mx -= pos.x, me.my -= pos.y;
-	if( Mak && ( me.verarbeitet || Mak( makParam, this, me ) ) )
+	if( mak && ( me.verarbeitet || mak( makParam, this, me ) ) )
 	{
 		if( removeFokus && me.id == ME_RLinks )
 			removeStyle( Style::Fokus );
@@ -471,10 +471,10 @@ void TextFeld::doTastaturEreignis( TastaturEreignis &te )
 	bool ntakc = !te.verarbeitet;
 	if( te.verarbeitet || hatStyleNicht( Style::Fokus ) )
 		return;
-	if( !Tak )
+	if( !tak )
 		return;
 	++ref;
-	if( Tak( takParam, this, te ) )
+	if( tak( takParam, this, te ) )
 	{
 		if( hatStyleNicht( Style::Erlaubt ) )
 		{
@@ -789,8 +789,8 @@ Zeichnung *TextFeld::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
 	obj->setSize( gr );
 	obj->setMausEreignisParameter( makParam );
 	obj->setTastaturEreignisParameter( takParam );
-	obj->setMausEreignis( Mak );
-	obj->setTastaturEreignis( Tak );
+	obj->setMausEreignis( mak );
+	obj->setTastaturEreignis( tak );
 	if( toolTip )
 		obj->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
 	obj->setStyle( style );

+ 1 - 3
ToolTip.cpp

@@ -126,9 +126,7 @@ bool ToolTip::tick( double tickVal )
             rend = 1;
         }
     }
-    bool ret = rend;
-    rend = 0;
-    return ret;
+    return TextFeld::tick( tickVal );
 }
 
 void ToolTip::doMausEreignis( MausEreignis &me )

+ 31 - 21
Zeichnung.cpp

@@ -21,8 +21,8 @@ Zeichnung::Zeichnung()
     gr( 0, 0 ),
     makParam( 0 ),
     takParam( 0 ),
-    Mak( 0 ),
-    Tak( 0 ),
+    mak( 0 ),
+    tak( 0 ),
     nmakParam( 0 ),
     ntakParam( 0 ),
     nMak( 0 ),
@@ -30,8 +30,7 @@ Zeichnung::Zeichnung()
     mausIn( 0 ),
     toolTip( 0 ),
     rend( 0 )
-{
-}
+{}
 
 // Destruktor 
 Zeichnung::~Zeichnung()
@@ -40,6 +39,12 @@ Zeichnung::~Zeichnung()
         toolTip->release();
 }
 
+// Übergibt einen Void Funktionspointer auf eine Aktion die einmalig vom Hauptthread ausgeführt werden soll. (Passiert nach dem Tick)
+void Zeichnung::postAction( std::function< void() > action )
+{
+    actions.push( action );
+}
+
 // nicht constant 
 void Zeichnung::setRender()
 {
@@ -78,14 +83,14 @@ void Zeichnung::setTastaturEreignisParameter( void *p ) // setzt den Parameter v
     takParam = p;
 }
 
-void Zeichnung::setMausEreignis( bool( *ak )( void *, void *, MausEreignis ) ) // setzt das Maus Ereignis
+void Zeichnung::setMausEreignis( std::function< bool( void*, void*, MausEreignis ) > ak ) // setzt das Maus Ereignis
 {
-    Mak = ak;
+    mak = ak;
 }
 
-void Zeichnung::setTastaturEreignis( bool( *ak )( void *, void *, TastaturEreignis ) ) // setzt das TastaturEreignis
+void Zeichnung::setTastaturEreignis( std::function< bool( void*, void*, TastaturEreignis ) > ak ) // setzt das TastaturEreignis
 {
-    Tak = ak;
+    tak = ak;
 }
 
 void Zeichnung::setNMausEreignisParameter( void *p ) // setzt den Parameter vom Maus Ereignis
@@ -98,12 +103,12 @@ void Zeichnung::setNTastaturEreignisParameter( void *p ) // setzt den Parameter
     ntakParam = p;
 }
 
-void Zeichnung::setNMausEreignis( bool( *ak )( void *, void *, MausEreignis ) ) // setzt das Maus Ereignis
+void Zeichnung::setNMausEreignis( std::function< bool( void*, void*, MausEreignis ) > ak ) // setzt das Maus Ereignis
 {
     nMak = ak;
 }
 
-void Zeichnung::setNTastaturEreignis( bool( *ak )( void *, void *, TastaturEreignis ) ) // setzt das TastaturEreignis
+void Zeichnung::setNTastaturEreignis( std::function< bool( void*, void*, TastaturEreignis ) > ak ) // setzt das TastaturEreignis
 {
     nTak = ak;
 }
@@ -139,8 +144,8 @@ void Zeichnung::doMausEreignis( MausEreignis &me ) // ruft Mak auf
         doMausEreignis( me2 );
     }
     me.mx -= pos.x, me.my -= pos.y;
-    if( Mak )
-        me.verarbeitet |= Mak( makParam, this, me );
+    if( mak )
+        me.verarbeitet |= mak( makParam, this, me );
     if( nMak && me.verarbeitet )
         me.verarbeitet = nMak( nmakParam, this, me );
     me.mx += pos.x, me.my += pos.y;
@@ -150,8 +155,8 @@ void Zeichnung::doTastaturEreignis( TastaturEreignis &te ) // ruft Tak auf
 {
     if( te.verarbeitet )
         return;
-    if( Tak )
-        te.verarbeitet |= Tak( takParam, this, te );
+    if( tak )
+        te.verarbeitet |= tak( takParam, this, te );
     if( nTak && te.verarbeitet )
         te.verarbeitet = nTak( ntakParam, this, te );
 }
@@ -208,6 +213,11 @@ void Zeichnung::setSize( int x, int y ) // setzt die Gr
 
 bool Zeichnung::tick( double tickval )
 {
+    while( !actions.empty() )
+    {
+        actions.front()();
+        actions.pop();
+    }
     bool r = rend;
     rend = 0;
     return r;
@@ -267,12 +277,12 @@ void Zeichnung::render( Bild &zRObj )
 // constant 
 bool Zeichnung::hatMausEreignis() const // prüft, ob Mak gesetzt ist
 {
-    return Mak != 0;
+    return mak != 0;
 }
 
 bool Zeichnung::hatTastaturEreignis() const // prüft, ob Tak gesetzt ist
 {
-    return Tak != 0;
+    return tak != 0;
 }
 
 const Punkt &Zeichnung::getPosition() const // gibt die Position zurück
@@ -332,8 +342,8 @@ Zeichnung *Zeichnung::dublizieren() const // Erzeugt eine Kopie des Zeichnungs
     obj->setSize( gr );
     obj->setMausEreignisParameter( makParam );
     obj->setTastaturEreignisParameter( takParam );
-    obj->setMausEreignis( Mak );
-    obj->setTastaturEreignis( Tak );
+    obj->setMausEreignis( mak );
+    obj->setTastaturEreignis( tak );
     if( toolTip )
         obj->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
     return obj;
@@ -745,7 +755,7 @@ void ZeichnungHintergrund::render( Bild &rObj )
         unlockZeichnung();
         return;
     }
-	Zeichnung::render( rObj );
+    Zeichnung::render( rObj );
     int rbr = 0;
     if( hatStyle( Style::Rahmen ) && rahmen )
     {
@@ -944,8 +954,8 @@ Zeichnung *ZeichnungHintergrund::dublizieren() const // Erzeugt eine Kopie des Z
     obj->setSize( gr );
     obj->setMausEreignisParameter( makParam );
     obj->setTastaturEreignisParameter( takParam );
-    obj->setMausEreignis( Mak );
-    obj->setTastaturEreignis( Tak );
+    obj->setMausEreignis( mak );
+    obj->setTastaturEreignis( tak );
     if( toolTip )
         obj->setToolTipText( toolTip->zText()->getText(), toolTip->zBildschirm() );
     obj->setStyle( style );

+ 13 - 8
Zeichnung.h

@@ -3,6 +3,8 @@
 
 #include "Punkt.h"
 #include "Critical.h"
+#include <queue>
+#include <functional>
 
 namespace Framework
 {
@@ -36,23 +38,26 @@ namespace Framework
         Punkt gr;
         void *makParam;
         void *takParam;
-        bool( *Mak )( void *, void *, MausEreignis );
-        bool( *Tak )( void *, void *, TastaturEreignis );
+        std::function< bool( void*, void*, MausEreignis ) > mak;
+        std::function< bool( void*, void*, TastaturEreignis ) > tak;
         void *nmakParam;
         void *ntakParam;
-        bool( *nMak )( void *, void *, MausEreignis );
-        bool( *nTak )( void *, void *, TastaturEreignis );
+        std::function< bool( void*, void*, MausEreignis ) > nMak;
+        std::function< bool( void*, void*, TastaturEreignis ) > nTak;
         bool mausIn;
         Critical cs;
         ToolTip *toolTip;
         __int64 style;
         bool rend;
+        std::queue< std::function< void() > > actions;
 
     public:
         // Konstruktor 
         __declspec( dllexport ) Zeichnung();
         // Destruktor 
         __declspec( dllexport ) ~Zeichnung();
+        // Übergibt einen Void Funktionspointer auf eine Aktion die einmalig vom Hauptthread ausgeführt werden soll. (Passiert nach dem Tick)
+        __declspec( dllexport ) void postAction( std::function< void() > action );
         // Legt fest, ob sich die Zeichnung seit des letzten Bildes verändert hat und neu gezeichnet werden muss
         __declspec( dllexport ) void setRender();
         // Setzt den Text, der erscheint, wenn der Benutzer für längere Zeit mit der Maus in der Zeichnung verweilt
@@ -75,13 +80,13 @@ namespace Framework
         // Wenn die Rückruffunktion 0 zurückgiebt, oder nicht gesetzt wurde, wird ein Maus Ereignis von der Zeichnung nicht weiter beachtet
         // Es kann die Standartfunktion __ret1ME verwendet werden, die in MausEreignis.h definiert ist und immer 1 zurückgibt
         //  ak: Ein Zeiger auf die Rückruffunktion
-        __declspec( dllexport ) void setMausEreignis( bool( *ak )( void *, void *, MausEreignis ) );
+        __declspec( dllexport ) void setMausEreignis( std::function< bool( void*, void*, MausEreignis ) > 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
         //  ak: Ein Zeiger auf die Rückruffunktion
-        __declspec( dllexport ) void setTastaturEreignis( bool( *ak )( void *, void *, TastaturEreignis ) );
+        __declspec( dllexport ) void setTastaturEreignis( std::function< bool( void*, void*, TastaturEreignis ) > ak );
         // setzt den Parameter, der bei einem Maus Ereignis an die Rückruffunktion übergeben wird, die aufgerufen wird, fals das Ereignis von der Zeichnung verarbeitet wurde
         //  p: Der Parameter
         __declspec( dllexport ) void setNMausEreignisParameter( void *p );
@@ -92,13 +97,13 @@ namespace Framework
         // Wenn die Rückruffunktion 1 zurückgiebt, oder nicht gesetzt wurde, wird das Maus Ereignis von keiner weiteren Zeichnung verarbeitet, die zum Beispiel hinter dieser Zeichnung liegen
         // Es kann die Standartfunktion __ret1ME verwendet werden, die in MausEreignis.h definiert ist und immer 1 zurückgibt
         //  ak: Ein Zeiger auf die Rückruffunktion
-        __declspec( dllexport ) void setNMausEreignis( bool( *ak )( void *, void *, MausEreignis ) );
+        __declspec( dllexport ) void setNMausEreignis( std::function< bool( void*, void*, MausEreignis ) > ak );
         // Setzt die Rückruffunktion, die bei einem Tastatur Ereignis aufgerufen werdne soll, nachdem das Ereignis bereits von der Zeichnung verarbeitet wurde
         // Wenn die Rückruffunktion 1 zurückgiebt, oder nicht gesetzt wurde, wird das Tastatur Ereignis von keiner weiteren Zeichnung verarbeitet
         // 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
         //  ak: Ein Zeiger auf die Rückruffunktion
-        __declspec( dllexport ) void setNTastaturEreignis( bool( *ak )( void *, void *, TastaturEreignis ) );
+        __declspec( dllexport ) void setNTastaturEreignis( std::function< bool( void*, void*, TastaturEreignis ) > ak );
         // Verarbeitet ein Maus Ereignis. Wird vom Framework automatisch aufgerufen.
         //  me: Das Ereignis
         __declspec( dllexport ) virtual void doMausEreignis( MausEreignis &me );