2015-05-19 9 views
5

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;

+3

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

+2

Oder Sie können mit dem Mausrad die Schriftgröße beeinflussen und das Rechteck um den Text herum zeichnen, anstatt umgekehrt. – Blorgbeard

+0

@Blorgbeard Vielen Dank für den Tipp. Ich bin sicher, es wird funktionieren. Aber ich frage mich, ob HansPassant eine Lösung hat: D –

Antwort

4

Verwenden Sie die Methode Graphics.ScaleTransform, um den Zoomfaktor anzuwenden.

Beispiel:

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) 
} 
Verwandte Themen