Mauskoordinaten komfortabel abfragen ?



  • for (unsigned int i = 0; i < 6; ++i) 
    { 
        if (PtInRect(&rect, pt)) 
            Direct3D.change_Card(i); 
    
        //Rechteck verschieben 
        rect.left     += 80; 
        rect.right    += 80; 
    }
    

    😃 Ist nicht wirklich kürzer... aber nen Bissel 😃 ..



  • @(D)Evil: Witzkeks 😉 👍

    Greetz, Swordfish



  • Ich weiß ja nicht ob es beabsichtigt ist aber bei

    case WM_LBUTTONDOWN:
    

    wird die WM andauernd gesendet und schluckt somit Zeit ...

    Mit

    case WM_LBUTTONUP:
    

    geschieht alles wenn du die Taste loslässt...also nur einmal

    MfG Kuldren



  • Wenn die Karten immer an festen Positionen sind, warum definierst du dir nicht deine 36 Rechtecke in einem globalen Array?

    RECT CardRect[36];
    

    Dann kannst du in der Behandlungroutine schreiben

    case WM_LBUTTONUP:
    
                //Mauskoordinaten in einem Punkt speichern
                POINT pt;
    
                pt.x = LOWORD( lParam );
                pt.y = HIWORD( lParam );
    
                for(i=0;i<36;++i)
                {
                    if( PtInRect( &rect[i], pt ) )
                        Direct3D.change_Card(i);
                }
    
                break;
    

    Was noch effizienter wäre: Alle Rechtecke in einer Region zusammenfassen. Dann kannst du erstmal abfragen, ob sich der Cursor in der Region befindet mit PtInRgn() (oder so ähnlich) und dann erst in die for-Schleife gehen.



  • Habe es jetzt folgendermaßen aufgebaut:

    case WM_LBUTTONUP:
    
    			//Mausklick-Zähler um 1 erhöhen
    			click_zaehler++;
    
    			//Mauskoordinaten in einem Punkt speichern
    			POINT pt;
    
    			pt.x = LOWORD( lParam );
    			pt.y = HIWORD( lParam );
    
    			//Ein Recheck definieren, welches dann immer verschoben wird
    			RECT rect;
    
    			rect.left	= 250;
    			rect.top	= 150;
    			rect.right	= 300;
    			rect.bottom = 200;
    
    			//Mit Hilfe einer For-Schleife Abfragen und das Rechteck verschieben
    			for(i=0;i<36;i++)
    			{
    				if(PtInRect( &rect, pt ))
    				{
    					Direct3D.change_Card(i);
    				}
    
    					//Rechteck verschieben
    					rect.left	+= 80;
    					rect.right	+= 80;
    
    					if(i == 5) //Wechsel in Zeile 2
    					{
    						rect.left	= 250;
    						rect.top	= 230;
    						rect.right	= 300;
    						rect.bottom = 280;
    					}
    					else if (i == 11) //Wechsel in Zeile 3
    					{
    						rect.left	= 250;
    						rect.top	= 310;
    						rect.right	= 300;
    						rect.bottom = 360;
    					}
    					else if (i == 17) //Wechsel in Zeile 4
    					{
    						rect.left	= 250;
    						rect.top	= 390;
    						rect.right	= 300;
    						rect.bottom = 440;
    					}
    					else if (i == 23) //Wechsel in Zeile 5
    					{
    						rect.left	= 250;
    						rect.top	= 470;
    						rect.right	= 300;
    						rect.bottom = 520;
    					}
    					else if (i == 29) //Wechsel in Zeile 6
    					{
    						rect.left	= 250;
    						rect.top	= 550;
    						rect.right	= 300;
    						rect.bottom = 600;
    					}; //if
    			}; //for
    break;
    

    Könnte das mit dem Rechteck-Array noch machen. Würde sich das noch sehr positiv auf die Performance des Programms auswirken?
    Wenn ja, dann baue ich das gerne ncoh ein.

    MfG
    Hundefutter



  • Hundefutter schrieb:

    Könnte das mit dem Rechteck-Array noch machen. Würde sich das noch sehr positiv auf die Performance des Programms auswirken?

    Naja, nicht wirklich merkbar. Aber trotzdem würde ich das so machen. Erstens wird der Code so besser lesbar und zweitens: wer weiß, wozu du die Rechtcke noch brauchst... Dann musst du wieder das Geschiebe da machen.



  • Alles klar, dann bau ich das noch um, vielen Dank für die Nützlichen Tipps.



  • Habe gerade noch nen paar Probleme beim Initialisieren der Rechtecke.
    Habe ein Array deklariert, in welches ich die Rechtecke packe:

    RECT Rechtecke[36];
    

    Jetzt möchte ich dem ersten Feld im Array die Koordinaten des ersten Rechtecks zuordnen, nur gibt mir der Compiler immer wieder Fehlermeldungen aus.
    Habe es mal so probiert:

    Rechtecke[0] = {250,150,300,200};
    

    Nur das kann ja eigentlich so nicht funktionieren, weil das ja so nur beim erstellen des Arrays verwendet wird, wenn ich das Array sofort beim Erstellen mit Werten füllen will.

    Stehe gerade irgendwie aufm schlauch, ist wahrscheinlich ganz simpel, habe aber vorher noch nicht mit Rechtecken gearbeitet.

    Normal ist es ja so:

    //entweder so
    int array[3] = {1,2,3};
    
    //oder so
    int array[3];
    
    array[1] = 1;
    array[2] = 2;
    array[3] = 3;
    

    Nur wie läuft es jetzt mit Rechtecken?
    Hoffe nochmal auf eure Hilfe 🙄

    MfG
    Hundefutter



  • Na entweder

    RECT Rechtecke[36] = {{250,150,300,200}, 
                          {...,...,...,...}, 
                          ..., 
                          {...,...,...,...}};
    

    oder

    RECT Rechtecke[36];
    
    Rechtecke[0].left   = 250;
    Rechtecke[0].top    = 150;
    Rechtecke[0].right  = 300;
    Rechtecke[0].bottom = 200;
    .
    .
    .
    

    oder

    RECT MakeRect(int l, int t, int r, int b)
    {
       RECT rc;
    
       rc.left = l;
       rc.top = t;
       rc.right = r;
       rc.bottom = b;
    
       return rc;
    }
    
    RECT Rechtecke[36];
    
    Rechtecke[0] = MakeRect(250,150,300,200);
    .
    .
    .
    

    was sicherlich der zweiten Methode vorzuziehen ist.



  • Alles klar, Danke!


Anmelden zum Antworten