Browse Source

Fehlerhafte weitergabe von Mausereignissen durch container an die member behoben, welche sich nicht im sichtfeld der scroll ansicht befinden

Kolja Strohm 5 years ago
parent
commit
eea1127edf
2 changed files with 80 additions and 64 deletions
  1. 74 63
      Fenster.cpp
  2. 6 1
      Tabelle.cpp

+ 74 - 63
Fenster.cpp

@@ -519,7 +519,7 @@ bool WFenster::setFokus() // Setzt den Fokus auf das Fenster
     return GetFocus() == hWnd;
 }
 
-void WFenster::setPosition( Punkt &p )// Fenster Position
+void WFenster::setPosition( Punkt & p )// Fenster Position
 {
     RECT r;
     GetWindowRect( hWnd, &r ); // Vorherige Position herausfinden
@@ -539,7 +539,7 @@ void WFenster::setPosition( Punkt &p )// Fenster Position
     SetWindowPos( hWnd, 0, res.left, res.top, res.right, res.bottom, 0 ); // Position ändern
 }
 
-void WFenster::setSize( Punkt &g )// Fenster Größe
+void WFenster::setSize( Punkt & g )// Fenster Größe
 {
     RECT r;
     GetWindowRect( hWnd, &r ); // vorherige Größe herausfinden
@@ -579,12 +579,12 @@ void WFenster::setSize( int breite, int h
     SetWindowPos( hWnd, 0, res.left, res.top, res.right, res.bottom, 0 ); // Größe ändern
 }
 
-void WFenster::setBounds( Punkt &p, Punkt &g ) // setzt größe und Position
+void WFenster::setBounds( Punkt & p, Punkt & g ) // setzt größe und Position
 {
     SetWindowPos( hWnd, 0, p.x, p.y, g.x, g.y, 0 ); // Größe und Position ändern
 }
 
-void WFenster::setBildschirm( Bildschirm *screen )
+void WFenster::setBildschirm( Bildschirm * screen )
 {
     if( this->screen )
         this->screen->release();
@@ -606,7 +606,7 @@ void WFenster::zerst
     hdc = 0;
 }
 
-void WFenster::doMausAktion( MausEreignis &me )
+void WFenster::doMausAktion( MausEreignis & me )
 {
     if( !mausAktion || !mausAktion( makParam, this, me ) )
         return;
@@ -656,7 +656,7 @@ void WFenster::doNSchlie
     nCloseAktion( sakParam, this );
 }
 
-void WFenster::doTastaturAktion( TastaturEreignis &te )
+void WFenster::doTastaturAktion( TastaturEreignis & te )
 {
     if( !tastaturAktion || !tastaturAktion( takParam, this, te ) )
         return;
@@ -691,12 +691,12 @@ void WFenster::setMausAktion( MausAktion mausAk )
     mausAktion = mausAk;
 }
 
-void WFenster::setVSchließAktion( std::function< void( void*, void* ) > vSchließAk )
+void WFenster::setVSchließAktion( std::function< void( void *, void * ) > vSchließAk )
 {
     vCloseAktion = vSchließAk;
 }
 
-void WFenster::setNSchließAktion( std::function< void( void*, void* ) > nSchließAk )
+void WFenster::setNSchließAktion( std::function< void( void *, void * ) > nSchließAk )
 {
     nCloseAktion = nSchließAk;
 }
@@ -716,7 +716,7 @@ void WFenster::setVerschiebbar( bool verschiebbar ) // legt fest, ob das Fenster
     this->verschiebbar = verschiebbar;
 }
 
-void WFenster::ladeRahmenFenster( Bild *zBild, HINSTANCE hinst ) // setzt einen Transpatenten Rahmen um das Fenster
+void WFenster::ladeRahmenFenster( Bild * zBild, HINSTANCE hinst ) // setzt einen Transpatenten Rahmen um das Fenster
 {
     if( !zBild )
         return;
@@ -747,7 +747,7 @@ void WFenster::ladeRahmenFenster( Bild *zBild, HINSTANCE hinst ) // setzt einen
     info.bmiHeader.biCompression = BI_RGB;
     info.bmiHeader.biPlanes = 1;
     unsigned char *pPixels = 0;
-    bitmap = CreateDIBSection( hdc, &info, DIB_RGB_COLORS, (void**)&pPixels, 0, 0 );
+    bitmap = CreateDIBSection( hdc, &info, DIB_RGB_COLORS, (void **)& pPixels, 0, 0 );
     if( !bitmap )
         DeleteDC( hdc );
     GdiFlush();
@@ -801,17 +801,17 @@ void WFenster::ladeRahmenFenster( Bild *zBild, HINSTANCE hinst ) // setzt einen
     if( RegisterClassEx( &wcl ) )
     {
         rahmen = CreateWindowEx( WS_EX_TOOLWINDOW | WS_EX_LAYERED,
-            wcl.lpszClassName,
-            TEXT( "Transparentes Fenster" ),
-            WS_POPUP,
-            0,
-            0,
-            zBild->getBreite(),
-            zBild->getHeight(),
-            0,
-            0,
-            wcl.hInstance,
-            0
+                                 wcl.lpszClassName,
+                                 TEXT( "Transparentes Fenster" ),
+                                 WS_POPUP,
+                                 0,
+                                 0,
+                                 zBild->getBreite(),
+                                 zBild->getHeight(),
+                                 0,
+                                 0,
+                                 wcl.hInstance,
+                                 0
         );
         if( rahmen )
         {
@@ -948,7 +948,7 @@ WFensterArray::~WFensterArray()
 }
 
 // add und remove 
-bool WFensterArray::addFenster( WFenster *fenster )
+bool WFensterArray::addFenster( WFenster * fenster )
 {
     if( fenster == This )
         return 0;
@@ -962,7 +962,7 @@ bool WFensterArray::addFenster( WFenster *fenster )
     return next->addFenster( fenster );
 }
 
-bool WFensterArray::removeFenster( WFenster *fenster )
+bool WFensterArray::removeFenster( WFenster * fenster )
 {
     if( fenster == This )
         return 1;
@@ -1033,7 +1033,7 @@ bool WFensterArray::sendNSchlie
     return ret | next->sendNSchließMessage( hwnd );
 }
 
-bool WFensterArray::sendMausMessage( HWND hwnd, MausEreignis &me )
+bool WFensterArray::sendMausMessage( HWND hwnd, MausEreignis & me )
 {
     if( !This )
         return 0;
@@ -1048,7 +1048,7 @@ bool WFensterArray::sendMausMessage( HWND hwnd, MausEreignis &me )
     return ret | next->sendMausMessage( hwnd, me );
 }
 
-bool WFensterArray::sendTastaturMessage( HWND hwnd, TastaturEreignis &te )
+bool WFensterArray::sendTastaturMessage( HWND hwnd, TastaturEreignis & te )
 {
     if( !This )
         return 0;
@@ -1084,7 +1084,7 @@ WFenster *WFensterArray::getThis()
 }
 
 // WMessageBox
-void Framework::WMessageBox( HWND hWnd, Text *titel, Text *meldung, UINT style )
+void Framework::WMessageBox( HWND hWnd, Text * titel, Text * meldung, UINT style )
 {
     MessageBox( hWnd, meldung->getText(), titel->getText(), style ); // Message Box
     titel->release();
@@ -1151,7 +1151,7 @@ Fenster::~Fenster()
 
 // nicht const 
 // -- Rahmen -- 
-void Fenster::setRahmenZ( Rahmen *ram ) // setzt den rahmen
+void Fenster::setRahmenZ( Rahmen * ram ) // setzt den rahmen
 {
     if( rahmen )
         rahmen->release();
@@ -1176,7 +1176,7 @@ void Fenster::setRBreite( int br ) // setzt die Breite des Rahmens
 }
 
 // -- Titel -- 
-void Fenster::setTitel( Text *txt ) // setzt den Titel
+void Fenster::setTitel( Text * txt ) // setzt den Titel
 {
     if( !titel )
         titel = new TextFeld();
@@ -1184,7 +1184,7 @@ void Fenster::setTitel( Text *txt ) // setzt den Titel
     rend = 1;
 }
 
-void Fenster::setTitelZ( Text *txt )
+void Fenster::setTitelZ( Text * txt )
 {
     if( !titel )
         titel = new TextFeld();
@@ -1200,7 +1200,7 @@ void Fenster::setTitel( const char *txt )
     rend = 1;
 }
 
-void Fenster::setTTextFeldZ( TextFeld *tf ) // setzt das Titel TextFeld
+void Fenster::setTTextFeldZ( TextFeld * tf ) // setzt das Titel TextFeld
 {
     if( titel )
         titel->release();
@@ -1209,7 +1209,7 @@ void Fenster::setTTextFeldZ( TextFeld *tf ) // setzt das Titel TextFeld
 }
 
 // -- Schrift -- 
-void Fenster::setTSchriftZ( Schrift *schrift ) // setzt die Titel Schrift
+void Fenster::setTSchriftZ( Schrift * schrift ) // setzt die Titel Schrift
 {
     if( !titel )
         titel = new TextFeld();
@@ -1243,7 +1243,7 @@ void Fenster::setTBgFarbe( int f ) // setzt Titel Hintergrund farbe
 }
 
 // -- Titel AlphaFeld -- 
-void Fenster::setTAlphaFeldZ( AlphaFeld *af ) // setzt das Titel AlphaFeld
+void Fenster::setTAlphaFeldZ( AlphaFeld * af ) // setzt das Titel AlphaFeld
 {
     if( !titel )
         titel = new TextFeld();
@@ -1268,7 +1268,7 @@ void Fenster::setTAfStrength( int st ) // setzt die St
 }
 
 // -- Titel Hintergrund Bild -- 
-void Fenster::setTBgBild( Bild *b ) // setzt das Titel Hintergrund Bild
+void Fenster::setTBgBild( Bild * b ) // setzt das Titel Hintergrund Bild
 {
     if( !titel )
         titel = new TextFeld();
@@ -1276,7 +1276,7 @@ void Fenster::setTBgBild( Bild *b ) // setzt das Titel Hintergrund Bild
     rend = 1;
 }
 
-void Fenster::setTBgBildZ( Bild *b )
+void Fenster::setTBgBildZ( Bild * b )
 {
     if( !titel )
         titel = new TextFeld();
@@ -1285,7 +1285,7 @@ void Fenster::setTBgBildZ( Bild *b )
 }
 
 // -- Titel Rahmen -- 
-void Fenster::setTRahmenZ( Rahmen *ram ) // set Titel Rahmen
+void Fenster::setTRahmenZ( Rahmen * ram ) // set Titel Rahmen
 {
     if( !titel )
         titel = new TextFeld();
@@ -1317,7 +1317,7 @@ void Fenster::setKBgFarbe( int f ) // setzt die K
 }
 
 // -- Körper Hintergrund Bild -- 
-void Fenster::setKBgBild( Bild *b ) // setzt das Körper Hintergrund Bild
+void Fenster::setKBgBild( Bild * b ) // setzt das Körper Hintergrund Bild
 {
     if( !bgBodyPicture )
         bgBodyPicture = new Bild();
@@ -1331,7 +1331,7 @@ void Fenster::setKBgBild( Bild *b ) // setzt das K
     rend = 1;
 }
 
-void Fenster::setKBgBildZ( Bild *b )
+void Fenster::setKBgBildZ( Bild * b )
 {
     if( bgBodyPicture )
         bgBodyPicture->release();
@@ -1340,7 +1340,7 @@ void Fenster::setKBgBildZ( Bild *b )
 }
 
 // -- Körper AlphaFeld -- 
-void Fenster::setKAlphaFeldZ( AlphaFeld *af ) // setzt das Körper AlphaFeld
+void Fenster::setKAlphaFeldZ( AlphaFeld * af ) // setzt das Körper AlphaFeld
 {
     if( bodyBuffer )
         bodyBuffer->release();
@@ -1383,7 +1383,7 @@ void Fenster::setSBgFarbe( int f ) // setzt die Schlie
 }
 
 // -- Schließen Hintergrund Bild -- 
-void Fenster::setSBgBild( Bild *b ) // setzt das Schließ Hintergrund Bild
+void Fenster::setSBgBild( Bild * b ) // setzt das Schließ Hintergrund Bild
 {
     if( !bgClosingBild )
         bgClosingBild = new Bild();
@@ -1397,7 +1397,7 @@ void Fenster::setSBgBild( Bild *b ) // setzt das Schlie
     rend = 1;
 }
 
-void Fenster::setSBgBildZ( Bild *b )
+void Fenster::setSBgBildZ( Bild * b )
 {
     if( bgClosingBild )
         bgClosingBild->release();
@@ -1406,7 +1406,7 @@ void Fenster::setSBgBildZ( Bild *b )
 }
 
 // -- Schließen AlphaFeld -- 
-void Fenster::setSAlphaFeldZ( AlphaFeld *af ) // setzt das Schließ AlphaFeld
+void Fenster::setSAlphaFeldZ( AlphaFeld * af ) // setzt das Schließ AlphaFeld
 {
     if( closeBuffer )
         closeBuffer->release();
@@ -1431,7 +1431,7 @@ void Fenster::setSAfStrength( int st ) // setzt die St
 }
 
 // -- Schließen Klick AlphaFeld -- 
-void Fenster::setSKAlphaFeldZ( AlphaFeld *af ) // setzt das Schließ klick AlphaFeld
+void Fenster::setSKAlphaFeldZ( AlphaFeld * af ) // setzt das Schließ klick AlphaFeld
 {
     if( closeKlickBuffer )
         closeKlickBuffer->release();
@@ -1462,7 +1462,7 @@ void Fenster::setMin( int mx, int my ) // setzt die Mindest Fenster Gr
     min.y = my;
 }
 
-void Fenster::setMin( const Punkt &min )
+void Fenster::setMin( const Punkt & min )
 {
     this->min = min;
 }
@@ -1473,7 +1473,7 @@ void Fenster::setMax( int mx, int my ) // setzt die Maximale Fenster Gr
     max.y = my;
 }
 
-void Fenster::setMax( const Punkt &max )
+void Fenster::setMax( const Punkt & max )
 {
     this->max = max;
 }
@@ -1484,7 +1484,7 @@ void Fenster::setKMin( int mx, int my ) // setzt die Mindest K
     kMin.y = my;
 }
 
-void Fenster::setKMin( const Punkt &min )
+void Fenster::setKMin( const Punkt & min )
 {
     kMin = min;
 }
@@ -1495,13 +1495,13 @@ void Fenster::setKMax( int mx, int my ) // setzt die Maximale K
     kMax.y = my;
 }
 
-void Fenster::setKMax( const Punkt &max )
+void Fenster::setKMax( const Punkt & max )
 {
     kMax = max;
 }
 
 // -- scroll -- 
-void Fenster::setHScrollBarZ( HScrollBar *hScroll ) // setzt die Horizontale Scroll Bar
+void Fenster::setHScrollBarZ( HScrollBar * hScroll ) // setzt die Horizontale Scroll Bar
 {
     if( this->hScroll )
         this->hScroll->release();
@@ -1509,7 +1509,7 @@ void Fenster::setHScrollBarZ( HScrollBar *hScroll ) // setzt die Horizontale Scr
     rend = 1;
 }
 
-void Fenster::setVScrollBarZ( VScrollBar *vScroll ) // setzt die Vertikale Scroll BAr
+void Fenster::setVScrollBarZ( VScrollBar * vScroll ) // setzt die Vertikale Scroll BAr
 {
     if( this->vScroll )
         this->vScroll->release();
@@ -1565,7 +1565,7 @@ void Fenster::setVSBScroll( int scroll )
 }
 
 // -- Members -- 
-void Fenster::addMember( Zeichnung *obj ) // fügt einen Member hinzu
+void Fenster::addMember( Zeichnung * obj ) // fügt einen Member hinzu
 {
     if( !members )
         members = new RCArray<Zeichnung>();
@@ -1573,7 +1573,7 @@ void Fenster::addMember( Zeichnung *obj ) // f
     rend = 1;
 }
 
-void Fenster::removeMember( Zeichnung *zObj ) // entfernt einen Member
+void Fenster::removeMember( Zeichnung * zObj ) // entfernt einen Member
 {
     if( !members )
         return;
@@ -1615,7 +1615,7 @@ bool Fenster::tick( double tickval ) // tick
     return Zeichnung::tick( tickval );
 }
 
-void Fenster::doMausEreignis( MausEreignis &me )
+void Fenster::doMausEreignis( MausEreignis & me )
 {
     bool nmakc = !me.verarbeitet;
     if( me.verarbeitet || ( me.mx < pos.x || me.mx > pos.x + gr.x || me.my < pos.y || me.my > pos.y + gr.y ) )
@@ -1899,10 +1899,21 @@ void Fenster::doMausEreignis( MausEreignis &me )
                     me.my += vScroll->getScroll();
                 if( hatStyle( Style::HScroll ) && hScroll )
                     me.mx += hScroll->getScroll();
+                if( inside )
                 {
                     for( int i = members->getEintragAnzahl() - 1; i >= 0; i-- )
                         members->z( i )->doMausEreignis( me );
                 }
+                else
+                {
+                    MausEreignis me;
+                    me.id = ME_Leaves;
+                    me.mx = -1;
+                    me.my = -1;
+                    me.verarbeitet = 1;
+                    for( int i = members->getEintragAnzahl() - 1; i >= 0; i-- )
+                        members->z( i )->doMausEreignis( me );
+                }
                 me.mx += rbr;
                 me.my += rbr + th;
                 if( hatStyle( Style::VScroll ) && vScroll )
@@ -1932,7 +1943,7 @@ void Fenster::doMausEreignis( MausEreignis &me )
     }
 }
 
-void Fenster::doTastaturEreignis( TastaturEreignis &te )
+void Fenster::doTastaturEreignis( TastaturEreignis & te )
 {
     bool ntakc = !te.verarbeitet;
     if( hatStyle( Style::Sichtbar ) )
@@ -1962,7 +1973,7 @@ void Fenster::doTastaturEreignis( TastaturEreignis &te )
 }
 
 // -- Render -- 
-void Fenster::render( Bild &zRObj ) // zeichent nach zRObj
+void Fenster::render( Bild & zRObj ) // zeichent nach zRObj
 {
     if( hatStyle( Style::Sichtbar ) )
     {
@@ -2119,7 +2130,7 @@ Rahmen *Fenster::getRahmen() const // gibt den Rahmen zur
 {
     if( !rahmen )
         return 0;
-    return (Rahmen*)rahmen->getThis();
+    return (Rahmen *)rahmen->getThis();
 }
 
 Rahmen *Fenster::zRahmen() const
@@ -2160,7 +2171,7 @@ TextFeld *Fenster::getTTextFeld() const // gibt das Titel TextFeld zur
 {
     if( !titel )
         return 0;
-    return (TextFeld*)titel->getThis();
+    return (TextFeld *)titel->getThis();
 }
 
 TextFeld *Fenster::zTTextFeld() const
@@ -2302,7 +2313,7 @@ AlphaFeld *Fenster::getKAlphaFeld() const // gibt das K
 {
     if( !bodyBuffer )
         return 0;
-    return (AlphaFeld*)bodyBuffer->getThis();
+    return (AlphaFeld *)bodyBuffer->getThis();
 }
 
 AlphaFeld *Fenster::zKAlphaFeld() const
@@ -2348,7 +2359,7 @@ AlphaFeld *Fenster::getSAlphaFeld() const // gibt das Schlie
 {
     if( !closeBuffer )
         return 0;
-    return (AlphaFeld*)closeBuffer->getThis();
+    return (AlphaFeld *)closeBuffer->getThis();
 }
 
 AlphaFeld *Fenster::zSAlphaFeld() const
@@ -2375,7 +2386,7 @@ AlphaFeld *Fenster::getSKAlphaFeld() const // gibt das Schlie
 {
     if( !closeKlickBuffer )
         return 0;
-    return (AlphaFeld*)closeKlickBuffer->getThis();
+    return (AlphaFeld *)closeKlickBuffer->getThis();
 }
 
 AlphaFeld *Fenster::zSKAlphaFeld() const
@@ -2423,7 +2434,7 @@ VScrollBar *Fenster::getVScrollBar() const // gibt die Vertikale Scroll Bar zur
 {
     if( !vScroll )
         return 0;
-    return (VScrollBar*)vScroll->getThis();
+    return (VScrollBar *)vScroll->getThis();
 }
 
 VScrollBar *Fenster::zVScrollBar() const
@@ -2435,7 +2446,7 @@ HScrollBar *Fenster::getHScrollBar() const // gibt die Horizontale Scroll Bar zu
 {
     if( !hScroll )
         return 0;
-    return (HScrollBar*)hScroll->getThis();
+    return (HScrollBar *)hScroll->getThis();
 }
 
 HScrollBar *Fenster::zHScrollBar() const
@@ -2444,7 +2455,7 @@ HScrollBar *Fenster::zHScrollBar() const
 }
 
 // -- Members -- 
-Iterator<Zeichnung*> Fenster::getMembers() const // gibt die Members zurück
+Iterator<Zeichnung *> Fenster::getMembers() const // gibt die Members zurück
 {
     return members->getIterator();
 }
@@ -2460,7 +2471,7 @@ Zeichnung *Fenster::dublizieren() const // Erzeugt eine Kopie des Fensters
     ret->setMausEreignis( mak );
     ret->setTastaturEreignis( tak );
     if( toolTip )
-        ret->setToolTipZ( (ToolTip*)toolTip->dublizieren() );
+        ret->setToolTipZ( (ToolTip *)toolTip->dublizieren() );
     ret->setStyle( style );
     ret->setClosingMeParam( closingMeParam );
     ret->setClosingMe( closingMe );
@@ -2470,7 +2481,7 @@ Zeichnung *Fenster::dublizieren() const // Erzeugt eine Kopie des Fensters
         ret->setRFarbe( rahmen->getFarbe() );
     }
     if( titel )
-        ret->setTTextFeldZ( (TextFeld*)titel->dublizieren() );
+        ret->setTTextFeldZ( (TextFeld *)titel->dublizieren() );
     ret->setKBgFarbe( bgBodyColor );
     if( bgBodyPicture )
         ret->setKBgBild( bgBodyPicture->getThis() );

+ 6 - 1
Tabelle.cpp

@@ -996,6 +996,11 @@ void ObjTabelle::doMausEreignis( MausEreignis &me ) // verarbeitet Nachrichten
             unlockZeichnung();
             if( aufScroll )
                 me.verarbeitet = 1;
+            MausEreignis me2;
+            me2.id = ME_Leaves;
+            me2.mx = me.mx;
+            me2.my = me.my;
+            me2.verarbeitet = 1;
             for( int i = 0; i < zeilenAnzahl; ++i )
             {
                 for( int j = 0; j < spaltenAnzahl; ++j )
@@ -1003,7 +1008,7 @@ void ObjTabelle::doMausEreignis( MausEreignis &me ) // verarbeitet Nachrichten
                     bool b = me.verarbeitet;
                     Zeichnung *obj = zZeichnung( j, i );
                     if( obj )
-                        obj->doMausEreignis( me );
+                        obj->doMausEreignis( ausserhalb ? me2 : me );
                     if( !b && me.verarbeitet && me.id == ME_PLinks )
                         selected = Punkt( j, i );
                 }