Ошибка System.Drawing.Pen?

Я здесь новенький, поэтому надеюсь, что мое сообщение будет четко отредактировано...

Я пытался показать вам очень поясняющую картинку здесь, но новым пользователям не разрешено публиковать изображения. Ну на словах тогда: рисую 3 линии ровно по 10 сантиметров при печати на бумаге или в PDF. Однако на экране средняя линия должна выглядеть так же, как и самая нижняя. Единственная разница между ними заключается в свойстве Width. Первая красная линия. Ширина 0,1 миллиметра, а вторая красная линия. Ширина 0,5 миллиметра.

Я даю обеим красным линиям DashPattern: 4 мм тире - 1 мм пробел - 1 мм тире - 1 мм пробел.

Как я писал; при печати узор Dash точно такой же на красных линиях! Я думаю, что это ошибка, когда графика отображается на экране, но, возможно, я что-то упускаю... Ниже вы найдете полный код примера проекта C# для копирования/вставки.

Заранее спасибо!

Павел

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;


    // add panel on form
    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);

    // add print button on form
    Button butPrint = new Button();
    butPrint.Size = new Size(72, 28);
    butPrint.Location = new Point(510, 20);
    butPrint.Text = "Print";
    butPrint.Click += new System.EventHandler(this.butPrint_Click);
    this.Controls.Add(butPrint);

    // add printpage handler
    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;
    // The length of each dash and space in the dash pattern is the product of the element value in the array and the width of the Pen
    // so divide float by penWidth
    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);

    // now, a wider pen
    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;
  }


}

person Paul H.    schedule 07.12.2011    source источник
comment
Почему вы говорите о метрических единицах при рисовании на экране? Когда вы говорите мм, вы имеете в виду пиксель   -  person CodesInChaos    schedule 07.12.2011


Ответы (2)


Каким-то образом, если вы измените значение толщины thinPenRed на что-либо >= 0,4f, вы получите один и тот же узор как на экране, так и при печати. Может ли быть проблема округления при делении на w?

person Timothée Bourguignon    schedule 07.12.2011

Вот что показала ваша программа, когда я ее скомпилировал:введите здесь описание изображения

Извините, я вижу, о чем вы говорите. При печати изображение выглядит так:введите здесь описание изображения

Ответ Тима Бургиньона кажется правильным.

person weegth    schedule 07.12.2011
comment
Теперь, если вы попытаетесь распечатать его (например, в формате pdf), вы заметите, что две красные линии имеют одинаковый рисунок в документе, причем вторая толще первой. - person Timothée Bourguignon; 07.12.2011
comment
Спасибо Тим за картинки. Мне не разрешили (пока) загружать их. Действительно странно, что ширина пера 0,395 мм действует совершенно иначе, чем ширина пера 0,4 мм (на экране!). Причина, по которой я хочу использовать миллиметры, заключается в том, что линейные результаты предназначены для печати. На экране я хочу WYSIWYG... - person Paul H.; 07.12.2011
comment
Хм... Не очень хороший обходной путь может состоять в том, чтобы разделить g.PageScale на 10 (и установить его равным 0,1 вместо 1,0) и умножить значение каждого миллиметра на 10. - person Paul H.; 07.12.2011