如何获取各种MessageBoxImage或MessageBoxIcon(s)的图像?
我如何得到一个System.Drawing.Image各种System.Windows.MessageBoxImage和/或System.Windows.Forms.MessageBoxIcon(s)
SystemIcons是我正在寻找
例如
SystemIcons.Warning.ToBitmap();
您也可以在您的XAML中包含SystemIcons,如下所示:
在你的XAML中包含一个转换器(见下面的代码)作为一个资源和一个Image控件。 此图片样本显示信息图标。
<Window.Resources> <Converters:SystemIconConverter x:Key="iconConverter"/> </Window.Resources> <Image Visibility="Visible" Margin="10,10,0,1" Stretch="Uniform" MaxHeight="25" VerticalAlignment="Top" HorizontalAlignment="Left" Source="{Binding Converter={StaticResource iconConverter}, ConverterParameter=Information}"/>
这里是转换器的实现:
using System; using System.Drawing; using System.Globalization; using System.Reflection; using System.Windows; using System.Windows.Data; using System.Windows.Interop; using System.Windows.Media.Imaging; namespace Converters { [ValueConversion(typeof(string), typeof(BitmapSource))] public class SystemIconConverter : IValueConverter { public object Convert(object value, Type type, object parameter, CultureInfo culture) { Icon icon = (Icon)typeof(SystemIcons).GetProperty(parameter.ToString(), BindingFlags.Public | BindingFlags.Static).GetValue(null, null); BitmapSource bs = Imaging.CreateBitmapSourceFromHIcon(icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); return bs; } public object ConvertBack(object value, Type type, object parameter, CultureInfo culture) { throw new NotSupportedException(); } } }
正如其他人所说SystemIcons
是应该包含这些图标的类,但在Windows 8.1(也可能在早期版本上), SystemIcons
的图标与Asterisk,Information和Question中显示在MessageBoxes
上的图标不同。 对话框中的图标看起来更平坦 。 请参阅 – 例如 – 问题图标:
对话框中的图标是本机对话框图标,背景中窗体上最左侧的图标是从SystemIcons
类检索到的图标。
有关如何从MessageBox中获取图标的各种方法和详细信息,请参阅此答案 ,但为了完整起见,在此仅包含一个简短摘要:
你应该使用SHGetStockIconInfo
函数:
SHSTOCKICONINFO sii = new SHSTOCKICONINFO(); sii.cbSize = (UInt32)Marshal.SizeOf(typeof(SHSTOCKICONINFO)); Marshal.ThrowExceptionForHR(SHGetStockIconInfo(SHSTOCKICONID.SIID_INFO, SHGSI.SHGSI_ICON , ref sii)); pictureBox1.Image = Icon.FromHandle(sii.hIcon).ToBitmap();
请注意 :
如果这个函数在psii指向的SHSTOCKICONINFO结构的hIcon成员中返回一个图标句柄,那么当你不再需要的时候,你有责任使用DestroyIcon释放图标。
当然,为了这个工作,你将不得不定义一些枚举和结构:
public enum SHSTOCKICONID : uint { //... SIID_INFO = 79, //... } [Flags] public enum SHGSI : uint { SHGSI_ICONLOCATION = 0, SHGSI_ICON = 0x000000100, SHGSI_SYSICONINDEX = 0x000004000, SHGSI_LINKOVERLAY = 0x000008000, SHGSI_SELECTED = 0x000010000, SHGSI_LARGEICON = 0x000000000, SHGSI_SMALLICON = 0x000000001, SHGSI_SHELLICONSIZE = 0x000000004 } [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct SHSTOCKICONINFO { public UInt32 cbSize; public IntPtr hIcon; public Int32 iSysIconIndex; public Int32 iIcon; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260/*MAX_PATH*/)] public string szPath; } [DllImport("Shell32.dll", SetLastError = false)] public static extern Int32 SHGetStockIconInfo(SHSTOCKICONID siid, SHGSI uFlags, ref SHSTOCKICONINFO psii);