다양한 MessageBoxImage 또는 MessageBoxicon (S)에 대한 이미지를 얻으려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1309738

  •  19-09-2019
  •  | 
  •  

문제

어떻게 얻습니까? System.Drawing.Image 다양한 것을 위해 System.Windows.MessageBoxImage(들) 및/또는System.Windows.Forms.MessageBoxIcon(에스)

도움이 되었습니까?

해결책

전신 내가 찾고 있던 것입니다.

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

변환기의 구현은 다음과 같습니다.

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

다른 사람들이 말했듯이 SystemIcons 해당 아이콘이 포함되어야하는 클래스이지만 Windows 8.1 (및 이전 버전)에서는 SystemIcons 에 표시된 것과 다릅니다 MessageBoxes 별표의 경우 정보와 질문의 경우. 대화 상자의 아이콘이 많이 보입니다 즐겁게 하다. 예를 들어 - 질문 아이콘을 참조하십시오.

Question icon

대화 상자의 아이콘은 기본 대화 상자 아이콘이며 백그라운드에서 가장 왼쪽 아이콘은 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();

제발 노트:

이 함수가 아이콘 핸들을 반환하는 경우 히콘 회원 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);
MessageBox.Show(
  "Hello, world!",
  "My App",
  MessageBoxButton.OK, MessageBoxImage.Information);

저것과 같이 쉬운.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top