Comment obtenir une Image pour les différents MessageBoxImage (s) ou MessageBoxIcon(s))

Comment puis-je obtenir un Système.Dessin.Image pour les différents systèmes.Windows.MessageBoxImage (s) et/ou Système.Windows.Forme.MessageBoxIcon (s)

40
demandé sur Simon 2009-08-21 05:56:07

3 réponses

SystemIcons est ce que je recherche:

SystemIcons.Warning.ToBitmap();
51
répondu Simon 2018-09-18 08:18:23

incluez un convertisseur (voir code ci-dessous) comme ressource, et un contrôle D'Image dans votre XAML. Cet exemple d'Image montre ici l'icône d'information.

     <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();
      }
   }
}
30
répondu Zamboni 2010-03-13 02:03:28

Comme d'autres l'ont dit SystemIcons est la classe qui devrait contenir ces icônes, mais sur Windows 8.1 (et peut-être aussi sur les versions précédentes) les icônes présentes dans le SystemIcons différer de ceux affichés sur le MessageBoxes dans le cas d'un astérisque, Information et Question. Les icônes sur le dialogue semblent beaucoup flatter. Voir - par exemple-l'icône Question:

Question icon

L'icône dans la boîte de dialogue est dialogue native de l'icône, et le plus à gauche l'icône sur le formulaire en arrière-plan est l'icône extraite du SystemIcons classe.

pour les différentes méthodes et les détails sur la façon d'obtenir l'icône à partir de la boîte de messagerie voir ceci réponse, mais je l'inclus ici un résumé rapide, juste pour le plaisir de l'exhaustivité:

Vous devez utiliser le SHGetStockIconInfo fonction:

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

Merci remarque::

si cette fonction renvoie une poignée d'icône dans le hIcon membre de la SHSTOCKICONINFO structure pointée par psii, vous êtes responsable en libérant l'icône DestroyIcon lorsque vous n'en avez plus besoin.

bien sûr, pour que cela fonctionne, vous devrez définir quelques énums et structures:

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);
13
répondu qqbenq 2017-05-23 11:46:55