奈良県でソフトウェア開発・Webサイトの運営をしているフリーランスのエンジニアです

ロジカルアーツ研究所

C++Builder

プリンタの解像度を取得する

投稿日:

印刷位置をピクセルではなく、紙面上の物理的なサイズで指定したい場合、プリンタの単位長さあたりの解像度(dpi)を取得する必要が出てきます。これはVCLには用意されていないようで、Windows APIのGetDeviceCaps関数を使用します。ソースコードはこんな感じです。

TPrinter* printer = Printer();
HDC dc = printer->Handle;
int dpi_x = GetDeviceCaps(dc, LOGPIXELSX);
int dpi_y = GetDeviceCaps(dc, LOGPIXELSY);

GetDeviceCaps関数の第1引数には対象とするデバイスコンテキストのハンドルを指定します。ここではプリンタですからTPrinterオブジェクトのHandleプロパティを指定します。もし画面の解像度を取得したければ画面のCanvasプロパティのHandleプロパティを渡してやればいいわけです。画面との整合性から考えるとprinter->Handleではなく、printer->Canvas->Handleとする方が自然なような気がしますが、なぜか例外が発生してしまいます。

第2引数にはさまざまな取得対象を指定することができますが、ここでは論理的な解像度を取得するLOGPIXELSXあるいはLOGPIXELSYを指定します。それぞれ横方向、縦方向の解像度に対応します。

これで横方向、縦方向の解像度がそれぞれdpi_x, dpi_yに取得できたわけです。あとミリメートル単位に換算したければさらに25.4で割ってやればOKです。

-C++Builder
-,

Copyright© ロジカルアーツ研究所 , 2024 All Rights Reserved Powered by STINGER.