2011-10-14 33 views
5

Tôi đang vẽ bản vẽ tùy chỉnh bằng GDI +.Thay thế cho Graphics.ScaleTransform

Thông thường nếu tôi muốn để phù hợp với bất cứ điều gì tôi đang vẽ lại cửa sổ, tôi tính toán tỷ lệ thích hợp và tôi ScaleTransform tất cả mọi thứ bằng tỷ lệ đó:

e.Graphics.ScaleTransform(ratio, ratio); 

Vấn đề với ScaleTransform là nó quy mô tất cả mọi thứ bao gồm cả nét bút và bàn chải.

Có phương pháp dễ dàng để nhân rộng tất cả tọa độ pixel của những gì tôi đang vẽ không? Mỗi dòng, hình chữ nhật hoặc đường dẫn về cơ bản là một loạt các điểm. Vì vậy, tôi có thể nhân tất cả các điểm đó theo tỷ lệ theo cách thủ công, nhưng có cách nào khác dễ dàng để thực hiện điều này liền mạch hơn không?

Trả lời

1

Bạn có thể quấn đối tượng đồ họa GDI và lưu trữ các yếu tố quy mô

interface IDrawing 
{ 
    void Scale(float sx, float sy); 
    void Translate(float dx, float dy); 
    void SetPen(Color col, float thickness); 
    void DrawLine(Point from, Point to); 
    // ... more methods 
} 

class GdiPlusDrawing : IDrawing 
{ 
    private float scale; 
    private Graphics graphics; 
    private Pen pen; 

    public GdiPlusDrawing(Graphics g) 
    { 
     float scale = 1.0f; 
    } 

    public void Scale(float s) 
    { 
     scale *= s; 
     graphics.ScaleTransform(s,s); 
    } 

    public void SetPen(Color color, float thickness) 
    { 
     // Use scale to compensate pen thickness. 
     float penThickness = thickness/scale; 
     pen = new Pen(color, penThickness); // Note, need to dispose. 
    } 

    // Implement rest of IDrawing 
} 
+2

Lưu ý rằng nếu bạn chỉ muốn tránh chia tỷ lệ vì bạn muốn các đường mỏng (1 pixel), bạn có thể vẽ với độ dày -1 để buộc một đường pixel đơn lẻ bất kể tỷ lệ. –

1

Tôi nghĩ rằng ScaleTransform hoạt động trên mọi giá trị số mà bối cảnh GDI có liên quan, vì vậy bạn không thể chỉ sử dụng nó cho tọa độ, thật không may. WPF có một GeometryTransform nhưng tôi không biết tương đương với nó trong GDI +.

Nếu bạn lo ngại về sao chép mã, bạn luôn có thể viết phương pháp tiện ích để vẽ hình dạng với một mức quy mô nhất định được áp dụng cho điểm của chúng.

Bạn cũng có thể thử đảo ngược thủ công ScaleTransform bằng cách áp dụng nghịch đảo của nó cho bất kỳ đối tượng nào bạn không muốn chia tỷ lệ; Tôi biết một số bàn chải phơi bày phương pháp này.

2

Thử đặt tất cả các đối tượng của bạn vào một trường hợp GraphicsPath trước tiên. Nó không có phương thức ScaleTransform nhưng bạn có thể chuyển đổi các đối tượng bằng GraphicsPath.Transform. Bạn có thể chuyển ma trận tỷ lệ qua Matrix.Scale.

+0

Nghe có vẻ như nó có thể làm việc tuy nhiên một GraphicsPath không thể vẽ một hình ảnh và hình ảnh là một trong những điều chính tôi không muốn thu nhỏ. –

0

May mắn thay, Pen có một ScaleTransform địa phương mà ngược rescaling có thể được thực hiện để bù đắp cho sự toàn cầu biến đổi. Pen.ResetTransform sau khi sử dụng từng rescaling trước khi tiếp theo, hoặc quy mô bút hiện tại (độc lập với bối cảnh đồ họa) có thể thu nhỏ gần như không có gì (thực tế, một pixel), chụp tới mặt trăng hoặc điểm giữa chừng.