在 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 压缩的,其他的是原始的。所有尺寸在文件中的分辨率下看起来都很棒(我试图将 ICO 放在这里或 imgur 中,但显然两者都不允许图标)。此外,我尝试包含一些 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 );