Ich zeichne ein Rechteck in der Paint-Methode eines Steuerelements. Es gibt einen zu berücksichtigenden Zoomfaktor, z. Jedes positive Ereignis MouseWheel
bewirkt, dass das Steuerelement neu gezeichnet wird und das Rechteck wird größer. Jetzt zeichne ich eine Zeichenkette innerhalb dieses Rechtecks, aber ich konnte nicht herausfinden, wie man die Schriftgröße des Textes mit der Vergrößerung oder Schrumpfung des Rechtecks in Beziehung setzt, in dem sich der Text befinden soll.Dynamische Schriftgröße zum Zeichnen von Zeichenfolgen innerhalb eines Rechtecks
Hier ist einiger relevanter Teil meines Code:
public GateShape(Gate gate, int x, int y, int zoomFactor, PaintEventArgs p)
{
_gate = gate;
P = p;
StartPoint = new Point(x, y);
ShapeSize = new Size(20 + zoomFactor * 10, 20 + zoomFactor * 10);
Draw();
}
public Bitmap Draw()
{
#if DEBUG
Debug.WriteLine("Drawing gate '" + _gate.GetGateType() + "' with symbol '" + _gate.GetSymbol() + "'");
#endif
Pen pen = new Pen(Color.Red);
DrawingRect = new Rectangle(StartPoint.X, StartPoint.Y, ShapeSize.Width, ShapeSize.Height);
P.Graphics.DrawRectangle(pen, DrawingRect);
StringFormat sf = new StringFormat
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
using(Font font = new Font(FontFamily.GenericMonospace, 8)) //what to do here?
P.Graphics.DrawString(_gate.GetSymbol(), font, Brushes.Black, DrawingRect, sf);
return null;
}
Eine hartcodierte einfache Multiplikation mit dem Faktor Zoom bis zu einem gewissen, wie die Arbeit scheint aber dies ist nicht der cleverste Weg, nehme ich an. int size = 8 + _zoomFactor * 6;
Die beste Lösung, die ich je für dieses Problem gefunden wird, fordert wiederholt zu 'MeasureString', die Schriftgröße einzustellen, bis Sie direkt unter der max Größe sind, das passt. – Blorgbeard
Oder Sie können mit dem Mausrad die Schriftgröße beeinflussen und das Rechteck um den Text herum zeichnen, anstatt umgekehrt. – Blorgbeard
@Blorgbeard Vielen Dank für den Tipp. Ich bin sicher, es wird funktionieren. Aber ich frage mich, ob HansPassant eine Lösung hat: D –