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

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

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

Re[3]: 画面の印刷


(過去ログ 90 を表示中)

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

■53697 / inTopicNo.1)  画面の印刷
  
□投稿者/ なつみ (9回)-(2010/09/24(Fri) 12:28:14)

分類:[C#] 

お世話になります。

開発環境
 Windows XP
 Visual Studio 2008 Professional Edition

●やりたいこと
表示されている画面(Form)の内容を印刷したい。
ただし、Panel でスクロール表示されていて画面上見えていないところも印刷されるようにしたい。

●試しに
フォームをそのまま印刷すると、スクロールで見えていないところは印刷されなかったので、
フォーム上のアイテム(Label や Panel)を一度 Bitmap に並べて、それを印刷したらどうかと思い以下のようにして試してみました。

private void button1_Click(object sender, EventArgs e)
{
  // フォーム上のアイテムを一度ビットマップ("C:\\test.bmp")に並べて保存
   ・
   ・
   ・

  //PrintDocumentオブジェクトの作成
  System.Drawing.Printing.PrintDocument pd =
        new System.Drawing.Printing.PrintDocument();
  //PrintPageイベントハンドラの追加
  pd.PrintPage +=
        new System.Drawing.Printing.PrintPageEventHandler(pd_PrintPage);

  //PageSetupDialogクラスの作成
  PageSetupDialog psd = new PageSetupDialog();
  
  //PrintDocumentを指定
  psd.Document = pd;
  
  //ページ設定ダイアログを表示する
  if (psd.ShowDialog() == DialogResult.OK)
  {
    //OKがクリックされた時は印刷する
    pd.Print();
  }
}

private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
  //画像を読み込む
  Image img = Image.FromFile("C:\\test.bmp");

  //画像を描画する
  e.Graphics.DrawImage(img, e.MarginBounds);

  //次のページがないことを通知する
  e.HasMorePages = false;

  //後始末をする
  img.Dispose();
}

●試した結果
フォームの内容は全て印刷されたのですが、それが1枚の紙に印刷されてしまいました。

●質問
@印刷する際、指定したサイズで印刷することは可能でしょうか。
 例)
 縦100、横100サイズのビットマップに対して、縦10、横10とサイズを指定すると100枚
 に分割されて印刷される。また、縦10、横10と指定した範囲が出力される紙いっぱいに表示
 されるようにしたい。

Aそもそも、「やりたいこと」で書いたようなことを実現するためにもっと良い方法はないのでしょうか。

長文になってしまいすみません。よろしくお願いいたします。

引用返信 編集キー/
■53698 / inTopicNo.2)  Re[1]: 画面の印刷
□投稿者/ よねKEN (617回)-(2010/09/24(Fri) 12:55:18)
よねKEN さんの Web サイト
> ●試した結果
> フォームの内容は全て印刷されたのですが、それが1枚の紙に印刷されてしまいました。

「e.HasMorePages = false;」としているからですね。


> ●質問
> @印刷する際、指定したサイズで印刷することは可能でしょうか。

Graphics.DrawImageメソッドのオーバーロードにImageの一部分を描画するものがあるので、
それを使って、10x10ずつ切り出して描画すればよいですね。
描画すべき領域が残っている間は、「e.HasMorePages = true;」として、
最後の領域の印字時は「e.HasMorePages = false;」とすればよいのではないでしょうか。


引用返信 編集キー/
■53699 / inTopicNo.3)  Re[1]: 画面の印刷
□投稿者/ shu (58回)-(2010/09/24(Fri) 13:30:22)
No53697 (なつみ さん) に返信
PrintDocumentは
1.BeginPrintで初期処理
2.PrintPageで各ページの印字処理
  (よねKEN さんのコメ通りHasMorePagesがFalseになるまで繰り返し)
3.EndPrintで後処理
のように処理されます。

BeginPrintでBitmapを取得
PrintPageで各ページの印刷部分を描画
 (ページ番号などをクラス変数で保持し描画する場所を確定する)
EndPrintでBitmapをDispose

といった感じでしょうか。
この処理ですとBitmapをファイルに保存する必要なさそうですので
clickイベントで描画時に使用したBitmapをそのまま使用してもよいかもしれません。
引用返信 編集キー/
■53701 / inTopicNo.4)  Re[2]: 画面の印刷
□投稿者/ なつみ (10回)-(2010/09/24(Fri) 14:50:59)
お世話になっております。

よねKEN 様
shu 様

書込みありがとうございます。
参考にさせていただいて、試してみたいと思います。

引用返信 編集キー/
■53812 / inTopicNo.5)  Re[3]: 画面の印刷
□投稿者/ なつみ (12回)-(2010/09/27(Mon) 19:06:51)
おかげさまで、複数ページの印刷ができるようになりました。
ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -