2013-09-29 7 views
3

Недавно я обнаружил, что TCanvas.StretchDraw не будет работать так, как ожидалось, для объекта, который является экземпляром TIcon (быстрый взгляд на методы TIcon.Draw и DrawIconEx подсказывает почему). Delphi help подтверждает этот факт. Я знаю обходной путь, но я не знаю причины такого дизайнерского решения в VCL. Кто-нибудь знает, почему они решили оставить TIcon нетронутым в этом вопросе?По какой причине TCanvas.StretchDraw не работает так, как ожидалось для TIcon?

+2

Я не ожидал ответа, кроме * «Это по дизайну» *. – TLama

+1

Это просто отражает базовый API. Если вы хотите «StretchDraw», поместите изображение в растровое изображение и сделайте это оттуда. Это не проблема Delphi. Все ваши теги, но на самом деле это вопрос 'winapi'. –

+0

@ Давид, это проблема внедрения Delphi. 'StretchDraw' вызывает' TGraphic.Draw' метод, и если 'TIcon.Draw' не заботится о пропущенном размере прямоугольника (но для' DrawIconEx' только его позиция), это только ошибка реализации Delphi. – TLama

ответ

1

Иконки не являются регулярными растровыми изображениями. Это в основном связано с историческим дизайном и техническими причинами.

Это имело смысл в то время, когда значки были маленькими 32x32 пикселей и 16 цветов (старые добрые времена!), Чтобы значки никогда не растягивались на экране.

Но есть и техническая причина «здравого смысла». Такие небольшие растровые изображения, как правило, очень трудно переопределить по алгоритму (и по умолчанию GDI strech algoritm очень быстрый, но также дает очень плохой результат по отношению к other interpolation modes, e.g. available with GDI+), поэтому было решено вставить набор значков в пределах исполняемый файл, как ресурсы: один значок на размер. Преимущество процесса strech заключается в том, что он выполняется во время разработки, на уровне пикселей, дизайнером значков. И - назад в те дни - было также намного меньше ресурсов, чтобы использовать выделенные значки с уменьшенной цветовой палитрой.

Поскольку у вас должен быть набор значков с заданным размером для каждого, вам не нужно использовать StrechDraw, а просто выберите значок справа для отображения.

Так что если вы хотите отображать значок с заданным размером, убедитесь, что вы выбрали нужный размер или получите самую большую иконку и увеличьте ее, используя временную растровую карту - или DrawIconEx(). Или, что еще лучше, не используйте значки, а растровые изображения или векторные рисунки, если вы ожидаете огромного размера изображения.

 Смежные вопросы

  • Нет связанных вопросов^_^