3

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.hIconNULL

hIcon
クラス アイコンへのハンドル。このメンバーは、アイコン リソースへのハンドルである必要があります。このメンバーが NULL の場合、システムはデフォルトのアイコンを提供します。

では、そのメンバーを NULL に設定しても、アイコンが常に表示されると期待できますか? もう1つの方法は、アイコンを正しいサイズでロードすることですが、そのためには、システムが実際に144 dpiに設定されていることを知る必要があります. ここまでが私の最初の質問です。システムの DPI 設定を (dpi 仮想化アプリケーション内から) 判別できるかどうかを知っている人はいますか? dpi 対応のアプリケーションに実際の dpi などを教えてもらうなど、汚いことをすることも考えましたが、可能であればそのようなことは避けたいと思います。

よろしくお願いします、

フンバガンバ

更新:メインフレームのアイコンがデフォルトのアイコンに置き換えられるため、メンバーをに
設定することは良い考えではないことがわかりました(タスクバーでは問題なく見えますが...) - 私はその間に気づきませんでした私の最初のテスト。WNDCLASS.hIconNULL

4

1 に答える 1

5

DPI仮想化をオフにするには、プログラムにマニフェストを追加する(または既存のマニフェストを編集する)必要があります。次のようになります。

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>true</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

それがいくつかの新しい問題を引き起こす可能性は低いです。これについて知りたいことはすべて、このMSDNライブラリの記事で十分に説明されています。

于 2010-08-17T14:57:07.213 に答える