В микшере громкоговорителя Windows, когда ваше приложение воспроизводит звуки, оно добавляет значок вашего приложения и пользовательский ползунок для регулировки тома, специфичного для этого приложения ... приятно! Однако при использовании значка большого размера для вашего приложения (особенно важно в высоком DPI, когда Windows масштабирует ваши значки на панели задач и т. Д.), Значок в Volume Mixer не масштабируется правильно. В частности, следующий код, что я использую, чтобы установить значок приложения:Размер значка объемного громкоговорителя Windows слишком большой
// 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);
}
}
}
Виновником является «Hi-Res если доступно» часть. Если я включу это, значок панели задач выглядит великолепно, но Volume Mixer не масштабируется и выглядит ужасно. Если я исключаю, что панель задач значок выглядит плохо (страшное масштабирование), но Volume Mixer по крайней мере, это правильный размер:
Кто-нибудь нашел решение, которое делает его так, чтобы иконки хорошо выглядеть ?
EDIT: В моем файле значков у меня есть следующие разрешения: 256x256, 48x48, 32x32, 24x24 и 16x16, все 32-разрядные. 256x256 один сжимается PNG, остальные - необработанные. Все размеры отлично смотрятся на разрешениях, которые они находятся в файле (я пытался разместить ICO здесь или в imgur, но, по-видимому, не допускал значков). Кроме того, я попытался включить некоторые 8-битные изображения, но это, похоже, не меняет ситуацию.
EDIT: Я использую GetDeviceCaps(hdc, LOGPIXELSX)
(и Y) для определения масштаба рабочего стола. Обычно масштабирование рабочего стола составляет 100%, и я получаю нормальный результат 96. Но все больше и больше я вижу компьютеры по умолчанию 125%. Это можно изменить, щелкнув правой кнопкой мыши «Рабочий стол», «Персонализировать», другое: «Дисплей» ... там есть слайдер (для выхода требуется вход/выход для изменения).
EDIT: Я также хочу отметить, что лоток ICON страдает подобный вопрос масштабирования судьбы, когда в высоких DPI режимах (то есть, при использовании Shell_NotifyIcon
). В этом случае, однако, я могу использовать GetDeviceCaps(hdc, LOGPIXELSX)
, чтобы определить, чего хочет Windows. Если у меня есть размер, предоставьте его напрямую, в противном случае укажите 256x256, а Windows сделает.
EDIT: Печаль возникает. Эта проблема может быть проблемой Windows. При захвате изображений в демонстрационных целях я заметил, что значок объемного микшера сам выглядит бедно. Для сравнения:
FINAL EDIT: Как описано ниже, обходной путь для проблемы является масштабирование значков. Таким образом, окончательный код, который работает, чтобы загрузить указатель на функцию 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);
Вау, благодарю вас за все ваши детали и анализ. В моем ICO-файле все резолюции хорошо отражают резолюции, которые я предоставляю (см. EDIT выше).Мое нижнее изображение «jaggy» действительно масштабируется Windows (у меня нет ICO, который выглядит так, как в моем ICO-файле). Windows делает это, когда находится в режиме более высокого DPI. К вашему моменту, когда я делаю GetDeviceCaps при обычном масштабировании рабочего стола (100%), я получаю 96 ... но если я настрою свой рабочий стол на 125% масштабирование или масштабирование на 200% (щелкните правой кнопкой мыши Desktop, Personalize, other: Display), Я получаю другой DPI, и Windows требует, чтобы большие изображения начали масштабировать ИКОНы этим «плохим» способом. – mark
Net-net of above: если я «разрешу Windows решить», что ICO использовать в режиме с высоким разрешением DPI (т.е. без «LoadImage» или через «GetSystemMetrics (SM_CXSMICON)»), тогда он выбирает значок с низким разрешением и масштабируется (и плохо). – mark
Просто чтобы убедиться, что я не сходил с ума, я использовал свой код вместо моего ... он выглядит «просто отлично» при 100% масштабировании рабочего стола. Я поместил свой рабочий стол на 125% масштабирование, и * оба * тома Mixer и иконки панели задач выглядят плохо (искажения артефактов). – mark