2015-05-19 10 views
5

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;

+3

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

+2

Oppure, la rotellina del mouse potrebbe influire sulla dimensione del carattere e disegnare il rettangolo attorno al testo anziché viceversa. – Blorgbeard

+0

@Blorgbeard Grazie mille per il suggerimento. Sono sicuro che funzionerà. Ma mi chiedo se HansPassant abbia una soluzione: D –

risposta

4

Provare a utilizzare il metodo Graphics.ScaleTransform per applicare il fattore di zoom.

Esempio:

public GateShape(Gate gate, int x, int y, float zoomFactor, PaintEventArgs p) 
{ 
    _gate = gate; 
    P = p; 
    StartPoint = new Point(x, y); 
    ShapeSize = new Size(20, 20); 
    ZoomFactor = zoomFactor; 
    Draw(); 
} 

public Bitmap Draw() 
{ 
    P.Graphics.ScaleTransform(ZoomFactor, ZoomFactor); 
    ... 
    // The rest of rendering logic should be the same (as is previously written) 
} 
Problemi correlati