WinForms.NET2.0:如何绘制适当大小的图标?
我有一个包含48x48和256x256 Vista PNG版本(以及32x32和16x16版本)的ico文件。我想使用适当的内部尺寸版本绘制图标 我试过: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
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()是一种更快、更简单的方法:)您评论说两种建议的解决方案都不适合您。但一段时间过去了。您是否曾经设法显示正确的图标大小?我现在也有类似的情况,所以我很感兴趣。你评论说两种建议的解决方案都不适合你。但一段时间过去了。您是否曾经设法显示正确的图标大小?我现在也有类似的情况,所以我很感兴趣。