2

私はここに来たばかりなので、メッセージが明確に編集されることを願っています...

ここでは非常にわかりやすい画像をお見せしようとしましたが、新規ユーザーは画像を投稿できません。つまり、紙や PDF に印刷した場合、正確に 10 cm の線を 3 本描きます。ただし、画面上では、中央の線が一番下の線と同じに見えるはずです。それらの唯一の違いは、Width プロパティです。最初の赤い線の幅は 0.1 mm で、2 番目の赤い線の幅は 0.5 mm です。

両方の赤い線に、4mm ダッシュ - 1mm スペース - 1mm ダッシュ - 1mm スペースの DashPattern を付けます。

私が書いたように; 印刷すると、ダッシュのパターンは赤い線とまったく同じです! グラフィックが画面に表示されるのはバグだと思いますが、何かが足りないのかもしれません... 以下に、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;
  }


}
4

2 に答える 2

2

どういうわけか、thinPenRed の太さの値を >= 0.4f に変更すると、画面と印刷の両方で同じパターンが得られます。で割るときに丸めの問題になる可能性はありwますか?

于 2011-12-07T11:04:37.083 に答える
0

私がコンパイルしたときにあなたのプログラムが示したものは次のとおりです。ここに画像の説明を入力

申し訳ありませんが、あなたが話していることはわかります。印刷すると、画像は次のようになります。ここに画像の説明を入力

Tim Bourguignon の答えは正しいようです。

于 2011-12-07T10:36:41.270 に答える