問題タブ [highdpi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - DPI とデフォルト フォントの変更のサポート
そのため、フォームの AutoScaleMode プロパティが、作業中の開発マシンとは異なるフォントまたはDPIを備えたシステムをサポートするのにどのように役立つかを理解しようとしています。
SDK から:
AutoScaleMode 列挙体
public enum AutoScaleMode
デフォルトでは、.NET 2.0 フォームは AutoScaleMode.Font を使用します。
そこで、Windows XP、Tahoma 8 ポイント、96 DPI の開発マシンでサンプル フォームをデザインしました。それから私はそれを試してみました
- 14 pt Segoe UI 96 DPI マシン
- 14 pt Segoe UI 150 DPI マシン
このスクリーンショットでわかるように、結果は有望ではありませんでした。
AutoScaleMode プロパティは、さまざまなフォントまたは DPI 設定をサポートするために .NET フォームを有効にするようには設計されていません。では、さまざまなフォントと DPI 設定をサポートする適切な方法は何ですか?
.net - Graphics.MeasureString は、Win32 GetTextExtent とは異なる値を返します
文字列のサイズを測定する方法を C# で見つけようとしています。Win32 で文字列を測定する標準的な方法は、GetTextExtent を使用することです。本当の目標は、フォント文字の平均幅と高さを見つけることです。文字の平均幅を求める標準的な方法は、すべてのアルファベット文字の幅を取得し、52 で割ることから始まります。
Microsoft には、特定の DPI 設定でのいくつかのフォント サイズの平均文字幅をリストしたページがあり、GetTextExtent への私自身の呼び出しによってそれらを確認しました。
- タホマ 8pt、96dpi: 13x6 ピクセル
- タホマ 9pt、96dpi: 14x7 ピクセル
- Segoe UI 9pt、96dpi : 15x7 ピクセル
今、.NET WinForms で同じ計算を実行したいと考えています。Graphics.MeasureString() を使用して、コードを思いつきます:
残念ながら、値は既知の受け入れられている真の値と一致しません。
- タホマ 8pt、96dpi: 14x6 ピクセル(14.21x6.09 ピクセル)
- タホマ 9pt、96dpi: 16x7 ピクセル(15.98x6.85 ピクセル)
- Segoe UI 9pt、96dpi: 17x7 ピクセル(17.46x6.91 ピクセル)
平均的な文字幅は問題ありませんが、文字の高さが約 13% 大きすぎます。余分な高さは、アセンダーとディセンダーを含むように変更された高さの分類の違いによるものだと思います。測定ストリングが高すぎる場合は、次のように変更してみました。
に
弦の高さがそれほど高くないので、測定された高さは短くなるはずです。いいえ、アセンダーとディセンダーを含む文字列のバージョンとまったく同じ高さを返します(ただし、平均幅はわずかに大きくなります)。
これの原因は何ですか? また、GetTextExtent によって返される受け入れられた値と一致するように、テキストの平均高さに対して何ができるか、平均文字高さを取得できますか?
注: 文字の平均高さを取得する標準的な方法は GetTextMetrics を使用することですが、GetTextExtents によって返される高さは同じ値を返します。
.net - 120dpi 未満の .NET WinForms アプリケーションをデバッグする
現在、VMware 仮想マシン (Windows XP) を使用して、120dpi 未満の .NET WinForms アプリケーションをデバッグしています。とてもうるさい。
96dpi の作業環境で同様の結果が得られる方法を知っている人はいますか? つまり、単一のプロセスで 120dpi モードを有効にできますか、それとも Windows フォームに切り替えがありますか?
windows - Windows: 高 dpi で UI をテストするには?
アプリケーションが高dpi 設定にどのように反応するかをテストしたいと考えています。私は120dpiだけを意味しているわけではありません。次のようなより高い dpi 設定をテストしたい:
- 150dpi
- 300dpi
- 600dpi
- 1000dpi
- 1200dpi
私の開発マシンのビデオ カードは、300dpi (さらに言えば 150dpi) に必要な解像度を実行できません。
インターフェイスが768 行 (1024x768 など) のディスプレイに「適合」するように設計されていると仮定すると、より高い dpi 設定に必要な解像度は次のようになります。
必要な解像度は、150dpi でもかなり高くなります。
VirtualPCでソフトウェアを実行し、仮想マシンを6400x4800で実行し、 VNCを使用して仮想マシンに接続する方法を考えていました。その後、モニターに合わせてコンテンツをスケーリングできます。高 dpi ディスプレイの忠実度は失われますが、少なくとも見たり操作したり (つまり、テスト) することはできます。しかし、VirtualPC がエミュレートする s3 Trio 32/64 ビデオ カードは1600x1200 (つまり 150dpi) で最高です。
また、ビデオ カードのように機能する仮想ビデオ カードドライバが存在するのではないかと考えました。これは高解像度に対応していますが、それ自体は私のネイティブ デスクトップにスケーリングされて表示されます。
何か案は?
参考文献
windows - Windows アプリケーション用の高品質のアイコンを作成するにはどうすればよいですか?
より高い DPI 設定で Windows を実行している場合、デスクトップ上のほとんどのアプリケーション アイコンが見栄えが悪いことに気付くでしょう。Firefox、Skype、MS Office のアイコンはシャープに見えますが、Google Chrome などの一部の有名なアプリケーション アイコンでさえ見栄えが悪くなります。
(例)
高解像度のアイコンを使用するのではなく、低解像度のアイコンが拡大されているため、ほとんどのアイコンがぼやけて見えると思います。
アプリケーションに高品質のアイコンを提供したいのですが、Windows に高解像度のアイコンを使用するよう説得することができないようです。アイコンエディタIcoFXで多重解像度アイコンを作成しました。アイコンは16x16、24x24、32x32、48x48、128x128、および 256x256 (!) (すべてアルファ チャネルを含む 32 ビット) で提供されますが、Windows はデスクトップ上のアイコンの 48x48 バージョンを使用し、それを拡大するようです。(私は Windows 7 - 64 ビットを使用しています - アイコンは、msi (Visual Studio 2008 セットアップ プロジェクトで作成) にショートカットを設定し、それをマルチ解像度アイコンを含む .ico ファイルにポイントすることによって配置されます)
128x128 のアイコンを削除しようとしましたが、役に立ちませんでした。興味深いことに、Windows エクスプローラーでは、[特大アイコン] 設定を使用している場合でもアイコンが見栄えがします。Windows でより高い DPI 設定で見栄えのする高品質のデスクトップ アイコンを作成するにはどうすればよいですか?
編集: 128x128 オプションを削除してから、48x48 と 128x128 オプションの両方を削除してテストし、Axialis IconWorkshop でアイコンを作成しようとしましたが、何も機能しませんでした。
編集:多くの試行錯誤の後、ここでの本当の問題はVisual Studio 2008セットアッププロジェクトだと思います-実行可能ファイルへのリンクを手動で設定すると、高解像度アイコンが正しく使用されますが、セットアップによって作成されるリンクは使用しません正しいアイコン。エディターでリンクのアイコンを設定すると、48x48 アイコンのように見える 1 つのオプション (インデックス 0) しか表示されません。.vdproj の IconIndex を手動で調整しようとしましたが、うまくいきませんでした。
android - WVGA Android ブラウザで画像のスケーリングを停止するにはどうすればよいですか?
Android ブラウザーで表示する HTML ページを設計しています。この簡単な例のページを考えてみましょう:
標準の HVGA 携帯電話 (320x480) では問題なく表示されますが、HDPI WVGA サイズ (480x800 または 480x854) では、組み込みブラウザーが自動的に画像を拡大します。それは醜く見えます。
このタグを使用して、ブラウザーがページのスケーリングを強制的に停止できるようにする必要があることを読みました。
...しかし、ユーザースケーリングを無効にするだけです(ズームボタンが消えます)。実際には、ブラウザが私の画像をスケーリングするのを妨げません。倍率を調整 (すべて 2.0 または 0.5 に設定) しても、まったく効果がありません。
WVGA ブラウザに画像のスケーリングを強制的に停止させるにはどうすればよいですか?
android - Androidで480X800と480X854の画面を区別する方法は?
480X800 と 480X854 の画面を区別する方法。1 つの画像を hdpi フォルダーに配置するオプションがあります。私の場合、480X800 画像は 480X854 画像をサポートしていません。下部に空白が表示されます。何かアイデアはありますか?
編集:画像を背景として設定しました。私のレイアウトでは、余白のある透明な画像ビューがあります。画像ビューをクリックすると、何らかのタスクが実行されます。しかし、これらの2つの画面の間。1つの値を調整できます。別のものでは、画像がわずかに引き伸ばされました。それから私は何ができますか?私の問題を理解できますか?助けてください。
c++ - Windows DPI 設定をプログラムで決定しますか?
dpi 非対応の MFC アプリケーションの 1 つに問題があります。
システム設定を高 dpi (120 または 144 dpi など) に変更すると、タスクバーのアプリケーション アイコンがめちゃくちゃに見えます。WNDCLASS
残念ながら、メインフレーム用に独自に登録する必要があり、WNDCLASS.hIcon
メンバーにアイコンを設定する必要があります。このアイコンはLoadIcon
関数を使用してロードされます。GetSystemMetrics(SM_CXICON)
そして、その関数は、120dpi の場合は 40x40 ピクセルである標準サイズ ( によって返されるものと同じ) で画像をロードしようとします。そのサイズのアイコンを提供していないため、残念です。しかし、これには回避策があります: 不思議なことに、dpi 仮想化は 120 dpi に対して有効ではないように見えますが、GetDeviceCaps(..., LOGPIXELSX)
実際には 120 dpi を返し、GetSystemMetrics(SM_CXICON)
40 を返します。これをキャッチして、アイコンを別のサイズでロードするだけです。しかし、144 dpi では機能しません。仮想化が有効になっているように見え、96 dpi と 32 ピクセルが得られるため、アイコンが非常に見苦しくなります。メンバーをに設定すると、アイコンが正常に表示さ
れることがわかりました。しかし、MSDNによると:WNDCLASS.hIcon
NULL
hIcon
クラス アイコンへのハンドル。このメンバーは、アイコン リソースへのハンドルである必要があります。このメンバーが NULL の場合、システムはデフォルトのアイコンを提供します。
では、そのメンバーを NULL に設定しても、アイコンが常に表示されると期待できますか? もう1つの方法は、アイコンを正しいサイズでロードすることですが、そのためには、システムが実際に144 dpiに設定されていることを知る必要があります. ここまでが私の最初の質問です。システムの DPI 設定を (dpi 仮想化アプリケーション内から) 判別できるかどうかを知っている人はいますか? dpi 対応のアプリケーションに実際の dpi などを教えてもらうなど、汚いことをすることも考えましたが、可能であればそのようなことは避けたいと思います。
よろしくお願いします、
フンバガンバ
更新:メインフレームのアイコンがデフォルトのアイコンに置き換えられるため、メンバーをに
設定することは良い考えではないことがわかりました(タスクバーでは問題なく見えますが...) - 私はその間に気づきませんでした私の最初のテスト。WNDCLASS.hIcon
NULL
delphi - Troubleshooting DPI Virtualization and DPI-aware applications, in Windows Vista and Windows 7
I have a problem where an application (written in Delphi) is behaving properly at default 96 DPI settings on all systems, but is behaving inconsistently at the "150% text size" (internally 144 dpi) setting, on different systems. It seems that on some systems, that certain text/font parts of my application are being stretched and on other systems, they aren't. I would have thought that my application, on a certain version of Windows (Win7), at a certain DPI, should behave the same way.
Either my application will make it known to Windows that it doesn't need the DPI Virtualization feature, or it will not. That much I understand. What I don't understand is how DPI changes can cause different appearance on two machines, both running Windows 7, both at 144 dpi, displaying the same fonts and forms at the same fixed sizes.
Is there some configuration-dependant elements involved in DPI Virtualization that I need to inspect in windows (registry etc)? Otherwise, how do you troubleshoot and know whether DPI virtualization is being done on your client window?
In Delphi, one has to set the TForm.Scaled property to false, if one doesn't want scaling. But what I don't understand is that when the main form's Scaled property is true, I cannot always predict the outcome.
What is most perplexing to me in my application, is that I have a control that only misbehaves in my large real application, but which does not misbehave in a standalone app where I am trying to debug just the control. To understand the control behaviour in a standalone app I was forced to make a demo app where I force the DPI awareness in via the manifest file. Then I can reproduce the control drawing glitch, although in a different form.
Here is the manifest file I use in my demo app, which exposes the problems that my controls have with dealing with high-dpi settings in windows. However, one strange thing I have found is that it is possible for an application
here's an example of one of about 30 places where the controls in my application are messed up when I disable DPI virtualization in my app. This particular glitch was solved by turning off the Scaled property in my form. But in other places, having TForm.Scaled=false causes the problem, whereas in some forms, it fixes it:
Update: It turns out that some of my controls use GDI+ and that font behaviour in GDI+ contexts is different than font behaviour in normal GDI contexts, at least for certain third-party controls that use GDI+. That's a major source of headaches. Secondly, there is the spotty test coverage and poorly-defined requirements, for DPI awareness, in the VCL. Some VCL controls are based on MS Common Controls, and while it's fair to say that the underlying common controls probably work fine in high-DPI situations, not all the VCL control wrappers can be guaranteed to work correctly. So, reviewing an application for high-DPI-awareness in all its controls, as well as correct behaviour in all available windows 7 themes:
- aero glass on, at 96dpi (Default Win7 appearance on most modern hardware)
- basic theme (aero glass off) but xp themes enabled
- classic win2000 look where glass is off, as well as xp level themes,
- high contrast white
- high contrast black
- Various Other-than-96-DPI settings
..and the list goes on., and you have a pretty heavy burden, as an application developer. Whether you are a delphi user and use the VCL, or you are an MFC/ATL C++ developer, it seems to me, that supporting all of the various quirky windows modes is a burden almost too heavy to bear. So most people don't bother. Am I right?
wpf - WindowsのフォントサイズオプションでWPFがスケーリングされないようにするにはどうすればよいですか?
WPF GUI を Windows フォント サイズ オプション (DPI) で拡大縮小したくありません。スケーリングは UserControl のイメージと境界線に影響するため、UserControl で固定フォント サイズを指定するだけの問題ではありません。スケーリングをオフにするために UserControl に設定できるプロパティはありますか? そうでない場合、どうすればそれを行うことができますか?