2009-08-27 9 views
11

Necesito dibujar una línea de una pulgada de largo en cualquier dispositivo con una referencia Graphics. Necesito que sea una pulgada de largo independientemente de en qué se configure Transform. Supongamos que el factor de escala de la transformación viene dado por scale en ambas direcciones horizontal y vertical.GDI +: ¿Cómo se dibuja una línea de una pulgada de longitud en cualquier dispositivo en el que se dibuje?

Algunos código C++/CLI:

g->DrawLine(Pens::Black, 50.0f, 50.0f, 50.0f + oneInchEquivalent/scale, 50.0f); 

Ahora que no fue difícil en absoluto! Ahora todo lo que tenemos que hacer es calcular oneInchEquivalent.

g->DpiX me da una distancia de lo que parece una pulgada en la pantalla, pero no en la impresora. Parece que en las impresoras, dibujar una línea de 100 unidades con g->PageUnit configurado en GraphicsUnit :: Display me dará una línea de una pulgada de largo. Pero, realmente necesito que esto funcione independientemente de la configuración PageUnit. ¡De hecho, cambiar PageUnit cambiará el ancho del bolígrafo!

Edité: He aceptado tentativamente la única respuesta aquí, ya que está muy cerca de lo que estoy buscando.

+0

He actualizado mi respuesta ahora con una muestra de impresión –

Respuesta

12

La respuesta se hizo bastante largo después de un par de ediciones, por lo que aquí es el resultado final:

Al establecer la propiedad PageUnit del objeto Graphics-GraphicsUnit.Pixel y tomando en multiplicar las coordenadas con los valores DPix y DpiY hará que la resultado esperado tanto en la pantalla como en los dispositivos de la impresora.

private static void DrawInchLine(Graphics g, Color color, Point start, Point end) 
{ 
    GraphicsUnit originalUnit = g.PageUnit; 
    g.PageUnit = GraphicsUnit.Pixel; 
    using (Pen pen = new Pen(color, 1)) 
    { 
     g.DrawLine(pen, 
      start.X * g.DpiX, 
      start.Y * g.DpiY, 
      end.X * g.DpiX, 
      end.Y * g.DpiY); 
    } 
    g.PageUnit = originalUnit; 
} 

Usted puede tener que pintar en un formulario (o algún tipo de control):

using (Graphics g = this.CreateGraphics()) 
{ 
    Point start = new Point(1, 1); 
    Point end = new Point(2, 1); 
    DrawInchLine(g, Color.Black, start, end); 
} 

... o envíe la salida a una impresora:

PrintDialog dialog = new PrintDialog(); 
if (dialog.ShowDialog() == DialogResult.OK) 
{ 
    PrintDocument pd = new PrintDocument(); 
    pd.PrinterSettings = dialog.PrinterSettings; 
    pd.PrintPage += (psender, pe) => 
    { 
     Point start = new Point(1, 1); 
     Point end = new Point(2, 1); 
     DrawInchLine(pe.Graphics, Color.Black, start, end); 
     pe.HasMorePages = false; 
    }; 

    pd.Print(); 
} 

Esto lo hace sin embargo, , confíe en configurar el PageUnit.

+0

Puede probar CutePDF para un emulador de impresora. Puedes ver las diferencias allí. –

+0

Me acabo de dar cuenta de que tengo una impresora parada aquí; intentado imprimir en él; salió exactamente a una pulgada. Se actualizará con el código. –

+0

Gracias Fredrik, pero necesito hacer esto usando solo Matemáticas, sin cambiar la configuración de la Página_Unit. Cambiar PageUnit afectará el ancho del lápiz. Ver la última parte de mi pregunta. –

Cuestiones relacionadas