デスクトップ上の長さを測るには

解決


カレーライズ  2006-05-06 21:20:55  No: 21381

お世話になります。Delphi初心者です。
  今、デスクトップ上で開始点と終了点を指定すると2点間の長さ(XX.Xcm)で測る機能を作成したいと考えています。そこで疑問なのですがデスクトップ上の”1cm”というのはどのように計算すればいいのでしょうか??
解像度から計算を求めればいいのでしょうか? 1Pixelからなんらかの計算を行えばいいのでしょうか?  
  以上ご教授よろしくお願いしたいと思います


あばうと  2006-05-06 22:02:47  No: 21382

垂直方向の論理インチとピクセル数の対応は、PixelsPerInchぷろぱてぃ。
水平方向はこれにあらず。


かみづ  2006-05-07 09:39:11  No: 21383

デスクトップ上の”1cm”というのが、ディスプレイ上の”1cm”を指しているのであれば、ユーザにディスプレイの表示領域のサイズを入力させなければ出来ないと思います。


一応APIはあるっぽいが。  2006-05-07 17:14:59  No: 21384

絶対、正確で、どんな環境でも
っていう条件だと無理。

一応、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ピクセルあたりの変換レートが求められる。

モニタのプロパティで「標準のモニタ」となっている場合、
正確な値を返すのか疑問。
モニタのプロパティで、メーカー名 型番ともに表示されている
ようなら大丈夫なのではないかと推測する。

うちみたいなマルチモニタ環境で、左と右で解像度も大きさも違うような
モニタを並べている場合、機能するわけがないとも思う。

ので、やはりユーザーに計測してもらうしかないのかもしれない。


かみづ  2006-05-07 22:24:50  No: 21385

スクリーンデバイスに対するHORZSIZEやVERTSIZEのGetDeviceCapsは、OSによってまちまちの値を返します。
9X系では解像度によってことなる値を返したり、NT4や2000では固定値(320x240)を返すだけだったりすると思います。


カレーライズ  2006-05-08 02:14:44  No: 21386

みなさんありがとうございます。
  いろいろ調べていくと 1Inch = 2.54cmと端数でありますので  ご指摘にありましたように絶対正確でというのは無理みたいですね。
  またGetDeviceCaps()も使ってみたのですが  かみづさんの言われる通り  WinXP環境では固定値(320x240)を返すだけでした。
  ある程度の誤差の事を考えて構築していきたいと考えております。みなさんアドバイスありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加