2011-10-14 18 views
5

Sto facendo un disegno personalizzato utilizzando GDI +.Alternativa a Graphics.ScaleTransform

Normalmente, se voglio andare bene tutto quello che sto disegnando alla finestra, ho calcolare il rapporto appropriato e io ScaleTransform tutto con quel rapporto:

e.Graphics.ScaleTransform(ratio, ratio); 

Il problema con ScaleTransform è che le scale tutto, compreso tratti di penna e pennelli

Esiste un metodo semplice per ridimensionare tutte le coordinate pixel di ciò che sto disegnando? Ogni linea, rettangolo o percorso è fondamentalmente una serie di punti. Quindi posso moltiplicare manualmente tutti i punti per il rapporto, ma esiste un'alternativa facile per farlo in modo più uniforme?

risposta

1

si può avvolgere la grafica GDI oggetto e memorizzare il fattore di scala

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

Si noti che se si desidera evitare il ridimensionamento solo perché si desidera ottenere linee sottili (1 pixel), è possibile disegnare con uno spessore di -1 per forzare una singola linea di pixel indipendentemente dalla scala. –

1

Penso che ScaleTransform funzioni su ogni valore numerico a cui è interessato il contesto GDI, quindi non è possibile utilizzarlo solo per le coordinate, sfortunatamente. WPF ha un GeometryTransform ma non conosco un equivalente in GDI +.

Se si è preoccupati della duplicazione del codice, è sempre possibile scrivere un metodo di utilità per disegnare le forme con un determinato livello di scala applicato ai relativi punti.

Si potrebbe anche provare a invertire manualmente il ScaleTransform applicando l'inverso di esso a tutti gli oggetti che non si desidera ridimensionare; So che alcuni pennelli espongono questo metodo.

2

Provare prima a mettere tutti gli oggetti in un'istanza GraphicsPath. Non ha un metodo ScaleTransform ma è possibile trasformare gli oggetti con GraphicsPath.Transform. È possibile passare una matrice di ridimensionamento tramite Matrix.Scale.

+0

Sembra che funzioni, tuttavia, un GraphicsPath non può disegnare un'immagine e le immagini sono una delle cose principali che non voglio ridimensionare. –

0

Fortunatamente, penna ha uno ScaleTransform locale che inversa ridimensionamento può essere fatto per compensare la globale trasformazione. Pen.ResetTransform dopo l'utilizzo di ogni riscalatura prima del prossimo, o il ridimensionamento della penna corrente (indipendente dal contesto grafico) può ridursi a quasi nulla (in realtà, un pixel), sparare alla luna o punti a metà strada.