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

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

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

Re[2]: 印刷で複数ページ印刷したとき同じページが印刷される。


(過去ログ 74 を表示中)

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

■43088 / inTopicNo.1)  印刷で複数ページ印刷したとき同じページが印刷される。
  
□投稿者/ RT (189回)-(2009/10/28(Wed) 20:26:16)

分類:[C#] 

2009/10/28(Wed) 20:57:06 編集(投稿者)

こんにちは。RTです。
たびたびお世話になります。
C#でプログラミングを行っております。

質問なのですが、印刷で複数ページ印刷したとき同じページ(1ページ)が印刷されます。
例えば、3ページ印刷したら、3ページとも1ページが表示されます。

コードは次の通りです。

       //PrintPageイベントハンドラの追加
printDocument_Source.PrintPage +=
new System.Drawing.Printing.PrintPageEventHandler(printDocument_Source_PrintPage);
//PrintDialogクラスの作成
PrintDialog cPrintDialog = new PrintDialog();
//PrintDocumentを指定
cPrintDialog.Document = printDocument_Source;
//ページ指定できるようにする
cPrintDialog.AllowSomePages = true;
//ページ指定の最小値と最大値を指定する
cPrintDialog.PrinterSettings.MinimumPage = 1;
cPrintDialog.PrinterSettings.MaximumPage = 200;
//印刷開始と終了ページを指定する
cPrintDialog.PrinterSettings.FromPage = cPrintDialog.PrinterSettings.MinimumPage;
cPrintDialog.PrinterSettings.ToPage = cPrintDialog.PrinterSettings.MinimumPage;

//印刷の選択ダイアログを表示する
if (cPrintDialog.ShowDialog() == DialogResult.OK)
{
//OKがクリックされた時は印刷する
printDocument_Source.Print();
}

private void printDocument_Source_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
//ページ範囲が指定されており、始めのページのときは、
//印刷開始ページまで飛ばす
if (e.PageSettings.PrinterSettings.PrintRange ==
System.Drawing.Printing.PrintRange.SomePages &&
currentPage == 1)
{
currentPage = e.PageSettings.PrinterSettings.FromPage;
}

e.Graphics.PageUnit = GraphicsUnit.Millimeter;

//印刷ダイアログで横が選択された時
if (printDocument_Source.DefaultPageSettings.Landscape == true)
{
//currentPageで指定されたページを描画する
Font cFont = new Font("Ariel", 12);
e.Graphics.DrawString(RichTxt_Main.Text,
cFont, Brushes.Black, new RectangleF(0, 0, 290, 200));
cFont.Dispose();
}
else
{
//currentPageで指定されたページを描画する
Font cFont = new Font("Ariel", 12);
e.Graphics.DrawString(RichTxt_Main.Text,
cFont, Brushes.Black, new RectangleF(0, 0,200, 350));
cFont.Dispose();
}

//次のページがあるか調べる
if (currentPage >= 10 ||
(e.PageSettings.PrinterSettings.PrintRange ==
System.Drawing.Printing.PrintRange.SomePages &&
e.PageSettings.PrinterSettings.ToPage <= currentPage))
{
//次のページがないことを通知する
e.HasMorePages = false;
currentPage =1;
}
else
{
e.HasMorePages = true;
currentPage++;
}
}

どこか、原因があるでしょうか?アドバイスよろしくお願いします。
引用返信 編集キー/
■43090 / inTopicNo.2)  Re[1]: 印刷で複数ページ印刷したとき同じページが印刷される。
□投稿者/ たくボン (284回)-(2009/10/28(Wed) 21:09:04)
No43088 (RT さん) に返信
> 2009/10/28(Wed) 20:57:06 編集(投稿者)
>
> こんにちは。RTです。
> たびたびお世話になります。
> C#でプログラミングを行っております。
>
> 質問なのですが、印刷で複数ページ印刷したとき同じページ(1ページ)が印刷されます。
> 例えば、3ページ印刷したら、3ページとも1ページが表示されます。

currentPageの値は正しくインクリメントされてますか?

> e.Graphics.DrawString(RichTxt_Main.Text,

描画しているRichTxt_Mainが何かわからないので憶測でしか判断できないですけど、どこで1頁目しか印刷されないと判断されていますか?

引用返信 編集キー/
■43091 / inTopicNo.3)  Re[1]: 印刷で複数ページ印刷したとき同じページが印刷される。
□投稿者/ 魔界の仮面弁士 (1371回)-(2009/10/28(Wed) 21:19:14)
No43088 (RT さん) に返信
> //currentPageで指定されたページを描画する

このコメントの後に続く描画処理(e.Graphics.DrawString) では、
その「currentPage」の値がどこにも使われていませんよね。

currentPage = 1 の状態で、printDocument_Source_PrintPage イベントが呼び出された場合と、
currentPage = 2 の状態で、printDocument_Source_PrintPage イベントが呼び出された場合と、
currentPage = 3 の状態で、printDocument_Source_PrintPage イベントが呼び出された場合とで、
それぞれ、違う内容を描画するように修正する必要があるかと。
引用返信 編集キー/
■43097 / inTopicNo.4)  Re[2]: 印刷で複数ページ印刷したとき同じページが印刷される。
□投稿者/ RT (190回)-(2009/10/28(Wed) 22:02:56)
No43090 (たくボン さん) に返信

> currentPageの値は正しくインクリメントされてますか?

デバッグしたら、ちゃんとインクリメントしています。


> 描画しているRichTxt_Mainが何かわからないので憶測でしか判断できないですけど、どこで1頁目しか印刷されない
>と判断されていますか?

実際に印刷したら、そういう結果になります。
引用返信 編集キー/
■43098 / inTopicNo.5)  Re[2]: 印刷で複数ページ印刷したとき同じページが印刷される。
□投稿者/ RT (191回)-(2009/10/28(Wed) 22:09:40)
No43091 (魔界の仮面弁士 さん) に返信
> ■No43088 (RT さん) に返信
>> //currentPageで指定されたページを描画する
>
> このコメントの後に続く描画処理(e.Graphics.DrawString) では、
> その「currentPage」の値がどこにも使われていませんよね。

すいません、そのコメントは↓のページのコードをコピペした時に残っていたものです。

http://dobon.net/vb/dotnet/graphics/printrange.html
引用返信 編集キー/
■43102 / inTopicNo.6)  Re[3]: 印刷で複数ページ印刷したとき同じページが印刷される。
□投稿者/ たくボン (285回)-(2009/10/28(Wed) 23:46:38)
No43097 (RT さん) に返信
> ■No43090 (たくボン さん) に返信
>
>>currentPageの値は正しくインクリメントされてますか?
>
> デバッグしたら、ちゃんとインクリメントしています。
>
>
>>描画しているRichTxt_Mainが何かわからないので憶測でしか判断できないですけど、どこで1頁目しか印刷されない
> >と判断されていますか?
>
> 実際に印刷したら、そういう結果になります。

あー、なんとなくわかった(笑)
とりあえず、RichTxt_Main.Textは複数ページに渡るような長い文字列なのかな。

> e.Graphics.DrawString(RichTxt_Main.Text,cFont, Brushes.Black, new RectangleF(0, 0,200, 350));

これだといつまで経っても同じ内容しか出力されないと思いますよ。
この場合なら、RichTxt_Main.Textの内容をcFontでRectangleF(0, 0,200, 350)の矩形内に印字した文字数分だけ、次ページでオフセットしないと正しい改ページはされないんじゃないかな?

出力前にRectangleF(0, 0,200, 350)に入る文字列の配列を作って、その配列の添字としてcurrentPageを使う。
引用返信 編集キー/
■43106 / inTopicNo.7)  Re[4]: 印刷で複数ページ印刷したとき同じページが印刷される。
□投稿者/ RT (192回)-(2009/10/29(Thu) 01:54:20)
No43102 (たくボン さん) に返信

> あー、なんとなくわかった(笑)
> とりあえず、RichTxt_Main.Textは複数ページに渡るような長い文字列なのかな。
>
>>e.Graphics.DrawString(RichTxt_Main.Text,cFont, Brushes.Black, new RectangleF(0, 0,200, 350));
>
> これだといつまで経っても同じ内容しか出力されないと思いますよ。
> この場合なら、RichTxt_Main.Textの内容をcFontでRectangleF(0, 0,200, 350)の矩形内に印字した文字数分だけ、次ページでオフセットしないと正しい改ページはされないんじゃないかな?
> 出力前にRectangleF(0, 0,200, 350)に入る文字列の配列を作って、その配列の添字としてcurrentPageを使う。

それらしい事が、レファレンスに書いてありましたので、解決する事が出来ました。

たくボンさん、魔界の仮面弁士さん、アドバイスありがとうございました。またよろしくお願いします。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -