Как получить иконку IDI_EXCLAMATION при размере шрифтов 150%

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Как получить иконку IDI_EXCLAMATION при размере шрифтов 150%

Сообщение Pantalone » 08.06.2016 (Ср) 22:57

Дело в следующем. В приложении вместо системных MsgBox используются свои собственные сообщения, но иконки берутся системные таким способом:

Код: Выделить всё
Dim hIcon As Long
Dim hIcon2 As Long
Dim hIcon3 As Long
'так
hIcon = LoadIcon(0, IDI_EXCLAMATION)
DrawIcon Picture1.hDC, 0, 0, hIcon
'или так
hIcon2 = LoadIcon(0&, IDI_EXCLAMATION)
DrawIconEx Picture2.hDC, 0, 0, hIcon2, 0, 0, 0&, 0&, DI_NORMAL
'еще вот так
hIcon3 = LoadIcon(0&, IDI_EXCLAMATION)
DrawIconEx Picture3.hDC, 0, 0, hIcon3, 48, 48, 0&, 0&, DI_NORMAL


Проблема в том, что на 7 винде при размере системных шрифтов 150% иконки таким макаром рисуются мелкие и растягиваются, в то время, как системное MsgBox "Test", vbExclamation выдает нормальную крупную.
Прилагаю тестовый примерчик, для проверки надо увеличить шрифт системы до 150% и нажать тестовую кнопку для вызова системного сообщения или можно со скриншотом сравнить, который в главное окно вставил. Выдранные иконки будут мелкими, две из них растянуты до 48, а системная в сообщении будет крупная и нормальная.
Есть идеи, как получить крупную иконку программно?

Скриншот: http://savepic.ru/10039488.jpg
Вложения
DrawIcon.zip
(16.62 Кб) Скачиваний: 165
Последний раз редактировалось Pantalone 09.06.2016 (Чт) 19:05, всего редактировалось 1 раз.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Как получить иконку IDI_EXCLAMATION при размере шрифтов

Сообщение VBTerminator » 09.06.2016 (Чт) 10:26

Попробуй сделать следующее:

  1. Извлечь так называемую icon directory, то есть список различных вариантов одной и той же иконки. Адрес на неё можно получить с помощью обычной LoadResource, считая возвращаемый HGLOBAL за GRPICONDIR.
  2. Перебрать содержимое GRPICONDIR и выбрать иконку нужного размера. Или же, как вариант, воспользоваться уже готовой функцией LookupIconIdFromDirectoryEx. В любом случаке мы получим nId.
  3. Получить описатель нужного варианта из nId с помощью FindResource(0, nId, RT_ICON).
  4. Породить изображение на основе ресурсного описателя: LoadResource.

Источник: статья Реймонда Чена «How do I override the default icon selection algorithm?».

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Re: Как получить иконку IDI_EXCLAMATION при размере шрифтов

Сообщение Pantalone » 09.06.2016 (Чт) 15:19

Благодарю за ответ. Получилось проще через ExtractIconEx и USER32.DLL, судя по Dependency Walker именно оттуда их тягает LoadIcon. Надеюсь, что USER32.DLL есть во всех системах.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Как получить иконку IDI_EXCLAMATION при размере шрифтов

Сообщение VBTerminator » 09.06.2016 (Чт) 15:47

Pantalone писал(а):Надеюсь, что USER32.DLL есть во всех системах.

Конечно есть! Ровно как и прочие библиотеки, чьи имена (в частности) заканчиваются на «32»: KERNEL32, GDI32, ADVAPI32, SHELL32, COMCTL32, COMDLG32, OLEAUT32.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Re: Как получить иконку IDI_EXCLAMATION при размере шрифтов

Сообщение Pantalone » 10.06.2016 (Пт) 0:09

Выяснилось, что способ помогает только до 150%. При масштабе 200% иконка снова кривая, значит User32 содержит небольшие размеры.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot], Yandex-бот и гости: 11

    TopList  
cron