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

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

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

Re[2]: 印刷で例外


(過去ログ 87 を表示中)

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

■52133 / inTopicNo.1)  印刷で例外
  
□投稿者/ やぎ (1回)-(2010/08/01(Sun) 20:56:58)

分類:[C#] 

以下は読み込んだ画像を印刷する簡単なプログラムの一部です。

// 画像読み込み
private void btnLoadFile_Click(object sender, EventArgs e)
{
 OpenFileDialog dlg = new OpenFileDialog();
 dlg.Filter = "image file|*.bmp;*.gif;*.jpeg;*.jpg";
 if (DialogResult.OK == dlg.ShowDialog(this))
 {
  _img.Dispose();
  _img = Image.FromFile(dlg.FileName);
 }
}

// 印刷
private void btnPrint_Click(object sender, EventArgs e)
{
 PrintDocument doc = new PrintDocument();
 doc.DocumentName = "PrintTest";
 doc.PrinterSettings = _prnSettings;
 doc.DefaultPageSettings = _pageSettings;
 doc.PrintPage += new PrintPageEventHandler(doc_PrintPage);
 doc.Print();
}

void doc_PrintPage(object sender, PrintPageEventArgs e)
{
 e.Graphics.DrawImage(_img, e.MarginBounds);
 e.HasMorePages = false;
}

このコードでプリンタに仮想PDFプリンタ(PrimoPDFなど)を指定して印刷すると、doc.Print()でハングアップするのですが、その理由が分かりません。
_prnSettingsと_pageSettingsは事前にPrinterDialogやPageSetupDialogで変更しています。
たぶん、PrinterSettingsオブジェクトとPageSettingsオブジェクトの使い方も分かっていません。
投げられた例外(AccessViolationExceptionやExecutionEngineExceptionだったり)が表示される場合もあれば、表示されずただ単に「○○○は動作を停止しました」というダイアログが表示されるだけの場合もあります。

理由が分かる方、ぜひその理由を添えて、どうか私を口汚く罵ってください。
よろしくお願いします。

ちなみに開発環境は
・Windows7 Pro
・Visual Studio 2008 Pro
・C#
です。仮想PDFプリンタとして
・PrimoPDF 5.1.0.2
・CubePDF 0.9.1β
・Bullzip PDF Printer 7.1.1195
で確かめてみましたが、同じ結果になり、レーザープリンタ(Canon LBP5800)では普通に印刷できました。
引用返信 編集キー/
■52174 / inTopicNo.2)  Re[1]: 印刷で例外
□投稿者/ やぎ (2回)-(2010/08/02(Mon) 17:52:27)
付け加えますと、doc.Print()の部分をtry-catchで例外を捕捉しようとしても、捕捉してくれる例外の場合もありますし、そうでなくて「○○○は動作を停止しました」で落ちる場合もあります。後者が圧倒的に多いですが。
なんじゃこりゃ。
引用返信 編集キー/
■52186 / inTopicNo.3)  Re[2]: 印刷で例外
□投稿者/ やぎ (3回)-(2010/08/02(Mon) 20:29:51)
doc.DefaultPageSettings = _pageSettings;
の部分をコメントアウトしたらエラーにならなくなったけど、それだと用紙の向きとかマージンとか設定できなくなっちゃう...

ってことで、下のようにメンバ単位で代入したらエラーにならなくなったんスけど。マジ意味分かんないんスけど。
doc.DefaultPageSettings.Landscape = _pageSettings.Landscape;
doc.DefaultPageSettings.Margins.Left = _pageSettings.Margins.Left;
doc.DefaultPageSettings.Margins.Right = _pageSettings.Margins.Right;
doc.DefaultPageSettings.Margins.Top = _pageSettings.Margins.Top;
doc.DefaultPageSettings.Margins.Bottom = _pageSettings.Margins.Bottom;

考えていた他の代替案としては、PageSettingsオブジェクトおよびPageSetupDialogを使わずに、PrintPageでPageBound領域にマージン等も含めて自分で描くことでした。用紙の向きはPrinterDialogでもできそうなので。

ということで、原因が分からないままなので解決とは言えませんが、とりあえず終わりにします。
考えてくださった方、ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -