お世話になります。Delphi初心者です。
今、デスクトップ上で開始点と終了点を指定すると2点間の長さ(XX.Xcm)で測る機能を作成したいと考えています。そこで疑問なのですがデスクトップ上の”1cm”というのはどのように計算すればいいのでしょうか??
解像度から計算を求めればいいのでしょうか? 1Pixelからなんらかの計算を行えばいいのでしょうか?
以上ご教授よろしくお願いしたいと思います
垂直方向の論理インチとピクセル数の対応は、PixelsPerInchぷろぱてぃ。
水平方向はこれにあらず。
デスクトップ上の”1cm”というのが、ディスプレイ上の”1cm”を指しているのであれば、ユーザにディスプレイの表示領域のサイズを入力させなければ出来ないと思います。
絶対、正確で、どんな環境でも
っていう条件だと無理。
一応、Borlandにのってる
(移転したのか消されたのか。今はグーグルキャッシュのみ)
var
iw,ih: integer;
begin
iw:= GetDeviceCaps( Canvas.Handle, HORZSIZE); //mm
ih:= GetDeviceCaps( Canvas.Handle, VERTSIZE); //mm
Memo1.Lines.Add( IntToStr(iw));
Memo1.Lines.Add( IntToStr(ih));
参考
wisdom.sakura.ne.jp/system/winapi/win32/win37.html
画面全体の大きさをミリメートルで返すらしい。
ので、真に受けるなら
この値と、Screen.Width,Heightで計算すれば
1ピクセルあたりの変換レートが求められる。
モニタのプロパティで「標準のモニタ」となっている場合、
正確な値を返すのか疑問。
モニタのプロパティで、メーカー名 型番ともに表示されている
ようなら大丈夫なのではないかと推測する。
うちみたいなマルチモニタ環境で、左と右で解像度も大きさも違うような
モニタを並べている場合、機能するわけがないとも思う。
ので、やはりユーザーに計測してもらうしかないのかもしれない。
スクリーンデバイスに対するHORZSIZEやVERTSIZEのGetDeviceCapsは、OSによってまちまちの値を返します。
9X系では解像度によってことなる値を返したり、NT4や2000では固定値(320x240)を返すだけだったりすると思います。
みなさんありがとうございます。
いろいろ調べていくと 1Inch = 2.54cmと端数でありますので ご指摘にありましたように絶対正確でというのは無理みたいですね。
またGetDeviceCaps()も使ってみたのですが かみづさんの言われる通り WinXP環境では固定値(320x240)を返すだけでした。
ある程度の誤差の事を考えて構築していきたいと考えております。みなさんアドバイスありがとうございました。
ツイート | ![]() |