質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

1回答

8645閲覧

C#で複数のPictureBoxを印刷したい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2016/01/28 08:21

いつもお世話になります。
C#, Windows7, VisualStudio2013 Express, .NET4.5の組み合わせでFormアプリケーションを作っています。
Formに複数の(画面からはみ出すくらい、20個くらいの)画像をPictureBoxで表示しそれを印刷しようとしています。

Formを印刷するには、
http://www.ne.jp/asahi/c-sharp/dictionary/cs/print/index.html
を参考にするとVisualBasic PowerPackを使うとのことで、
http://blog.goo.ne.jp/ashm314/e/932755fa3ed6fcdd08d8867010c4d077
を参照して導入しました。

そして、button_Clickで、
this.printForm1.PrintAction = System.Drawing.Printing.PrintAction.PrintToPreview;
this.printForm1.Print(this, Microsoft.VisualBasic.PowerPacks.Printing.PrintForm.PrintOption.FullWindow);
this.Refresh();
として、FullWindowを指定しましたが、PreVeiwは1ページだけで、Form全体を印刷できません。
Form全体を印刷するには、どうしたらよいでしょう?

印刷したいのは、Formではなく、複数のPictureBoxなので、それを印刷する方法でもよいです。
ご示唆いただけたら助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

印刷したいのは、Formではなく、複数のPictureBoxなので、それを印刷する方法でもよいです。

PictureBoxに設定した画像を印刷したいということでよろしいでしょうか。画像を印刷するだけであれば、ツールボックスの印刷のところにあるPrintDocumentを使えば簡単にできます。

PrintDocumentをフォームに配置して下に表れたアイコンをダブルクリックすればPrintPageイベントハンドラーが追加されますので、それを編集すれば良いです。

コード例

C#

1private void button1_Click(object sender, EventArgs e) 2{ 3 page = 0; 4 printDocument1.Print(); 5} 6 7private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 8{ 9 page++; 10 // ページ番号に応じたPictureBoxからImageオブジェクトを取得します。 11 var image = pictureBox1.Image; 12 13 // 印刷イメージは通常のグラフィックと同じ要領で描画します。 14 e.Graphics.DrawImage(image, e.MarginBounds); 15 16 // `HasMorePages`プロパティで複数ページの印刷を制御します。 17 if(page < 20) 18 e.HasMorePages = true; 19 else 20 e.HasMorePages = false; 21}

最小限のコードなのでページレイアウトとか画像の縦横比とか考慮されていませんが、その辺は適宜実装してください。


コード例2

C#

1private void button1_Click(object sender, EventArgs e) 2{ 3 printDocument1.Print(); 4} 5 6private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 7{ 8 var image = new Bitmap(this.Width, this.Height); 9 this.DrawToBitmap(image, new Rectangle(0, 0, this.Width, this.Height)); 10 e.Graphics.DrawImage(image, e.MarginBounds); 11 e.HasMorePages = false; 12}

追記
ユーザーコントロールを使うやり方です。

プロジェクトメニューに「ユーザーコントロールの追加」でユーザーコントロールが追加できるので、適当な名前を付けて追加します。

PictureBoxをユーザーコントロールに配置します。ユーザーコントロールは画面からはみ出すぐらい大きくてもかまいません。

フォームの方にはPanelを配置します。その際、Anchorを上下左右に設定してフォームのサイズ変更に追従するようにし、AutoScrollをtrueに設定してスクロールバーではみ出た部分を表示できるようにします。

いったんビルドします。するとツールボックスに追加したユーザーコントロールが現れますので、それをPanelに乗せます。

PrintPageでDrawToBitmapさせるのを、フォームではなく追加したユーザーコントロールにします。

コード例3

C#

1private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) 2{ 3 var image = new Bitmap(userControl11.Width, userControl11.Height); 4 userControl11.DrawToBitmap(image, new Rectangle(0, 0, image.Width, image.Height)); 5 e.Graphics.DrawImage(image, e.MarginBounds); 6 e.HasMorePages = false; 7}

投稿2016/01/28 09:42

編集2016/01/29 10:22
catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/01/29 00:28

page=0のpageは何を意味しているのでしょう? printDocument1.Print(); して印刷中というパネルは出ましたが、printerは動作しませんでした。 printDocument1に印刷するデータを渡す必要があるように思いますが、Formの場合は何もしなくてもわたるのでしょうか。 webだと // 印刷ページの描画を行う e.Graphics.DrawString("サンプル印刷", new Font("MS 明朝", 32), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top, new StringFormat()); のような記述があり、たとえば文字を印刷することはできるようなのですが、複数のpictureboxをFormに表示している場合(しかも一部はWindowsに表示できずに隠れている)にそのFormを引数にしてprintDocument1に渡す方法が未解決でいます。
catsforepaw

2016/01/29 01:09 編集

コード例の枠の下の方にある「∨」をクリックすると、書かれている内容がすべて見られるようになります。印刷データの描画処理は`printDocument1_PrintPage`メソッドで行っています。 pageは印刷すべきページ番号を表します。画像が20個と書かれていますのでコード例でも20ページで印刷が終わるようにしました。 もしかして20枚の画像をフォームに並べたものを1ページとして印刷したいということでしょうか? その場合は、フォームを`DrawToBitmap`でビットマップに描画させて、それを印刷すれば良いと思います。 コード例を追加しておきます。
退会済みユーザー

退会済みユーザー

2016/01/29 05:38

ありがとうございます。 なんと。 おっしゃるとおりでVの下にあるコードを見逃していました。 Vのところは、そこに文字列があれば、次の行を薄く表示しているのですが、今回はそこがたまたま空行だったので、てっきり printDocument1.Print(); だけでよいのか、そんなはずないのに、と混乱していました。 大変失礼しました。 それで、おっしゃるとおり、20枚(位)をサムネイルみたいに一覧してprintしようと考えています。 いただいたコードを試したところ、ようやく印刷できました。 ありがとうございました。 しかし、画面に表示しているFormそのもので、Windowからはみ出した部分は印刷できませんでした。 formはwidth=1120, height=795で、下記のようにbmpmapを指定しているつもりですが、どこでサイズを指定するものでしょう。thisかな。 int width = 1200; int height=2000; int page = 0; private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { Bitmap bitmap = new Bitmap(width, height); Rectangle rectangle = new Rectangle(); rectangle.Width = width; rectangle.Height = height; this.DrawToBitmap(bitmap, rectangle);//thisでFormをbitmapに。 e.Graphics.DrawImage(bitmap, e.MarginBounds); e.HasMorePages = false; }
catsforepaw

2016/01/29 10:14

`this.DrawToBitmap`はフォームを画面の代わりにビットマップに描画させるものなので、さすがにウィンドウからはみ出た部分は描画できませんね。 思い浮かぶアイディアとしては、ユーザーコントロールにPictureBoxを配置して、それを`AutoScroll = true`にした`Panel`に乗せれば、はみ出した部分もスクロールで表示できるようになります。 そして、そのユーザーコントロールを印刷させれば、たとえフォームに収まらないサイズでも印刷することができるようになります。 やり方は回答の方に書きます。
退会済みユーザー

退会済みユーザー

2016/02/01 02:26

ありがとうございます。 いまだプリントできるのは、Windowの表示している部分のみです。
catsforepaw

2016/02/01 03:41

なぜでしょう。よく判りません。こちらで試しにユーザーコントロールのサイズを3000x4000にしてみましたが、ちゃんと全部印刷できています。 どのようなコードを書いたのか見せていただければ何か判るかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問