- ベストアンサー
C++Builder5で画像データを用紙サイズに合ったサイズで印刷する方法
C++Builder5で画像ファイルをプリンターの用紙に合ったサイズで印刷たいのですがどのようにしたらいいのかわかりません。 いい方法を教えて下さい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
VCL(BorlandC++Builder付属のライブラリ)を使うサンプルです。 せっかく高価な開発環境を使っているのですから、用意されたライブラリは最大限利用しましょう。 VCLにおいて印刷はTPrinter::Canvasに対する描画です。だからTBitmap::Canvasに描画したのと同様の手法で印刷できます。 TPrint::PageWidth, PageHeightで印刷可能領域のピクセル幅、高さが取得できますので、印刷したいイメージの大きさと比較してちょうど収まるように拡大してTCanvas::StretchDraw()で描画すれば良いです。 //Graphics::TBitmap* mapの画像を印刷する //画像の縦横比をたもち印刷可能領域いっぱいに拡大する //プリンタの選択と設定は終わっているとする //Graphics::TBitmap* mapは既に画像を読込み済みとする TPrinter* ptr = Printer(); double h_ratio = double(ptr->PageHeight) / double(map->Height); double w_ratio = double(ptr->PageWidth) / double(map->Width); double ratio = h_ratio < w_ratio ? h_ratio : w_ratio; ptr->BeginDoc(); ptr->Canvas->StretchDraw( TRect ( 0, 0, map->Width * ratio, map->Height * ratio ), map ); ptr->EndDoc();
その他の回答 (2)
すいません。関数載せるの忘れてました。 void __fastcall TfrmMain::StretchDrawBitmap( TCanvas* canvas, const TRect& rect, Graphics::TBitmap* bitmap) { unsigned int infosize, imagesize; GetDIBSizes(bitmap->Handle, infosize, imagesize); BITMAPINFO* info = (BITMAPINFO*)new char[infosize]; char* image = new char[imagesize]; GetDIB(bitmap->Handle, bitmap->Palette, info, image); int oldmode = SetStretchBltMode(canvas->Handle, COLORONCOLOR); StretchDIBits(canvas->Handle, rect.Left, rect.Top, (rect.Right - rect.Left), (rect.Bottom - rect.Top), 0, 0, info->bmiHeader.biWidth, info->bmiHeader.biHeight, image, info, DIB_RGB_COLORS, SRCCOPY ); SetStretchBltMode(canvas->Handle, oldmode); delete [] image; delete [] info; }
お礼
ご回答ありがとうございます。 関数が必要だったんですね。 今試してみましたところ、印刷サイズにあった表示が出来ました。 ありがとうございます。 私の質問の書き方が悪かったので申し訳ございませんが、 今回印刷に試した画像は円(○)が入った画像だったのですが、印刷された 画像は楕円に引き伸ばされて印刷されました・・・。 出来れば丸は丸のままで印刷したいのですがいいほうほうないですか? こちらの説明不足で大変申し訳ございません。
「TPrinterSetupDialog」で設定してから画像を印刷するはどうでしょうか? こんな感じで↓ if (PrinterSetupDialog1->Execute() == false) return; TPrinter* printer = Printer(); printer->BeginDoc(); StretchDrawBitmap(printer->Canvas, printer->Canvas->ClipRect, imgPaper->Picture->Bitmap); printer->EndDoc();
お礼
ご回答ありがとうございます。 早速試してみたのですが、未定義の関数'StretchDrawBitmap'を呼び出した とエラーが発生してしまいます。StretchDrawBitmapを定義しないといけないのでしょうか?もしそうなら定義方法を教えてもらえると幸いです。 よろしくお願い致します。
お礼
ご回答ありがとうございました。 ご指摘の通り用意されたライブラリは最大限利用しないといけ無かったです。 教えていただいた方法でなんとか思った事が出来るようになりました。 ありがとうございます。