2015-05-19 35 views
5

Bir denetimin boya yönteminde bir dikdörtgen çiziyorum. Göz önünde bulundurulması gereken bir yakınlaştırma faktörü vardır, örn. Her pozitif MouseWheel olayı, denetimin yeniden çizilmesine neden olur ve sonra dikdörtgen büyür. Şimdi bu dikdörtgenin içinde bir dize çiziyorum, ancak metnin yazı tipi boyutunu metnin içinde olması beklenen dikdörtgenin büyümesine veya küçülmesine nasıl bağlayacağımı anlayamadım. yakınlaştırma faktörü ile bir kodlanmış basit çarpma bazı nasıl işe görünüyor ama bu varsayalım akıllı yol değildirBir dikdörtgenin içine dize çizmek için dinamik yazı tipi boyutu

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

: Burada

kodumu bazıları alakalı bir parçasıdır. int size = 8 + _zoomFactor * 6;

+3

Ben hiç bu sorun için bulunan en iyi çözüm yazı tipi boyutunu ayarlayarak, MeasureString' 'çağrıları tekrarlanır. – Blorgbeard

+2

Ya da, fare tekerleğinin yazı tipi boyutunu etkileyebilir ve bunun tersine metin yerine dikdörtgeni çizebilirsiniz. – Blorgbeard

+0

@Blorgbeard Bahşiş için çok teşekkürler. Eminim işe yarayacak. Ama merak ediyorum ki HansPassant'ın bir çözümü var: D –

cevap

4

Zoom faktörünü uygulamak için Graphics.ScaleTransform yöntemini kullanmayı deneyin.

Örnek: Sadece uyan maksimum boyutu altında oluncaya kadar

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) 
} 
İlgili konular