Sto disegnando un rettangolo nel metodo di disegno di un controllo. C'è un fattore di zoom da considerare, ad es. ogni evento positivo MouseWheel
provoca la ripetizione del controllo e quindi il rettangolo si ingrandisce. Ora sto disegnando una stringa all'interno di questo rettangolo, ma non sono riuscito a capire come correlare la dimensione del carattere del testo alla crescita o al restringimento del rettangolo che il testo dovrebbe essere al suo interno.Dimensione carattere dinamico per tracciare una stringa all'interno di un rettangolo
Ecco una parte rilevante del mio codice:
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;
}
una semplice moltiplicazione hardcoded per il fattore di zoom sembra un po 'come il lavoro, ma questo non è il modo più intelligente suppongo. int size = 8 + _zoomFactor * 6;
La soluzione migliore che abbia mai trovato per questo problema si ripete chiamate al 'MeasureString', regolare le dimensioni dei caratteri fino a quando sei appena sotto la dimensione massima che si adatta. – Blorgbeard
Oppure, la rotellina del mouse potrebbe influire sulla dimensione del carattere e disegnare il rettangolo attorno al testo anziché viceversa. – Blorgbeard
@Blorgbeard Grazie mille per il suggerimento. Sono sicuro che funzionerà. Ma mi chiedo se HansPassant abbia una soluzione: D –