System.Drawing.Pen 错误?

发布于 2024-12-19 23:46:36 字数 3109 浏览 4 评论 0原文

我是新来的,所以我希望我的消息能够被清楚地编辑...

我试图在这里向您展示一张非常解释性的图片,但新用户不允许发布图片。好吧,用文字来说:打印在纸上或 PDF 上时,我会画 3 条 10 厘米的线。然而在屏幕上,中间线应该看起来与最低线相同。它们之间的唯一区别是 Width 属性。第一条红线宽度为 0.1 毫米,第二条红线宽度为 0.5 毫米。

我给两条红线指定的 DashPattern 为:4 毫米破折号 - 1 毫米空格 - 1 毫米破折号 - 1 毫米空格。

正如我所写;打印出来的时候,红线上的虚线图案是一模一样的! 我认为当图形显示在屏幕上时这是一个错误,但也许我遗漏了一些东西...下面您将找到要复制/粘贴的 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;
  }


}

I'm new here so I hope my message will be clearly editted...

I tried to show you a very explaining picture here, but new users are not allowed to post images. Well, in words then: I draw 3 lines of exactly 10 centimeter when printed on paper or to PDF. However on screen, the middle line should look the same as the lowest line. The only difference between them is the Width property. The first red line .Width is 0.1 millimeter and the second red line .Width is 0.5 millimeter.

I give both red lines a DashPattern of: 4mm dash- 1mm space - 1mm dash - 1mm space.

As I wrote; when printed, the Dash pattern is exactly the same on the red lines!
I think it's a bug when the graphics are shown on screen, but maybe I'm missing something... Below you'll find the complete code for a C# sample project to copy/paste.

Thanks in advance!

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;


    // 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;
  }


}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

满意归宿 2024-12-26 23:46:37

这是我编译时你的程序显示的内容:在此处输入图像描述

抱歉,我明白你在说什么。打印时,图像如下所示:在此处输入图像描述

Tim Bourguignon 的答案似乎是正确的。

Here is what your program showed when i compiled it:enter image description here

Sorry, i see what you are talking about. When printed, image looks like this:enter image description here

Tim Bourguignon's answer seems correct.

孤独患者 2024-12-26 23:46:36

不知何故,如果将 ThinPenRed 的厚度值更改为 >= 0.4f,您将在屏幕和打印上获得相同的图案。除以w时会出现舍入问题吗?

Somehow, if you change the thickness value of the thinPenRed to anything >= 0.4f, you will get the same pattern both on screen and on print. Can it be a rounding issue when dividing by w?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文