WinForms.NET2.0:如何绘制适当大小的图标?

WinForms.NET2.0:如何绘制适当大小的图标?,winforms,graphics,windows-vista,Winforms,Graphics,Windows Vista,我有一个包含48x48和256x256 Vista PNG版本(以及32x32和16x16版本)的ico文件。我想使用适当的内部尺寸版本绘制图标 我试过: Icon ico = Properties.Resources.TestIcon; e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 48, 48)); e.Graphics.DrawIcon(ico, new Rectangle(48, 0, 256, 256)); Icon ico = Prope

我有一个包含48x48和256x256 Vista PNG版本(以及32x32和16x16版本)的ico文件。我想使用适当的内部尺寸版本绘制图标

我试过:

Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 48, 48));
e.Graphics.DrawIcon(ico, new Rectangle(48, 0, 256, 256));
Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 48, 48));
e.Graphics.DrawIconUnstretched(ico, new Rectangle(48 0, 256, 256));
Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 48, 48));
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(48, 0, 256, 256));
Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 16, 16));
e.Graphics.DrawIconUnstretched(ico, new Rectangle(24, 0, 16, 16));
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(48, 0, 16, 16));
但他们绘制的32x32版本分别放大到48x48和256x256

我试过:

Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 48, 48));
e.Graphics.DrawIcon(ico, new Rectangle(48, 0, 256, 256));
Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 48, 48));
e.Graphics.DrawIconUnstretched(ico, new Rectangle(48 0, 256, 256));
Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 48, 48));
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(48, 0, 256, 256));
Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 16, 16));
e.Graphics.DrawIconUnstretched(ico, new Rectangle(24, 0, 16, 16));
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(48, 0, 16, 16));
但那些画32x32版本未拉伸

我试过:

Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 48, 48));
e.Graphics.DrawIcon(ico, new Rectangle(48, 0, 256, 256));
Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 48, 48));
e.Graphics.DrawIconUnstretched(ico, new Rectangle(48 0, 256, 256));
Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 48, 48));
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(48, 0, 256, 256));
Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 16, 16));
e.Graphics.DrawIconUnstretched(ico, new Rectangle(24, 0, 16, 16));
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(48, 0, 16, 16));
但这些画的是32x32图标的拉伸版本

如何使图标使用适当的大小绘制自身

另外,我想用16x16版本画图。我试过:

Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 48, 48));
e.Graphics.DrawIcon(ico, new Rectangle(48, 0, 256, 256));
Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 48, 48));
e.Graphics.DrawIconUnstretched(ico, new Rectangle(48 0, 256, 256));
Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 48, 48));
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(48, 0, 256, 256));
Icon ico = Properties.Resources.TestIcon;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 16, 16));
e.Graphics.DrawIconUnstretched(ico, new Rectangle(24, 0, 16, 16));
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(48, 0, 16, 16));
但是除了
非拉伸的
调用之外,所有这些调用都使用缩小的32x32版本,该调用将其裁剪为16x16

如何使图标使用适当的大小绘制自身


按照schnaader的建议构造一个具有所需大小的图标副本,对于256x256大小不起作用。i、 e.以下不起作用(它使用48x48图标的缩放版本):

而以下两种方法确实有效:

e.Graphics.DrawIcon(
        new Icon(ico, new Size(16, 16)), 
        new Rectangle(0, 0, 16, 16));

e.Graphics.DrawIcon(
        new Icon(ico, new Size(48, 48)), 
        new Rectangle(0, 0, 48, 48));

今天,我制作了一个非常好的函数,用于从Vista图标中提取256x256位图

我使用它在“关于”框中将大图标(256x256)显示为位图。例如,此代码将Vista图标获取为PNG图像,并将其显示在256x256图片框中:

picboxAppLogo.Image = ExtractVistaIcon(Icon.ExtractAssociatedIcon(myIcon));
此函数将图标对象作为参数。因此,您可以将它与任何图标一起使用—来自资源、文件、流等等。(请阅读下面有关提取EXE图标的内容)

它运行在任何操作系统上,因为它不使用任何Win32 API,所以它是100%托管代码


注意:我仍然在这里使用ExtractVistaIcon()函数,因为我不喜欢IconExtractor处理此作业的方式-首先,它使用IconExtractor.SplitIcon(icoAppIcon)提取所有图标格式,然后您必须知道确切的256x256图标索引才能获得所需的vista图标。因此,在这里使用ExtractVistaIcon()是一种更快、更简单的方法:)

今天,我制作了一个非常好的函数,用于从Vista图标中提取256x256位图

我使用它在“关于”框中将大图标(256x256)显示为位图。例如,此代码将Vista图标获取为PNG图像,并将其显示在256x256图片框中:

picboxAppLogo.Image = ExtractVistaIcon(Icon.ExtractAssociatedIcon(myIcon));
此函数将图标对象作为参数。因此,您可以将它与任何图标一起使用—来自资源、文件、流等等。(请阅读下面有关提取EXE图标的内容)

它运行在任何操作系统上,因为它不使用任何Win32 API,所以它是100%托管代码


注意:我仍然在这里使用ExtractVistaIcon()函数,因为我不喜欢IconExtractor处理此作业的方式-首先,它使用IconExtractor.SplitIcon(icoAppIcon)提取所有图标格式,然后您必须知道确切的256x256图标索引才能获得所需的vista图标。因此,在这里使用my ExtractVistaIcon()是一种更快、更简单的方法:)

您评论说两种建议的解决方案都不适合您。但一段时间过去了。您是否曾经设法显示正确的图标大小?我现在也有类似的情况,所以我很感兴趣。你评论说两种建议的解决方案都不适合你。但一段时间过去了。您是否曾经设法显示正确的图标大小?我现在也有类似的情况,所以我很感兴趣。