49

我如何获得System.Drawing.Image各种System.Windows.MessageBoxImage(s)和/或 System.Windows.Forms.MessageBoxIcon(s)的

4

4 回答 4

62

SystemIcons是我一直在寻找的:

SystemIcons.Warning.ToBitmap();
于 2009-08-21T03:07:25.727 回答
38

您还可以在 XAML 中包含 SystemIcons,如下所示:

在 XAML 中包含一个转换器(参见下面的代码)作为资源和一个图像控件。此处的此图像示例显示了信息图标。

     <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();
      }
   }
}
于 2010-03-13T02:03:28.503 回答
18

正如其他人所说SystemIcons,应该包含这些图标的类,但在 Windows 8.1 上(也可能在早期版本上),出现的图标与 Asterisk、Information 和 Question 中SystemIcons显示的图标不同。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);
于 2014-08-21T15:10:52.977 回答
-3
MessageBox.Show(
  "Hello, world!",
  "My App",
  MessageBoxButton.OK, MessageBoxImage.Information);

就如此容易。

于 2019-07-24T14:31:12.473 回答