.net 如何获取各种MessageBoxImage或MessageBoxIcon的图像
如何为各种.net 如何获取各种MessageBoxImage或MessageBoxIcon的图像,.net,wpf,winforms,messagebox,.net,Wpf,Winforms,Messagebox,如何为各种System.Windows.MessageBoxImage(和/或)获取System.Drawing.Image System.Windows.Forms.MessageBoxIcon(s)是我一直在寻找的: SystemIcons.Warning.ToBitmap(); 您还可以在XAML中包括系统图标,如下所示: 在XAML中包括一个转换器(见下面的代码)作为资源,以及一个图像控件。 此图像示例显示信息图标 <Window.Resources>
System.Windows.MessageBoxImage
(和/或)获取System.Drawing.Image
System.Windows.Forms.MessageBoxIcon
(s)是我一直在寻找的:
SystemIcons.Warning.ToBitmap();
您还可以在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}"/>
正如其他人所说,
SystemIcons
是应该包含这些图标的类,但在Windows 8.1(可能也在早期版本上)中,SystemIcons
中显示的图标与消息框中显示的图标不同,例如星号、信息和问题。对话框上的图标看起来更平坦。例如,请参见问题图标:
对话框中的图标是本机对话框图标,后台窗体上最左侧的图标是从SystemIcons
类检索到的图标
有关如何从MessageBox获取图标的各种方法和详细信息,请参见以下内容,但为了完整起见,我在此提供了一个快速摘要:
您应该使用以下功能:
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();
请:
如果此函数在
SHSTOCKICONINFOpsii指向的结构,您负责
当不再需要图标时,使用销毁图标释放图标
当然,要实现这一点,您必须定义一些枚举和结构:
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);
就这么简单。非常感谢!这太棒了!然而,我注意到StackOverflow是在知识共享许可证下运行的。因此,从技术上讲,未经您的许可,我无法在我的商业应用程序中使用/修改您的代码(我不希望使用知识共享许可证)。你愿意给我许可吗?我仍然可以相信你的工作。@skybluecodeflier,任何发布到StackOverflow的代码都是creative commons:@Zamboni是否有任何特殊原因使转换器忽略值
,并仅使用参数执行转换?这似乎是典型的转换器。谢谢你的回答。但我实际上希望使用位图的一个实例,而不是“如何显示消息框”。欢迎来到stackoverflow
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);