System.Drawing.Pen 错误?
我是新来的,所以我希望我的消息能够被清楚地编辑...
我试图在这里向您展示一张非常解释性的图片,但新用户不允许发布图片。好吧,用文字来说:打印在纸上或 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是我编译时你的程序显示的内容:
抱歉,我明白你在说什么。打印时,图像如下所示:
Tim Bourguignon 的答案似乎是正确的。
Here is what your program showed when i compiled it:
Sorry, i see what you are talking about. When printed, image looks like this:
Tim Bourguignon's answer seems correct.
不知何故,如果将 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
?