2 votes

Système.Graphique.Stylo bug?

Je suis nouveau ici donc j'espère que mon message sera clairement édité...

J'ai essayé de vous montrer une image très explicative ici, mais les nouveaux utilisateurs ne sont pas autorisés à publier des images. Eh bien, en mots alors : je trace 3 lignes de exactement 10 centimètres lorsqu'elles sont imprimées sur du papier ou en PDF. Cependant, à l'écran, la ligne du milieu devrait ressembler à la ligne du bas. La seule différence entre elles est la propriété Width. La première ligne rouge .Width est de 0,1 millimètre et la deuxième ligne rouge .Width est de 0,5 millimètre.

Je donne à ces deux lignes rouges un DashPattern de : 4mm tiret - 1mm espace - 1mm tiret - 1mm espace.

Comme je l'ai écrit ; quand c'est imprimé, le motif de tiret est exactement le même sur les lignes rouges ! Je pense que c'est un bug lorsque les graphiques sont affichés à l'écran, mais peut-être que je rate quelque chose... Ci-dessous vous trouverez le code complet pour un projet d'exemple C# à copier/coller.

Merci d'avance !

Paul

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Printing;

public partial class Form1 : Form
{
  PrintDialog dialog1 = new PrintDialog();
  PrintDocument printdocument1 = new PrintDocument();

  public Form1()
  {
    this.Text = "System.Drawing.Pen:  Bug?";
    this.Width = 600;
    this.Height = 400;

    // ajouter un panneau sur le formulaire
    Panel panel1 = new Panel();
    panel1.Width = 500;
    panel1.Height = 300;
    panel1.BackColor = Color.White;
    panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);
    this.Controls.Add(panel1);

    // ajouter un bouton d'impression sur le formulaire
    Button butPrint = new Button();
    butPrint.Size = new Size(72, 28);
    butPrint.Location = new Point(510, 20);
    butPrint.Text = "Imprimer";
    butPrint.Click += new System.EventHandler(this.butPrint_Click);
    this.Controls.Add(butPrint);

    // ajouter un gestionnaire pour la page d'impression
    this.printdocument1.PrintPage += new PrintPageEventHandler(this.printdocument1_PrintPage);
  }

  private void makeSomeGraphics(Graphics g)
  {
    g.Clear(Color.White);
    //g.SmoothingMode = SmoothingMode.AntiAlias;

    g.PageUnit = GraphicsUnit.Millimeter;
    g.PageScale = 1.0f;

    Pen thinPenBlack = new Pen(Brushes.Black, 0.1f);  // penWidth = 0.1mm
    Pen thinPenRed = new Pen(Brushes.Red, 0.1f);      // penWidth = 0.1mm
    Pen thickPenRed = new Pen(Brushes.Red, 0.5f);     // penWidth = 0.5mm

    float y = 20.0f;
    thinPenBlack.DashStyle = DashStyle.Solid;
    g.DrawLine(thinPenBlack, 10, y, 110, y);

    y = 30.0f;
    // La longueur de chaque tiret et espace dans le motif de tirets est le produit de la valeur de l'élément dans le tableau et de la largeur du Pen
    // donc divisez un float par la largeur du stylo
    float w = thinPenRed.Width;
    thinPenRed.DashPattern = new float[] { 4.0f / w, 1.0f / w, 1.0f / w, 1.0f / w };
    g.DrawLine(thinPenRed, 10, y, 110, y);

    // maintenant, un stylo plus large
    y = 40.0f;
    w = thickPenRed.Width;
    thickPenRed.DashPattern = new float[] { 4.0f / w, 1.0f / w, 1.0f / w, 1.0f / w };
    g.DrawLine(thickPenRed, 10, y, 110, y);
  }

  private void panel1_Paint(object sender, PaintEventArgs e)
  {
    makeSomeGraphics(e.Graphics);
  }

  private void butPrint_Click(object sender, EventArgs e)
  {
    dialog1.UseEXDialog = true;
    dialog1.Document = printdocument1;
    if (dialog1.ShowDialog() == DialogResult.OK)
    {
      printdocument1.Print();
    }
  }

  private void printdocument1_PrintPage(object sender, PrintPageEventArgs e)
  {
    makeSomeGraphics(e.Graphics);
    e.HasMorePages = false;
  }

}

2voto

Tim Bourguignon Points 813

D'une certaine manière, si vous modifiez la valeur d'épaisseur du thinPenRed à >= 0.4f, vous obtiendrez le même motif à l'écran et à l'impression. Est-ce un problème d'arrondi lors de la division par w?

0voto

weegth Points 41

Voici ce que votre programme a affiché lorsque je l'ai compilé : entrer la description de l'image ici

Désolé, je vois de quoi vous parlez. Lorsqu'il est imprimé, l'image ressemble à ceci : entrer la description de l'image ici

La réponse de Tim Bourguignon semble correcte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X