[英]Windows Forms .NET 2.0: How to draw a PNG icon?
注意:问题在应用程序中使用256 x 256 Vista图标处理使用“Vista”图标作为应用程序的图标。 这个问题涉及手动绘制Vista图标。
注意:问题WinForms .NET 2.0:如何绘制正确大小的图标? 处理绘制从文件加载的Vista图标。 这个问题涉及绘制从.resource加载的Vista图标。
我在我的Visual Studio项目中包含了一个具有各种格式的图标:
现在想绘制256x256版本。 我尝试过的以下任何事情都没有。
下面将32x32格式绘制为256x256:
Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIcon(ico, new Rectangle(0, 0, 256, 256));
以下是未拉伸的32x32格式:
Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIconUnstretched(ico, new Rectangle(0, 0, 256, 256));
下面将32x32格式绘制为256x256:
Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawImage(ico.ToBitmap(), new Rectangle(0, 0, 256, 256));
下面将48x48格式绘制为256x256:
Icon ico = Properties.Resources.TestIconThatHasA256PNGFormat;
e.Graphics.DrawIcon(
new Icon(ico, new Size(256, 256)),
new Rectangle(0, 0, 256, 256));
如何绘制256x256格式图标?
笔记:
该图标不是来自文件,因此PInvoking LoadImage()将无济于事。
该图标不是与文件关联的图标,因此PInvoking SHGetFileInfo() 将无济于事。 也不会使用Icon.ExtractAssociatedIcon 。
我也没有尝试在运行时创建256x256格式的图标,因此设计用于实现这一目标的库无济于事。
ResourceManager
根据存储在资源中的位加载图标。 但是,它处理加载的方式不允许您访问256x256图标(此信息不会进入您正在返回的System.Drawing.Icon
)。
我很抱歉让你失望,但我所知道的唯一方法是通过LoadImage
的P / Invoke加载图标并使用文件(是的,我知道,这不是你想要的)。 所以新问题应该是:如何提取给定资源的位以便我可以将它们存储到文件中? 我担心这也是不可能的,因为资源数据似乎是序列化.NET对象的集合,所以通过System.Resources.ResourceReader
完成了一些步骤。
无论如何,对于那些有能力从.ICO文件加载图标的人(以及我自己,作为如何加载256x256图标的未来参考),请调用IconConverter.LoadIcon
:
using System.Runtime.InteropServices;
static class IconConverter
{
public static System.Drawing.Icon LoadIcon(string path, int width, int height)
{
System.IntPtr hIcon;
hIcon = LoadImage (System.IntPtr.Zero, path, IMAGE_ICON, width, height,
LR_LOADFROMFILE);
if (hIcon == System.IntPtr.Zero)
{
return null;
}
return System.Drawing.Icon.FromHandle (hIcon);
}
const int IMAGE_ICON = 1;
const int LR_LOADFROMFILE = 0x0010;
[DllImport ("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern System.IntPtr LoadImage(System.IntPtr hInstance,
string lpszName, uint uType,
int cxDesired, int cyDesired,
uint fuLoad);
}
一旦你有预期大小的System.Drawing.Icon
,只需使用graphics.DrawIconUnstretched
绘制它。
今天,我做了一个非常好的功能, 从Vista图标中提取256x256位图 。
我用它在“关于”框中将大图标显示为位图。
此函数将Icon对象作为参数。 因此,您可以将它与任何图标一起使用 - 来自资源 ,文件,流等。 它可以运行在任何操作系统 ,因为它不使用任何的Win32 API,它是100%托管代码:-)
Bitmap ExtractVistaIcon(Icon icoIcon)
我在这里发布了我的函数: ExtractVistaIcon()
我刚才问了一个类似的问题,但运气不好。 我的帖子中的一些答案可能对你有帮助,有一种方法,但看起来很难。 链接到我的职位在这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.