我正在创建一个WPF应用程序,所以我主要使用ImageSource类来处理图标.但是,系统托盘图标必须是类型System.Drawing.Icon.是否可以从png图像创建这样的对象?
我尝试过以下方法:
private static System.Drawing.Icon _pngIcon;
public static System.Drawing.Icon PngIcon
{
get
{
if (_pngIcon == null)
{
//16x16 png image (24 bit or 32bit color)
System.Drawing.Bitmap icon = global::BookyPresentation.Properties.Resources.star16;
MemoryStream iconStream = new MemoryStream();
icon.Save(iconStream, System.Drawing.Imaging.ImageFormat.Png);
iconStream.Seek(0, SeekOrigin.Begin);
_pngIcon = new System.Drawing.Icon(iconStream); //Throws exception
}
return _pngIcon;
}
}
Run Code Online (Sandbox Code Playgroud)
Icon构造函数抛出异常,并显示以下消息:"参数'图片'必须是可用作图标的图片."
我认为它可能是图像颜色的位深度,因为我之前遇到了一些问题,但32位和24位图像都不起作用.我可能想做什么?
我正在尝试将位图转换为图标.但是有一些错误,因为结果文件只是空白.
private void btnCnvrtSave_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(sourceFile); //sourceFile = openfiledialog.FileName;
IntPtr Hicon = bmp.GetHicon();
Icon myIcon = Icon.FromHandle(Hicon);
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "Save Icon";
sfd.Filter = "Icon|*.ico";
sfd.ShowDialog();
FileStream fileStream = new FileStream(sfd.FileName, FileMode.OpenOrCreate);
myIcon.Save(fileStream);
fileStream.Flush();
fileStream.Close();
MessageBox.Show("Image is converted successfully!");
//Process.Start(sfd.FileName);
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了很多来弄清楚问题,但不能.请告诉我问题出在哪里.
我有这行代码:
System.Drawing.Icon icon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
Run Code Online (Sandbox Code Playgroud)
几行之后,在使用图标之后我有了这条线:
Win32.DestroyIcon(shinfo.hIcon);
Run Code Online (Sandbox Code Playgroud)
但是,当对我的代码运行静态分析时,它表示Resource_Leak可能来自图标.我想知道如果我调用dispose方法会有什么不同:
icon.Dispose();
Run Code Online (Sandbox Code Playgroud)
而不是现在正在使用的Win32.DestroyIcon().它们之间有什么区别吗?我只是维护这段代码所以我不确定原始开发人员是否有任何使用Win32.DestroyIcon的特殊内容.
这可能吗?它给了我一个错误,我之前认为它可以用于文件夹和驱动器以及类似的东西.
当我尝试它时,Icon.ExtractAssociatedIcon("C:\")不起作用,并抛出一个错误.
如何从一切获取相关图标?这是vb.net