代码之家  ›  专栏  ›  技术社区  ›  haku

Win Form_的默认MessageBoxIcons位于何处?[副本]

  •  0
  • haku  · 技术社区  · 6 年前

    如何为各种System.Windows.MessageBoxImage和/或获取System.Drawing.Image System.Windows.Forms.MessageBoxIcon(s)

    0 回复  |  直到 6 年前
        1
  •  53
  •   Sebastian Brosch Navjyot    6 年前

    SystemIcons 是我想要的:

    SystemIcons.Warning.ToBitmap();
    
        2
  •  31
  •   Zamboni    14 年前

    您还可以在XAML中包括以下系统图标:

    将转换器(请参见下面的代码)作为资源,并在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();
          }
       }
    }
    
        3
  •  13
  •   Community Mr_and_Mrs_D    7 年前

    正如其他人所说 SystemIcons 是应该包含这些图标的类,但在Windows 8.1(也可能在早期版本上)中存在于 系统图标 与显示在 MessageBoxes 如果是星号、信息和问题。对话框上的图标看起来很像 奉承 . 请参见-例如-问题图标:

    Question icon

    对话框中的图标是本机对话框图标,背景中窗体上最左边的图标是从 系统图标 班级。

    有关如何从消息框中获取图标的各种方法和详细信息,请参见 answer 但是为了完整起见,我在这里简要地总结了一下:

    你应该使用 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();
    

    拜托 note :

    如果此函数返回 希康 的成员 史斯托克尼科 PSII指出的结构,您负责 释放图标 驱逐舰 当你不再需要它的时候。

    当然,要使其生效,您必须定义一些枚举和结构:

    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);