Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何获取各种MessageBoxImage或MessageBoxIcon的图像_.net_Wpf_Winforms_Messagebox - Fatal编程技术网

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