图形绘制中的DrawIcon方法是否忽略比例变换?

3

这是我的代码。看起来DrawIcon忽略了缩放变换,但没有忽略平移变换。这是有特殊原因还是只是一个 bug?

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
Icon文件(通常)包含不同大小的同一图像的多个版本。.Net Icon类表示来自icon文件的单个图像,而不是整个icon文件。在创建Icon类实例时,您可以选择所需的大小。
传统上,icon文件只有两个大小(16x16和32x32)。您可以选择所需的大小并以无缩放方式显示它。更近期的Windows版本支持更大的图标,并且支持缩放以显示较旧的图标在更大的尺寸下。
DrawIcon *函数似乎是为了遵循这个模型而设计的。
  • DrawIcon(Icon,int,int)函数不进行缩放。
  • DrawIcon(Icon,Rectangle)函数支持缩放(但不考虑缩放变换,因为意图是将图标缩放到精确的像素大小)。
  • DrawIconUnstretched(Icon,Rectangle)函数可能具有不同的名称,只是因为该参数与其他DrawIcon重载之一冲突。

3
是的,这有一个解释。GDI+不支持绘制图标,它根本没有图标支持。相反,Graphics.DrawIcon()委托给Icon.DrawIcon(),后者调用一个Windows API函数来绘制图标,即DrawIconEx()。代码忘记考虑缩放因素,这可能是故意的,因为负数和不匹配的缩放因素无法工作,DrawIconEx()不支持这种情况。您可以使用DrawIcon(Icon, Rectangle)重载来自行纠正这个问题。

我想可能就是这样。只是我找不到任何文档记录它。 - Mike Park

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接