2015-05-19 44 views
5

我正在绘制控件的绘制方法中的矩形。有一个缩放因子需要考虑,例如每个积极的MouseWheel事件导致控件重绘,然后矩形变大。现在我正在这个矩形内绘制一个字符串,但我无法弄清楚如何将文本的字体大小与文本应该放在其中的矩形的增长或缩小联系起来。在矩形内绘制字符串的动态字体大小

下面是我的一些代码相关部分:

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; 
} 

缩放因数硬编码的简单的乘法,似乎有些怎样的工作,但这不是我想最聪明的办法。 int size = 8 + _zoomFactor * 6;

+3

我没有发现这个问题的最佳解决方案是重复'MeasureString'通话,调整字体大小,直到你刚下适合的最大尺寸。 – Blorgbeard

+2

或者,您可以使用鼠标滚轮来影响字体大小,并在文本周围绘制矩形而不是反过来。 – Blorgbeard

+0

@Blorgbeard非常感谢小费。我相信它会起作用。但我不知道HansPassant是否有解决方案:D –

回答

4

尝试使用Graphics.ScaleTransform方法来应用您的缩放系数。

例子:

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