Also, wenn ich das richtig sehe, legst du in CalculateRect fest, welches Rechteck von deinem smallrect Objekt benutzt werden soll. Diese Berechnung findet in Draw_small_rect implizit statt.
Wenn du auf diese Weise mehrere Quadrate zeichnest, hast du lediglich die letzen Koordinaten noch zur Verfügung, d.h. wenn du direkt nach dem Zeichnen gleich Delete_small_rect aufrufst, und dort die schon berechneten Koordinaten benutzt, wird das letze Rechteck wieder gelöscht.
Das gilt aber nur unter der Voraussetzung, dass du in der Implementation der Draw Methode nicht nochmal eine Instanz der eigenen Klasse anlegst. (das ist in der Tat nicht nötig und allermeistens sogar ungeschickt) Dort kannst du die CalculateRect Methode direkt aufrufen und muss dann natürlich auch das eigene rect_to_draw benutzen.
Wenn du pro smallrect Objekt auch immer nur ein Quadrat zeichnest, kannst du dir auf diese Weise alle Positionen von Quadraten merken und diese dann hinterher auch gezielt wieder löschen, wenn du darauf klickst. Du musst dann nur alle deine smallrects durchsuchen ob die Mausposition im Quadrat liegt und z.B. beim ersten gefundenen die Delete Methode aufrufen.
Also in Pseudocode:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
void smallrect::DrawOnce ()
{
ComputeRect ();
Draw ();
}
bool smallrect::PointIsInside (int x, int y)
{
return rect_to_draw.contains (x, y);
}
void OnClick (int x, int y)
{
for (draw_rect in all_smallrect)
{
if (draw_rect.PointIsInside (x, y))
draw_rect.Erase ();
}
}
|
Für jedes Rechteck, dass gezeichnet werden soll, ruft man hier einmal DrawOne auf; im Gegensatz zu einem smallrect, dass bei jedem Draw sein Rechteck neu festlegt. Mit der zweiten Variante ist dein Problem so erstmal nicht zu lösen, ausser du merkst dir dort auch noch alle Quadrate, die du gezeichnet hast (als eigene Objekte), um diese dann hinterher wieder zu löschen.
MfG,
Rainer