2015-05-19 25 views
5

Tôi vẽ một hình chữ nhật trong phương pháp sơn của một điều khiển. Có một yếu tố thu phóng để xem xét, ví dụ: mỗi tích cực MouseWheel sự kiện gây ra sự kiểm soát để sơn lại và sau đó hình chữ nhật được lớn hơn. Bây giờ tôi đang vẽ một chuỗi bên trong hình chữ nhật này, nhưng tôi không thể tìm ra cách liên kết kích thước phông chữ của văn bản với sự tăng trưởng hoặc co rút của hình chữ nhật mà văn bản được cho là nằm bên trong nó.cỡ chữ động để vẽ chuỗi bên trong một hình chữ nhật

Dưới đây là một số phần liên quan của mã của tôi:

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

Một nhân đơn giản hóa cứng bởi các yếu tố zoom dường như một số cách làm việc nhưng điều này không phải là cách thông minh nhất tôi giả. int size = 8 + _zoomFactor * 6;

+3

Giải pháp tốt nhất mà tôi từng được tìm thấy cho vấn đề này được lặp đi lặp lại các cuộc gọi cho 'MeasureString', điều chỉnh kích thước font chữ cho đến khi bạn ngay dưới kích thước tối đa phù hợp. – Blorgbeard

+2

Hoặc, bạn có thể có con lăn chuột ảnh hưởng đến kích thước phông chữ và vẽ hình chữ nhật xung quanh văn bản thay vì ngược lại. – Blorgbeard

+0

@Blorgbeard Cảm ơn rất nhiều về mẹo. Tôi chắc chắn nó sẽ hoạt động. Nhưng tôi tự hỏi nếu HansPassant có một giải pháp: D –

Trả lời

4

Hãy thử sử dụng các phương pháp Graphics.ScaleTransform để áp dụng yếu tố zoom của bạn.

Ví dụ:

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) 
} 
Các vấn đề liên quan