у меня есть CListCtrl контроль (или Посмотреть список в Win32), который создается с LVS_REPORT стиль.
Я намерен отображать значки в его элементах как таковые:
Но вопрос в том, какого размера иконки мне нужно сделать и загрузить?
Позволь мне объяснить. Из старых образцов Win32 я вижу, что каждый создает списки изображений с иконками 15×15 пикселей. Но проблема в том, что это выглядит ужасно неровной на любом современном ПК с более высоким Настройки DPI. Поэтому я искал динамический способ определения соответствующего размера списков изображений для CListCtrl.
А также первая часть вопроса, какой размер иконки я должен сделать изначально?
РЕДАКТИРОВАТЬ
PS: С тех пор, как появилось масштабирование DPI, как вы узнали об этом? В настоящее время я использую следующий подход:
//No error handling for brevity
HDC hDC = ::GetDC(hAppsMainWindowHandle);
int nCx = ::GetDeviceCaps(hDC, LOGPIXELSX);
int nCy = ::GetDeviceCaps(hDC, LOGPIXELSY);
::ReleaseDC(hAppsMainWindowHandle, hDC);
//I technically get horizontal & vertical scaling --
//can those be different?
double scalingCx = (double)nCx / 96.0; //1.0 = 100%
double scalingCy = (double)nCy / 96.0;
Масштабирование шрифта — это что-то другое?
Представление списка использует «маленький» или «большой» список изображений в зависимости от его режима. В режиме отчета используется «маленький» список изображений. Ты можешь использовать GetSystemMetrics()
чтобы получить размеры «маленьких» изображений, используя SM_CXSMICON
а также SM_CYSMICON
метрики (использование SM_CXICON
а также SM_CYICON
для «больших» изображений).
Обратите внимание, что возвращаемые значения будут виртуальными / масштабированными, если ваше приложение не поддерживает DPI, поэтому для получения точных значений убедитесь, что оно поддерживает DPI через SetProcessDPIAware()
, SetProcessDpiAwareness()
, или манифест DPI.
ОбновитьЯ только что наткнулся на эту функцию, она может пригодиться вам при написании приложения с поддержкой DPI:
Сделайте большие изображения и позвольте API масштабировать их до меньших размеров.
Представление списка стилей отчета требует маленьких значков, то есть значков с SM_CXSMICON
от SM_CYSMICON
метрики. Предполагая, что ваше приложение поддерживает высокий уровень DPI, фактическое значение этих метрик зависит от выбранного пользователем масштабирования шрифта или настройки DPI. Таким образом, заранее вы не можете знать, какие значки размера должны быть использованы. Вы должны запрашивать системные показатели во время выполнения и использовать значки соответствующего размера.
Теперь, какой размер значков вы включаете в свой исполняемый файл, зависит от того, какие настройки DPI вы хотите поддерживать. Еще в дни XP можно было ожидать разумного масштабирования шрифтов 100% и 125%. В наши дни широко распространены дисплейные панели с высокой плотностью, и вам действительно необходимо поддерживать большие соотношения. По крайней мере, 150% и 200%, и вполне вероятно, 175%.
Ближайшее, что я могу найти к руководству, находится в этой статье MSDN: http://msdn.microsoft.com/en-US/library/windows/desktop/dn742485.aspx
Эта статья была написана примерно в сроки Vista и уже показывает ее возраст. Я думаю, что вы должны использовать эти статьи в качестве руководства и адаптироваться к аппаратным средствам дня.
Вы также обнаружите, что люди запускают свои машины со значениями масштабирования шрифта между круглыми числами, перечисленными выше, и в статье, на которую я ссылаюсь. Один из моих коллег работает на 120%. Интересно, что это выдвинуло на первый план различные ошибки в нашем коде, поэтому всегда полезно, чтобы кто-то преследовал вашу программу.
Когда вы создаете свои списки изображений во время выполнения, измеряйте их в соответствии с метриками системы. И старайтесь избегать масштабирования иконок. Например, если системные метрики предполагают значки 18px, а у вас есть только значки 16px и 20px, то создайте новые значки 18px. Заполните изображение прозрачными пикселями и поместите значок 16 пикселей в середину этого изображения 18 пикселей. Сделайте иконку из этого. Такой подход позволит избежать проблем с наложением.