Hallo,
als relativer Neuling wollte ich mich darin üben etwas in die PaintBox zu zeichnen und diese Grafik in Richtung Mauszeiger bewegen wenn die Maustaste gedrückt und gehalten wird. Die Bewegung scheint soweit zu funktionieren, jedoch wird die PaintBox nicht nach jedem Bewegungsschritt aktualisiert, sondern nur nach dem verändern des Formulars.
Ausserdem Frage ich mich ob es nicht auch elegantere Lösungen für sowas gibt.
Hier mein Testcode (sollte ersichtlich sein wenns aktualisiert werden soll, im übrigen ist die Grafik ein Dreieck, was die Variablen besser verstehen lässt (auch wenns hier nicht wichtig ist)):
int SpitzeX = 15;
int SpitzeY = 50;
int LinksX = 30;
int LinksY = 1;
int RechtsX = 1;
int RechtsY = 1;
int *TempX = NULL;
int *TempY = NULL;
bool a = NULL;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1:
aintBox1Paint(TObject *Sender)
{
PaintBox1->Canvas->MoveTo(SpitzeX,SpitzeY);
PaintBox1->Canvas->LineTo(LinksX,LinksY);
PaintBox1->Canvas->LineTo(RechtsX,RechtsY);
PaintBox1->Canvas->LineTo(SpitzeX,SpitzeY);
}
//---------------------------------------------------------------------------
void __fastcall TForm1:
aintBox1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
a = true; // "maustaste gedrückt"-status speichern
TempX = &X;
TempY = &Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1:
aintBox1Click(TObject *Sender)
{
a = false; // maustaste wird losgelassen
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (a) // nur wenn maustaste gedrückt
{
if (1) // zum testen erstmal ohne bedingung
{
SpitzeX = *TempX-SpitzeX-1;
LinksX = *TempX-LinksX-1;
RechtsX = *TempX-RechtsX-1;
}
// Paint(); löst hier kein OnPaint für die PaintBox aus, was nun ? <------
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1:
aintBox1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if (a) // nur wenn maustaste gedrückt
{
TempX = &X;
TempY = &Y;
}
}
//--------------------------------------------------------------------------
vielen Dank im Vorraus und btw., kann ich im Post die Leerzeichen irgendwie erhalten, ist deshalb bissl unübersichtlich
Hab "Repaint()" gefunden, womit sich die Sache erledigt hat. Mittlerweile weiss ich auch das der Code ziemlich schrottich ist :/
als relativer Neuling wollte ich mich darin üben etwas in die PaintBox zu zeichnen und diese Grafik in Richtung Mauszeiger bewegen wenn die Maustaste gedrückt und gehalten wird. Die Bewegung scheint soweit zu funktionieren, jedoch wird die PaintBox nicht nach jedem Bewegungsschritt aktualisiert, sondern nur nach dem verändern des Formulars.
Ausserdem Frage ich mich ob es nicht auch elegantere Lösungen für sowas gibt.
Hier mein Testcode (sollte ersichtlich sein wenns aktualisiert werden soll, im übrigen ist die Grafik ein Dreieck, was die Variablen besser verstehen lässt (auch wenns hier nicht wichtig ist)):
int SpitzeX = 15;
int SpitzeY = 50;
int LinksX = 30;
int LinksY = 1;
int RechtsX = 1;
int RechtsY = 1;
int *TempX = NULL;
int *TempY = NULL;
bool a = NULL;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1:

{
PaintBox1->Canvas->MoveTo(SpitzeX,SpitzeY);
PaintBox1->Canvas->LineTo(LinksX,LinksY);
PaintBox1->Canvas->LineTo(RechtsX,RechtsY);
PaintBox1->Canvas->LineTo(SpitzeX,SpitzeY);
}
//---------------------------------------------------------------------------
void __fastcall TForm1:

TMouseButton Button, TShiftState Shift, int X, int Y)
{
a = true; // "maustaste gedrückt"-status speichern
TempX = &X;
TempY = &Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1:

{
a = false; // maustaste wird losgelassen
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (a) // nur wenn maustaste gedrückt
{
if (1) // zum testen erstmal ohne bedingung
{
SpitzeX = *TempX-SpitzeX-1;
LinksX = *TempX-LinksX-1;
RechtsX = *TempX-RechtsX-1;
}
// Paint(); löst hier kein OnPaint für die PaintBox aus, was nun ? <------
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1:

TShiftState Shift, int X, int Y)
{
if (a) // nur wenn maustaste gedrückt
{
TempX = &X;
TempY = &Y;
}
}
//--------------------------------------------------------------------------
vielen Dank im Vorraus und btw., kann ich im Post die Leerzeichen irgendwie erhalten, ist deshalb bissl unübersichtlich

Hab "Repaint()" gefunden, womit sich die Sache erledigt hat. Mittlerweile weiss ich auch das der Code ziemlich schrottich ist :/
Zuletzt bearbeitet: