Graphics.DrawIcon игнорировать масштабные преобразования? - PullRequest
3 голосов
/ 09 ноября 2011

Вот мой код. Похоже, DrawIcon игнорирует преобразование масштаба, но не преобразование преобразования. Есть ли какая-то особая причина для этого или это просто ошибка?

protected override void OnPaint(PaintEventArgs e)
{
    Icon icon = SystemIcons.Warning;
    Image img = icon.ToBitmap();

    // DrawIcon ignores this transform, but not a translate transform
    e.Graphics.ScaleTransform(1.5f, 1.5f);

    e.Graphics.DrawRectangle(Pens.Red, 60, 90, icon.Width, icon.Height);
    e.Graphics.DrawString("Icon", this.Font, Brushes.Black, 100, 100);
    e.Graphics.DrawIcon(icon, 60, 90);

    e.Graphics.DrawRectangle(Pens.Red, 60, 190, img.Width, img.Height);
    e.Graphics.DrawString("Bitmap", this.Font, Brushes.Black, 100, 200);
    e.Graphics.DrawImage(img, 60, 190);
}

NOT Scaled Scaled

Ответы [ 2 ]

3 голосов
/ 09 ноября 2011

Да, есть объяснение этому.GDI + не поддерживает рисование иконок.У него нет поддержки значков вообще.Вместо этого Graphics.DrawIcon () делегирует Icon.DrawIcon (), который вызывает функцию API Windows для рисования значка DrawIconEx ().В противном случае код забывает учитывать коэффициент масштабирования.Вероятно, намеренный, потому что отрицательные и несовпадающие коэффициенты масштабирования не могут работать, DrawIconEx () не поддерживает это.Вы можете использовать перегрузку DrawIcon (Icon, Rectangle), чтобы исправить это самостоятельно.

3 голосов
/ 09 ноября 2011

Файлы значков (обычно) содержат несколько версий одного и того же изображения с разными размерами. Класс .Net Icon представляет одно изображение из файла значков, а не весь файл значков. Вы выбираете нужный размер при создании экземпляра класса Icon.

Традиционно файлы значков имели только два размера (16x16 и 32x32). Вы бы выбрали тот, который вы хотели, и отображать его без масштабирования. Более поздние версии Windows поддерживают большие значки и поддерживают масштабирование для отображения старых значков в больших размерах.

Кажется, что функции DrawIcon * созданы для того, чтобы следовать этой модели.

  • Функция DrawIcon (Icon, int, int) не масштабируется.
  • Функция DrawIcon (Icon, Rectangle) поддерживает масштабирование (но не учитывает преобразование масштабирования, предположительно потому, что целью является масштабирование иконки до точного размера в пикселях).
  • Функция DrawIconUnstretched (Icon, Rectangle), вероятно, имеет другое имя только потому, что параметры конфликтуют с одной из других перегрузок DrawIcon.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...