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;
補足です。
使用環境は,win7 + DelphiXE3(VCL)
また,上記プログラム中のPaintbox1ですが,Align = alClient で,
ウィンドウの上にはPaintbox1しか配置していません。
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のバグだと思います。
私の環境では,拡大率125%ですので,
HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI
Screen.PixelsPerInch
ともに 120 でした。
この条件で,
> Metafile1.Height := Round(Paintbox1.Height*144/PixelsPerInch);
を実行すると,小さく表示されてしまいます。
拡大率が125%以下のときは,画面DPIの値に関わらず,ビットマップの拡大は行われないようなのです。
>画面の対角線いっぱいに表示されるはずですが,小さく表示されます。
XE2 + win7 HP で対角線いっぱいに表示されるよ
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以上で仕様が違うのかな?
ツイート | ![]() |