Mauskoordinaten komfortabel abfragen ?
-
Ok.
So ist das ganze natürlich schon viel kürzer und komfortabler.Wenn das jetzt noch zu steigern ist, bitte melden.
Nochmals vielen Dank für die Hilfen.
MfG
Hundefutter
-
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!