[delphi-users:5155] Delphi XE4 高DPI対応について

194 views
Skip to first unread message

kuze

unread,
May 4, 2019, 9:31:09 PM5/4/19
to delphi...@freeml.com

皆様

久世です。

最近は、高DPI環境が増えてきておりアプリ側への対応が必要と思うのですが
具体的な対応方法について相談させてください。
OSは、主にWin10を考えております。
高DPI環境では、従来のソフトのフォントがボケて表示されるという理解です。
ボケ対応としてDelphiXE4での具体的な方法にいて悩んでいます。
対応は、下記という理解です。

Not DPI Aware   : 高DPIに対応していないアプリケーション
System DPI Aware : 高DPIに対応しているアプリケーション。
          ただし、モニターごとのDPIには対応していません。
Per monitor DPI Aware : Windows 8.1でサポートされたモニターごとの
            DPIの設定にも対応しています。
通常はNot DPI Awareになっているため、System DPI Aware以上に変更が必要

手順としては下記と考えています。
1.カスタムのマニフェストに変更
2.TForm.Scaled = True → Falseに変更
3.PixelsPerInchに応じて、フォントやVCLのパーツのサイズを調整

ここで、まず1についての質問です。
Delphi 10であれば、Per-Monitor V2 の設定ができるようなのですが、
Delphi XE4にはそのような設定はありません。
そこでカスタムマニフェストを使用するしかないと考えています。
具体的には、
1-1. C:\Program Files\Embarcadero\RAD Studio\11.0\bin
\default_app.manifest
を、対象のアプリのソースのフォルダーにコピー
1-2. 「プロジェクト」→「オプション」→「アプリケーション」の
   「ランタイムテーマ」の項目で 「カスタム マニフェストを使用する」
を選択し、カスタムマニフェストに先のコピーした
default_app.manifestを指定する
1-3. マニフェストに、<dpiAware>true</dpiAware>を追記する
ここまですると、OS側からの認識はSystem DPI Aware以上に
変更できると思っています。

マニフェストをあまり変更したことがないため、カスタムマニフェストを
使用した場合、各OSのテーマが正しく適用されるのかがよくわかっていません。
1-1のファイルをベースにしているので問題ないと考えてよいのでしょうか?
教えて下さい。

ちなみに、3のサイズ調整については
3-1. Screen.PixelsPerInchと、Form.PixelsPerInchを比較して
設計時との現在の比率を計算。
K = Screen.PixelsPerInch / Form.PixelsPerInch
3-2. Windowsの標準解像度は96DPIで、1Pointは1/72インチであるため
1ポイントのドット数を計算するときは
標準 :フォントサイズ/72*96
高DPI:フォントサイズ/72*Screen.PixelsPerInch
3-3. ボタンなどのサイズは、上記フォントサイズを考慮して変更
3-4. WM_DPICHANGED のメッセージに応じてサイズは、再計算必要
と考えています。


MLホームページ: https://www.freeml.com/delphi-users

----------------------------------------------------------------------
スマホアプリ版で100万ダウンロード突破の
「キャプテン翼ZERO~決めろ!ミラクルシュート~」
HTML5ゲームプラットフォーム「ゲソてん byGMO」にて、
PCブラウザ版を好評配信中!
https://gesoten.com/games/genre/sports/tsubasa-zero
------------------------------------------------------[freeml byGMO]--

あなたの街のチラシがいつでも無料で見放題!
チラシをクリックしてチラシが拡大されたらポイントゲット♪
まずはかんたん登録♪ -ポイントタウン-
https://www.pointtown.com/ptu/rd.cgi?cid=8912
----------------------------------------------------------------------

kuze

unread,
May 4, 2019, 9:45:22 PM5/4/19
to delphi...@freeml.com
皆様

久世です。

1-3の追記項目は、正確にはもっと複雑で
<asmv3:application>
<asmv3:windowsSettings
xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>True</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>

です。

kuze

unread,
May 9, 2019, 9:57:17 AM5/9/19
to delphi...@freeml.com
皆様

久世です。

事後報告です。
まだ、試行錯誤中ですが、カスタムマニフェストを
使用することで、
高DPI環境下で、フォントがボケる問題は回避できました。
あとは、なんとかなりそうです。

なお、カスタムマニフェストは下記のようにしています。
参考までにご報告いたします。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="DelphiApplication"
version="1.0.0.0"
processorArchitecture="*" />
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*" />
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<dpiAware>True/PM</dpiAware>
</asmv3:windowsSettings>
<asmv3:windowsSettings
xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
<dpiAwareness>PerMonitorV2, PerMonitor</dpiAwareness>
</asmv3:windowsSettings>
</asmv3:application>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista and Windows Server 2008 -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
<!-- Windows 7 and Windows Server 2008 R2 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
<!-- Windows 8 and Windows Server 2012 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
<!-- Windows 8.1 and Windows Server 2012 R2 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
<!--Windows 10-->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
</assembly>
Reply all
Reply to author
Forward
0 new messages