Auswahl in TPaintBox auf Quadrat beschränken.
-
So also...
habe ein Programm geschrieben, welches ein Fraktal berechnet und habe dem Benutzer die Möglichkeit gegeben in dieses zu vergrößer, indem er einfach eine Auswahl direkt in der PaintBox macht.
Nun das klappt auch, aber die Auswahl sollte immer quadratisch sein, weil die PaintBox auch 500x500 ist.
Deshalb habe ich einfach die y-Werte angepasst:void __fastcall TForm1::PaintBox1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { xstart=xstart+X*incr; //PaintBox-Koord auf Real-Koord ystart=ystart+Y*incr; //xstarta entspricht der alten Auswahl //incr ist der derzeitige Zoom ... } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { xend=(xstarta+X*incr); //PaintBox-Koord auf Real-Koord yend=(ystarta+[b](xend-xstart))[/b]; ... DrawFraktal(xstart,ystart,xend,yend); } //---------------------------------------------------------------------------Jedoch könnte das ja den Benutzer verwirren, weil sich die Auswahl ja so nur nach dem X-Wert richtig...
Am Ellegantesten wäre es nartürlich, wenn man den Benutzer seine Auswahl gleich erkenntlich machen könnte, welche denn auch quadratisch bleibt.
Ich habe überlegt das mit Canvas zu machen, aber das ist ja Schwachsinn, weil dann das zuvor gezeichnete weggemacht wird
.Also.....
**Frage1:**Wie kann ich die Auswahl des Benutzers erkenntlich machen?
**Frage2:**Wie kann ich die Auswahl dazu zwingen quadratisch zu bleiben?Bin für jeden Tipp dankbar.
mfg
/Edit: Irgendwie funktionieren die C++ Code Tags nicht, deswegen habe ich die normalen genommen.
-
Beides im OnMouseMove, welches über eine boolsche Variable im OnMouseDown und OnMouseUP gesteuert wird. Im Handbuch zum Builder 6 ist dazu ein Beispiel
-
Ok danke für deinen Tipp, habe das Bsp. auch im Builder5 gefunden. Habe mich daran orientiert und es so gelöst:
TPoint pOrigin,pMove; void __fastcall TForm1::PaintBox1MouseDown(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y) { xstart=xstart+X*incr; ystart=ystart+Y*incr; pOrigin.x=X;pOrigin.y=Y; pMove.x =X;pMove.y =Y; Drawing=true; } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if(Drawing) { DrawRectAngle(pOrigin,pMove); //altes Rechteck verschwinden lassen pMove=Point(X,pOrigin.y+(pMove.x-pOrigin.x)); //neue Koord,y+(pMove.x-pOrigin.x)-->Zwang zum Quadrat DrawRectAngle(pOrigin,pMove); //neues zeichnen } } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y) { Drawing=false; xend=(xstarta+X*incr); yend=(ystarta+(xend-xstart)); DrawFraktal(xstart,ystart,xend,yend); } //--------------------------------------------------------------------------- void TForm1::DrawRectAngle(TPoint TopLeft, TPoint BottomRight) { PaintBox1->Canvas->Pen->Style=psSolid; PaintBox1->Canvas->Pen->Mode =pmNotXor; PaintBox1->Canvas->Rectangle(TopLeft.x, TopLeft.y, BottomRight.x, BottomRight.y); PaintBox1->Canvas->Pen->Mode =pmCopy; }Ist vllt nicht die elleganteste Methode, aber ich bin zufrieden damit, also vielen Dank nochmals
.