画面テキスト拡大率を150%でMetafileをStretchDrawしたい


Jasmine  2013-12-19 03:29:06  No: 45755

Metafileで作った描画データを,StretchDrawでPaintboxに描画していますが,win7やwin8の画面の個人設定でテキスト拡大率を150%(125%超)にすると,小さく表示されてしまいます。
正しく表示されるようにするには,どうすればよいでしょうか。

以下のコードで再現します。
画面の対角線いっぱいに表示されるはずですが,小さく表示されます。

procedure Tform1.Paintbox1Paint(Sender: TObject);
var
   metaFile1 : Tmetafile;
   Mcanvas : Tmetafilecanvas;
begin
     //以下,テキストの拡大率が125%を超えると,小さく表示される
     metafile1 := Tmetafile.create;
     Metafile1.Height  := Paintbox1.Height;
     Metafile1.Width := Paintbox1.width;
     MCanvas := TMetafileCanvas.Create(Metafile1,0);
     with mcanvas do
     begin
        pen.Width := 10;
        pen.Color := clred;
        moveto(0,Paintbox1.height);
        lineto(Paintbox1.width,0)
     end;
     Mcanvas.free;
     Paintbox1.canvas.stretchdraw(rect(0,0,Paintbox1.width,Paintbox1.Height),Metafile1);
     Metafile1.free;
     //Paintbox1.canvas.Draw(0,0,Metafile1);
     //StretchDrawではなくDrawを使うと正しく表示される
end;


Jasmine  2013-12-19 04:50:48  No: 45756

補足です。
使用環境は,win7 + DelphiXE3(VCL)
また,上記プログラム中のPaintbox1ですが,Align = alClient で,
ウィンドウの上にはPaintbox1しか配置していません。


monaa  2013-12-25 06:33:19  No: 45757

XE2での確認ですが、アプリケーションが高DPIに対応していればそのまま取得可能です。
Delphi2009 での高DPI対応
https://www.petitmonte.com/bbs/answers?question_id=8053

未対応の場合
HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI
にDPIが書かれていますので、そこから取得可能です。
私の環境では
100%のとき96=PixelsPerInch
150%のとき144
でした。
144/96*100=150%です。
Metafile1.Height  := Round(Paintbox1.Height*144/PixelsPerInch);

パッと見た感じですが、Windowsのバグだと思います。


Jasmine  2013-12-28 09:37:26  No: 45758

私の環境では,拡大率125%ですので,
HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI
Screen.PixelsPerInch
ともに 120 でした。
この条件で,
> Metafile1.Height  := Round(Paintbox1.Height*144/PixelsPerInch);
を実行すると,小さく表示されてしまいます。
拡大率が125%以下のときは,画面DPIの値に関わらず,ビットマップの拡大は行われないようなのです。


KHE00221  2013-12-28 15:27:11  No: 45759

>画面の対角線いっぱいに表示されるはずですが,小さく表示されます。

XE2 + win7 HP で対角線いっぱいに表示されるよ


monaa  2013-12-29 06:19:43  No: 45760

125%でPixelsPerInch=120だとすると、XE3は高DPIに対応するみたいですね。
だとすると、
Metafile1.Height:= Paintbox1.Height;
Metafile1.Width := Paintbox1.Width;
でXE2なら正しく表示されます。

「win8でResolutionScacleを知りたい」
https://www.petitmonte.com/bbs/answers?question_id=8215
↑の質問もされているみたいなので、てっきりXE3は高DPIに対応していないのかと思ってました。

とにかく、XE2では正常に描画できてしまうので、私にはこれ以上はわかりません。
XE3以上で仕様が違うのかな?


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








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