Как получить System.Drawing.Image
для различных System.Windows.MessageBoxImage
и/или System.Windows.Forms.MessageBoxIcon
(s)
Как получить изображение для различных MessageBoxImage (s) или MessageBoxIcon (s)
Ответ 1
SystemIcons - это то, что я искал:
SystemIcons.Warning.ToBitmap();
Ответ 2
Вы также можете включить SystemIcons в свой 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
Как уже SystemIcons
другие, SystemIcons
- это класс, который должен содержать эти значки, но в Windows 8.1 (и, возможно, в более ранних версиях) значки, присутствующие в 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();
Пожалуйста, обратите внимание:
Если эта функция возвращает дескриптор значка в элементе hIcon структуры SHSTOCKICONINFO, на который указывает psii, вы несете ответственность за освобождение значка с помощью 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);
Ответ 4
MessageBox.Show(
"Hello, world!",
"My App",
MessageBoxButton.OK, MessageBoxImage.Information);
Так просто.