Hallo Allerseits.
Ich habe ein Problem mit der Abfrage ob sich die Maus ain einer Region, bzw. auf einer Geomtetrischen Figur befindet.
Bisher frage ich wie folgt ab:
private void MapControlRectangle_MouseDown(object sender, MouseEventArgs e)
{
if (_borderRegionPath.IsVisible(new Point(e.Y, e.X)))
{
_readyForAction = true;
this.Region = new Region(_borderRegionPath);
}
_startPosition = this.PointToScreen(e.Location);
_startLocation = this.Location;
}
Drehe ich nun aber die Figur mittels einer Matrix, so ist es schier unmöglich noch einmal die BorderRegion zu treffen.
Nach diversen klicken in und um(!) die eigentliche region schafft man es dann aber irgendwann einmal. Allerdings sehr unzufriedenstellend.
Weiss jemand Rat ?
Gruß und Danke schonmal 🙂
Birne
Hallo Birne,
vermutlich fährst du besser, wenn du die Punkte, die den Path ausmachen, drehst (Matrix.TransformPoints), bevor du den Path erstellst.
herbivore
Zunächst einmal danke für die Antwort.
Leider führt dieses nicht zum Erfolg, mag aber auch an meiner Ausführung liegen :\
Newbe ...
(Was nicht heissen soll dass ich mir noch keine lehrende Lektüre zu Gemüte geführt habe !)
mx.RotateAt(_angel, new Point(this.ClientSize.Width / 2, this.ClientSize.Height / 2), MatrixOrder.Append);
// mx ist die Matrix
Point ptPosition = new Point();
ptPosition.X = x;
ptPosition.Y = y;
Point ptSize = new Point();
ptSize.X = width;
ptSize.Y = height;
Point[] array = new Point[] { ptPosition, ptSize };
mx.TransformPoints(array);
// Oben
_graphicsPath.AddLine(x + cornerRadius, y, x + width - cornerRadius, y);
_regionPath.AddLine(x + cornerRadius - border, y - border, x + width - cornerRadius + border, y - border);
_borderRegionPath.AddLine(x + cornerRadius + halfBorderArea, y + halfBorderArea, x + width - cornerRadius - halfBorderArea, y + halfBorderArea);
// Ecke rechts oben
_graphicsPath.AddArc(x + width - cornerRadius, y, cornerRadius, cornerRadius, 270, 90);
_regionPath.AddArc(x + width - cornerRadius + border, y - border, cornerRadius, cornerRadius, 270, 90);
_borderRegionPath.AddArc(x + width - cornerRadius - halfBorderArea, y + halfBorderArea, cornerRadius, cornerRadius, 270, 90);
usw. usf.
Schlussendlich dann:
// Die Figur abschließen
_graphicsPath.CloseFigure();
_regionPath.CloseFigure();
_borderRegionPath.CloseFigure();
_graphicsPath.Transform(mx);
_regionPath.Transform(mx);
_borderRegionPath.Transform(mx);
meine Figur (viereck mit abgerundeten ecken) ist nun zwar etwas deformiert, doch reagiert noch immer nicht korrekt auf die Events.
Der Bereich auf Welchen reagiert wird, scheint nach dem Drehen der Figur, Derselbe zu sein, wie vor dem Drehen, also in einem winkelzustand von 0°.
Hallo Birne,
mein Vorschlag war, alle Punkte vor der Verwendung, also vor dem Hinzufügen zum Graphics.Path zu drehen.
herbivore
Wenn ich vorher
_graphicsPath.Transform(mx);
_regionPath.Transform(mx);
_borderRegionPath.Transform(mx);
aufrufe, so dreht sich das Objekt im Falle einer Winkeländerung nicht mehr.
Ansonsten werden alle benötigten Punkte welche ich in eine Array gepackt habe doch vorher gedreht oder nicht 🤔
Hallo Birne,
nochmal: Du sollst nicht den GraphicsPath drehen, sondern vorher die Punkte, die du zu dessen Erstellung verwendest. Dabei hilft dir das schon genannte Matrix.TransformPoints.
herbivore
Habe es nun dank deiner Hilfe mit einigem Gefrikkel hinbekommen =)
Danke für die Hilfe 👍
Thema kann geschlossen bzw als gelöst markiert werden.