• ベストアンサー

C++Builder5で画像データを用紙サイズに合ったサイズで印刷する方法

C++Builder5で画像ファイルをプリンターの用紙に合ったサイズで印刷たいのですがどのようにしたらいいのかわかりません。 いい方法を教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • KoHal
  • ベストアンサー率60% (110/181)
回答No.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();

Simanohito
質問者

お礼

ご回答ありがとうございました。 ご指摘の通り用意されたライブラリは最大限利用しないといけ無かったです。 教えていただいた方法でなんとか思った事が出来るようになりました。 ありがとうございます。

その他の回答 (2)

noname#20242
noname#20242
回答No.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; }

Simanohito
質問者

お礼

ご回答ありがとうございます。 関数が必要だったんですね。 今試してみましたところ、印刷サイズにあった表示が出来ました。 ありがとうございます。 私の質問の書き方が悪かったので申し訳ございませんが、 今回印刷に試した画像は円(○)が入った画像だったのですが、印刷された 画像は楕円に引き伸ばされて印刷されました・・・。 出来れば丸は丸のままで印刷したいのですがいいほうほうないですか? こちらの説明不足で大変申し訳ございません。

noname#20242
noname#20242
回答No.1

「TPrinterSetupDialog」で設定してから画像を印刷するはどうでしょうか? こんな感じで↓ if (PrinterSetupDialog1->Execute() == false) return; TPrinter* printer = Printer(); printer->BeginDoc(); StretchDrawBitmap(printer->Canvas, printer->Canvas->ClipRect, imgPaper->Picture->Bitmap); printer->EndDoc();

Simanohito
質問者

お礼

ご回答ありがとうございます。 早速試してみたのですが、未定義の関数'StretchDrawBitmap'を呼び出した とエラーが発生してしまいます。StretchDrawBitmapを定義しないといけないのでしょうか?もしそうなら定義方法を教えてもらえると幸いです。 よろしくお願い致します。

関連するQ&A