C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 印刷の余白について


(過去ログ 111 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■65577 / inTopicNo.1)  印刷の余白について
  
□投稿者/ ひろ (9回)-(2013/03/08(Fri) 20:21:08)

分類:[C#] 

2013/03/08(Fri) 20:22:54 編集(投稿者)

private void pageSetupDialog1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
int ypos = e.MarginBounds.Top;



上記の e.MarginBounds.Top には、どこで設定した値が入るのでしょうか。

余白設定とe.MarginBounds は違うのですか?

printDialog1.Document.Print(); の実行前に下記を設定してみましたが、e.MarginBounds.Top の値は変わりませんでした。

pageSetupDialog1.EnableMetric = true;
pageSetupDialog1.Document = printDocument1;
pageSetupDialog1.PageSettings.Margins = new System.Drawing.Printing.Margins(left, right, top, bottom);

e.MarginBounds で ページの余白設定値が取得できる方法を教えてください。
引用返信 編集キー/
■65578 / inTopicNo.2)  Re[1]: 印刷の余白について
□投稿者/ shu (218回)-(2013/03/08(Fri) 22:31:35)
No65577 (ひろ さん) に返信

下図
Margins.Left = 左余白
Margins.Top = 上余白
Margins.Right = 右余白
Margins.Bottom = 下余白


e.MarginBounds = 印字領域


です。
印刷するのに余白を考慮する必要はほとんどないと思います。
印字領域に印刷すればよいです。


┌───────────────────────────┐
│                           │
│          上余白              │
│                           │
│   ┌──────────────────┐    │
│   │                  │    │
│   │                  │    │
│   │                  │    │
│   │                  │    │
│ 左 │                  │  右 │
│ 余 │                  │  余 │
│ 白 │      印字領域        │  白 │
│   │                  │    │
│   │                  │    │
│   │                  │    │


・・・
・・・

│   │                  │    │
│   │                  │    │
│   │                  │    │
│   │                  │    │
│   │                  │    │
│   │                  │    │
│   │                  │    │
│   └──────────────────┘    │
│                           │
│           下余白             │
│                           │
└───────────────────────────┘

引用返信 編集キー/
■65583 / inTopicNo.3)  Re[2]: 印刷の余白について
□投稿者/ ひろ (10回)-(2013/03/09(Sat) 17:48:27)
No65578 (shu さん) に返信

> 印刷するのに余白を考慮する必要はほとんどないと思います。
> 印字領域に印刷すればよいです。

では、余白を小さくして印刷領域を広くするには
同設定したらいいのでしょうか。
引用返信 編集キー/
■65585 / inTopicNo.4)  Re[3]: 印刷の余白について
□投稿者/ 魔界の仮面弁士 (163回)-(2013/03/09(Sat) 19:29:58)
No65577 (ひろ さん) に返信
> private void pageSetupDialog1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
> {
>    int ypos = e.MarginBounds.Top;
> 上記の e.MarginBounds.Top には、どこで設定した値が入るのでしょうか。

そもそも上記は実行されません。
PageSetupDialog には PrintPage イベントが無いからです。


> 余白設定とe.MarginBounds は違うのですか?

PrintDocument.DefaultPageSettings は、既定のページ設定を表します。
ページごとに異なる設定をしたいような場合には、
QueryPageSettings イベントで e.PageSettings を調整すれば、
PrintPage イベントの引数に反映されます。

UI 指定が必要な場合には PageSetupDialog を使うことも
できますが、今回はプログラムから値を指定したいのですよね?



■No65583 (ひろ さん) に返信
> では、余白を小さくして印刷領域を広くするには
> 同設定したらいいのでしょうか。

PageSettings クラスの Marings プロパティです。



private void button1_Click(object sender, EventArgs e)
{
    // ここの値を変えてみよう!
    printDocument1.DefaultPageSettings.Margins
        //= new Margins(100, 100, 100, 100);
         = new Margins(10, 10, 10, 10);

    // この値も変えてみよう!
    printDocument1.OriginAtMargins = true;
    
    printDocument1.Print();
}

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
    using (Brush b = new SolidBrush(Color.FromArgb(128, Color.Red)))
    using (Pen p = new Pen(b, 80))
    {
        e.Graphics.DrawRectangle(p, e.PageBounds);
    }

    using (Brush b = new SolidBrush(Color.FromArgb(128, Color.Blue)))
    using (Pen p = new Pen(b, 80))
    {
        e.Graphics.DrawRectangle(p, e.MarginBounds);
    }

    using (Font f = new Font("MS Gothic", 12))
    {
        var draw = new Action<Point, Brush, string>((p, b, s) =>
        {
            e.Graphics.DrawString(s, f, b, p);
        });
        var pos = e.MarginBounds.Location;
        draw(pos, Brushes.Black,
            String.Format("PrintDocument.OriginAtMargins={0}", 
            this.printDocument1.OriginAtMargins));
        pos.Offset(0, 50);
        draw(pos, Brushes.DarkGreen,
            String.Format("PageSettings.HadMarginXY=({0}, {1})", 
            e.PageSettings.HardMarginX,
            e.PageSettings.HardMarginY));
        pos.Offset(0, 50);
        draw(pos, Brushes.DarkGreen,
            String.Format("PageSettings.Margins={0}",
            e.PageSettings.Margins.ToString()));
        pos.Offset(0, 50);
        draw(pos, Brushes.Red,
            String.Format("PageBounds={0}",
            e.PageBounds.ToString()));
        pos.Offset(0, 50);
        draw(pos, Brushes.Blue,
            String.Format("MarginBounds={0}",
            e.MarginBounds.ToString()));
    }
}


大抵のページプリンタには、印刷不可能領域が存在するため、上記では
DrawRectangle の際に、極太(幅=80)の Pen を利用しています。
(PDF プリンタや XPS プリンタだと、ハード余白が0だったりしますが)

極太線であるがため、PageBounds の線と MarginBounds の線とが
重なることがあるため、それぞれ、半透明赤と半透明青の線で
描画しています。(重なったところは紫になる予定)

なので、試すときにはカラープリンターの方が分かりやすいかも。

引用返信 編集キー/
■65600 / inTopicNo.5)  Re[4]: 印刷の余白について
□投稿者/ ひろ (11回)-(2013/03/11(Mon) 10:31:05)
2013/03/11(Mon) 10:33:02 編集(投稿者)
2013/03/11(Mon) 10:32:52 編集(投稿者)

>>では、余白を小さくして印刷領域を広くするには
>>同設定したらいいのでしょうか。
>
> PageSettings クラスの Marings プロパティです。
>
>
>
> private void button1_Click(object sender, EventArgs e)
> {
> // ここの値を変えてみよう!
> printDocument1.DefaultPageSettings.Margins
> //= new Margins(100, 100, 100, 100);
> = new Margins(10, 10, 10, 10);
>
> // この値も変えてみよう!
> printDocument1.OriginAtMargins = true;
>
> printDocument1.Print();
> }

印刷領域の左上書き出し座標を、用紙の左端から20ミリ、上から20ミリの場所に指定したく、下記のようにしてみました。

private void button1_Click(object sender, EventArgs e)
{
int i = (int)(20 * 3.937);
printDocument1.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(i, i, i, i);
printDocument1.OriginAtMargins = true; // この値も変えてみよう!

printDocument1.Print();
}

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
e.Graphics.DrawString(strVal, defFont, Brushes.Black, printEvent.MarginBounds.Left, printEvent.MarginBounds.Top);
}


しかし、実際にはとても離れた位置に書き出されてしまいました。
何が間違っているのでしょうか。

どうしたら、20ミリのところからを印刷領域として明示できるのでしょう。

引用返信 編集キー/
■65601 / inTopicNo.6)  Re[5]: 印刷の余白について
□投稿者/ shu (219回)-(2013/03/11(Mon) 13:06:40)
No65600 (ひろ さん) に返信
> 印刷領域の左上書き出し座標を、用紙の左端から20ミリ、上から20ミリの場所に指定したく、下記のようにしてみました。
No65585 魔界の仮面弁士さんが言われている通り

> 大抵のページプリンタには、印刷不可能領域が存在するため
なのでプリンタに対して微調整の計算が必要になります。印字位置調整用のテスト印字機能でも
設けたほうが確実だと思います。


漏れていましたが、MarginBoundsは1/100単位なのでGraphicsのPageUnitに合わせ変換が必要になります。
引用返信 編集キー/
■65605 / inTopicNo.7)  Re[5]: 印刷の余白について
□投稿者/ 魔界の仮面弁士 (164回)-(2013/03/11(Mon) 14:51:28)
No65600 (ひろ さん) に返信
> 印刷領域の左上書き出し座標を、用紙の左端から20ミリ、上から20ミリの場所に指定したく、
20ミリを指定した場合
10ミリを指定した場合
0ミリを指定した場合

とで、それぞれの開始位置が倍々にずれていきますか?


> しかし、実際にはとても離れた位置に書き出されてしまいました。
指定したい値については「20ミリ」という具体的な数字を出しておられますよね。
結果についても、「何ミリずれたのか」という『具体的』な値が欲しいです。(^^;


> 	int i = (int)(20 * 3.937);
つまり、「78」という値を指定したわけですね。
その時の余白は、およそ何ミリでしたか? そこから原因を割り出せるかも。

どの程度ずれるのか実環境で検証してはいないのですが、たとえば
8cm前後の位置に出力されるのだとしたら、「78」という値が何らかの理由で
mm指定として使われてしまった可能性がありそうです。


> private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
> {
> 	e.Graphics.DrawString(strVal, defFont, Brushes.Black, printEvent.MarginBounds.Left, printEvent.MarginBounds.Top);
> }
e.MarginBounds ではなく、printEvent.MarginBounds を渡しているのは何故でしょうか。
Graphics は、引数 e から受け取っているようですけれども。


> しかし、実際にはとても離れた位置に書き出されてしまいました。
> 何が間違っているのでしょうか。
OriginAtMargins や PrintableArea を考慮した上でずれるとすれば、
Graphics.PageUnit の影響でしょうか。(未検証)

引用返信 編集キー/
■65623 / inTopicNo.8)  Re[6]: 印刷の余白について
□投稿者/ ひろ (12回)-(2013/03/12(Tue) 17:32:25)
printDocument1.OriginAtMargins = true;

上記を設定すると、0,0座標は印刷領域の左端になるのですね。
e.Graphics.DrawString() の座標指定に使う値を用紙端からの値にしていたのが
期待した場所に表示されない原因でした。

GraphicsのPageUnitと、上記を注意して、期待通りの出力が得られました。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -