Delphi XE2 pro Win7 pro です。
封筒の宛名印刷ソフトを作成しています。
封筒サイズ等によって印字位置を指定するために、画面に封筒の実寸大のPanelを表示して、文字・バーコードの印字の位置をドラッグによって位置決めをさせています。
画面サイズ1280×768で実寸大表示に設計しうまくゆきましたが、別の1366×768のモニタでは実寸より小さく表示されてしまいます。
設計がピクセル単位であり、設計した環境とDPIが異なるためと考えていますが、モニタのDPIの違いをプログラム側で変換吸収し、どのモニタでも実寸表示する方法はないでしょうか。
同様な質問が過去にもあったようですが、その内容を読んでも理解が足りないのか解決しません。
ご教授ください。
以下の記事を参考にしてみてください。
[UI の最小サイズを試算する (ONKYO TW317A5 の活用)]
http://ht-deko.minim.ne.jp/tw317/#05_06
# "正確な実寸" はディスプレイを実測しないと出せないかと。
センチメートル単位で良ければEDIDを調べればモニタの物理サイズが分かります。
これと解像度を組み合わせればピクセル単位の大きさは分かります。
EDIDはレジストリ上にあり、パスは以下です。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY
該当するモニタのキーはEnumDisplayDevicesを使う等して得ます。
EDID自体はさらに深いところ(Device Parametersキーの中)にあります。
EDIDの仕様については以下が詳しいです。
http://en.wikipedia.org/wiki/Extended_display_identification_data
検索したところサンプルコードもありましたので参考にしてください。
http://stackoverflow.com/questions/577736/how-to-obtain-the-correct-physical-size-of-the-monitor
DEKOさん、77%オフさん、ありがとうございました。
モニターを実測しないで済みそうな、77%オフさんの方法でと、レジストリーをのぞいてみましたが、Reg_Binaryの値を使うのでしょうか?
結局よくわからず、ズームボタンを追加して、間に合わせることとしました。
ひとまず解決としますが、私的には継続テーマとします。
ありがとうございました。
>設計した環境とDPIが異なるためと考えていますが
とりあえず,以下のことを確認してみたらどうでしょう ?
もう確認済みでしたらゴメンナサイ.
(1) 「ファイル名を指定して実行」で以下のコマンドを実行する
control.exe desk.cpl,Monitor,@Monitor
(2) ダイアログの [解像度] の値を,現在とは別の値にする
(3) その開発中のアプリを起動して,前の解像度の時と見比べる
この結果によって,
>、どのモニタでも実寸表示する方法
というのは,少し意味違ってきます.
解像度によって違うのか,モニタによって違うのかは,原因と対策が別です.
本人が閉めてしまったので,情報として.
EDID の情報は,WMI を使用しても取得できます.
レジストリから取得する場合,バイナリデータ,WMI を使用しても一部はバイナリのデータです.
意味ある値にするには,数値や文字列(ASCII) に変換が必要です.
モニタの実寸,ミリメートル単位ですが,以下のように取得できます.
http://mrxray.on.coocan.jp/Delphi/plSamples/020_DisplayResolution.htm#09
Mr.XRAYさん、ありがとうございした。
ご紹介をいただいたページをそっくりコピペして、DPIも、画面サイズも取得できることを確認しました。
俄然やる気が出ました。解決しそうです。
また報告します。
ツイート | ![]() |