1

LoadCursor関数を使用してリソースからカーソルをロードすると、結果はHCURSOR異なるモニター間で使用でき、常に正しいサイズで表示されます。

すなわち: 通常:

  • 96 dpi モニターでは、32x32 リソースが使用されます。
  • 192 dpi モニターでは、64x64 リソースが使用されます。

ただし、メモリからカーソルをプログラムで作成すると (たとえば、 and を使用LookupIconIdFromDirectoryExしてCreateIconFromResourceEx)、結果のカーソルの解像度は固定されます。これは、混合 DPI マルチモニター設定で、少なくとも 1 つのモニターで間違ったサイズで表示されることを意味します。

もチェックアウトしましたがLoadCursorFromFile、これも のような動的解決動作を提供しますLoadCursor

表示されているモニターに応じて動的に切り替わるカーソルをプログラムで作成する方法はありますか? ロードされたカーソルが異なる動作をするために、舞台裏でどのような魔法が起こっているのLoadCursorでしょうか?

4

1 に答える 1

2

scaleWithDpi多くの実験の後、オプションが使用されている場合、WPF がリソースとメモリ ストリームからカーソルをロードし、正しい DPI 動作を取得できることを最終的に発見しました。

public Cursor(Stream cursorStream, bool scaleWithDpi)

LoadFromStream参照ソースを見ると、ストリームを一時ファイルに書き込み、ファイルからロードすることでストリームをロードする 関数になります。ソースを見る

総括する:

  • このような動的 DPI カーソルを取得する唯一の方法は、Win32 ネイティブ リソース ロード関数を使用し、ファイルからロードすることです。この動作では、カーソルをメモリから直接ロードできるようには見えません。
  • この動作の「動的 dpi」部分は、関数LR_DEFAULTSIZEに渡されるフラグに関連しているようです。LoadImage
于 2021-08-17T01:14:37.123 に答える