Pregunta

¿Cómo consigo un System.Drawing.Image para los diversos System.Windows.MessageBoxImage(s) y/oSystem.Windows.Forms.MessageBoxIcon(s)

¿Fue útil?

Solución

SystemIcons es lo que estaba buscando:

SystemIcons.Warning.ToBitmap();

Otros consejos

También puede incluir SystemIcons en su XAML de la siguiente manera:

Incluir un convertidor (véase el código de abajo) como un recurso y un control Image en su XAML. Esta muestra imagen aquí muestra el icono de información.

     <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}"/>

Aquí está la aplicación para el convertidor:

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

Como otros han dicho SystemIcons es la clase que debería contener esos íconos, pero en Windows 8.1 (y posiblemente también en versiones anteriores) los íconos presentes en el SystemIcons difieren de los que se muestran en la MessageBoxes en el caso de Asterisco, Información y Pregunta.Los íconos en el cuadro de diálogo se ven mucho halagar.Vea, por ejemplo, el icono de Pregunta:

Question icon

El ícono en el cuadro de diálogo es el ícono del diálogo nativo, y el ícono más a la izquierda en el formulario en segundo plano es el ícono recuperado del SystemIcons clase.

Para conocer varios métodos y detalles sobre cómo obtener el ícono del cuadro de mensajes, consulte esto respuesta, pero incluyo aquí un resumen rápido, solo para que esté completo:

Deberías usar el SHGetStockIconInfo función:

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

Por favor nota:

Si esta función devuelve un identificador de icono en el hIcono miembro de SHSTOCKICONINFO Estructura señalada por PSII, usted es responsable de liberar el icono con DestruirIcono cuando ya no lo necesites.

Por supuesto, para que esto funcione tendrás que definir algunas enumeraciones y estructuras:

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);
MessageBox.Show(
  "Hello, world!",
  "My App",
  MessageBoxButton.OK, MessageBoxImage.Information);

Tan simple como eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top