Windows ボリューム ミキサーでは、アプリケーションがサウンドを再生すると、アプリケーションのアイコンとカスタム ボリューム スライダーが追加され、そのアプリケーションに固有のボリュームが調整されます...いいですね! ただし、アプリケーションに大きなサイズのアイコンを使用すると (Windows がタスクバーなどのアイコンをスケーリングするときに高 DPI で特に重要)、ボリューム ミキサーのアイコンは正しくスケーリングされません。具体的には、次のコードは、アプリケーションのアイコンを設定するために使用するものです。
// set icons the normal way
cWnd.SetIcon( theApp.LoadIcon( res_id ), FALSE );
cWnd.SetIcon( theApp.LoadIcon( res_id ), TRUE );
// set hi-res if available
OSVERSIONINFO osv;
osv.dwOSVersionInfoSize = sizeof( osv );
if ( GetVersionEx( &osv ) ) {
// if we're Vista or more recent, use hi-def icons
if ( osv.dwMajorVersion >= 6 ) {
HICON hIcon = (HICON)::LoadImage( theApp.m_hInstance, MAKEINTRESOURCE( res_id ), IMAGE_ICON, 256, 256, LR_SHARED );
if ( hIcon ) {
cWnd.SetIcon( hIcon, TRUE );
}
}
}
犯人は「利用可能な場合はハイレゾ」の部分です。それを含めると、タスクバーのアイコンは見栄えがしますが、音量ミキサーはスケーリングされておらず、見栄えが悪くなります。それを除外すると、タスクバーのアイコンは見栄えが悪くなります (スケーリングがひどい) が、ボリューム ミキサーは少なくとも適切なサイズです。
両方のアイコンが見栄えがするようにするソリューションを見つけた人はいますか?
編集:私のアイコンファイルには、次の解像度があります:256x256、48x48、32x32、24x24、および16x16、すべて32ビット。256x256 のものは PNG で圧縮されており、その他は未加工です。すべてのサイズは、ファイル内の解像度で見栄えがします(ここまたは imgur に ICO を配置しようとしましたが、どうやらアイコンを許可していないようです)。さらに、いくつかの 8 ビット イメージを含めてみましたが、状況は変わらないようです。
編集:GetDeviceCaps( hdc, LOGPIXELSX )
デスクトップのスケーリングを決定するために(およびY)を使用しています。通常、デスクトップのスケーリングは 100% で、通常の 96 の結果が得られます。しかし、コンピューターのデフォルトが 125% になっていることがますます増えています。これは、デスクトップ、パーソナライズ、その他を右クリックして変更できます。表示... そこにスライダーがあります (変更するにはログアウト/ログインが必要です)。
編集: また、トレイ アイコンは、高 DPI モード (つまり、を使用する場合) で同様のスケーリングの問題が発生することを指摘したいと思いますShell_NotifyIcon
。ただし、この場合、GetDeviceCaps( hdc, LOGPIXELSX )
Windows が何を望んでいるかを判断するために使用できます。サイズがある場合は直接指定し、そうでない場合は 256x256 を指定すると、Windowsはそれを正しくスケーリングします。
編集:悲しみが続く。この問題は、Windows の問題である可能性があります。デモンストレーション用に画像をキャプチャしているときに、ボリューム ミキサーのアイコン自体が見栄えが悪いことに気付きました。比較のために:
最終編集: 以下で説明するように、問題の回避策はアイコンを拡大縮小することです。LoadIconWithScaleDown
そのため、機能する最終的なコードは、関数へのポインターをComctl32.dll
(図示せず) からロードし、使用可能な場合はそれを使用するか、「通常の/古い」方法にフォールバックすることです。
HICON hIcon = 0;
if ( FAILED( comctl32Loader.LoadIconWithScaleDown( theApp.m_hInstance, MAKEINTRESOURCE( res_id ), GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), &hIcon ) ) ) {
hIcon = theApp.LoadIcon( res_id );
}
cWnd.SetIcon( hIcon, FALSE );
if ( FAILED( comctl32Loader.LoadIconWithScaleDown( theApp.m_hInstance, MAKEINTRESOURCE( res_id ), GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), &hIcon ) ) ) {
hIcon = theApp.LoadIcon( res_id );
}
cWnd.SetIcon( hIcon, TRUE );