programing

다양한 MessageBoxImage 또는 MessageBoxIcon의 이미지를 가져오려면 어떻게 해야 합니까?

telecom 2023. 4. 25. 21:52
반응형

다양한 MessageBoxImage 또는 MessageBoxIcon의 이미지를 가져오려면 어떻게 해야 합니까?

어떻게 구하죠?System.Drawing.Image다방면에 걸쳐서요.System.Windows.MessageBoxImage(s) 및/또는 둘 중 하나입니다.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}"/>

다음은 컨버터를 위한 구현입니다.

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에 표시된 것과 다릅니다.MessageBoxesAsterisk, Information 및 Question의 경우 선택합니다.대화상자의 아이콘은 훨씬 더 평평해 보입니다.예를 들어 질문 아이콘을 참조하십시오.

질문 아이콘입니다.

대화상자의 아이콘은 네이티브 대화 상자 아이콘이며, 배경에서 양식의 맨 왼쪽 아이콘은 에서 검색된 아이콘입니다.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();

참고:

이 함수가 psii가 가리키는 SHSTOKICONINFO 구조의 hICON 멤버에 있는 아이콘 핸들을 반환할 경우 Destroy로 아이콘을 해제해야 합니다.더 이상 필요 없는 아이콘입니다.

물론 이 기능이 작동하려면 몇 가지 Enum과 구조를 정의해야 합니다.

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

아이콘 클래스를 확장합니다.

    [DllImport("gdi32.dll", SetLastError = true)]
    private static extern bool DeleteObject(IntPtr hObject);

    public static ImageSource ToImageSource(this Icon icon)
    {
        Bitmap bitmap = icon.ToBitmap();
        IntPtr hBitmap = bitmap.GetHbitmap();

        ImageSource wpfBitmap = Imaging.CreateBitmapSourceFromHBitmap(
            hBitmap,
            IntPtr.Zero,
            Int32Rect.Empty,
            BitmapSizeOptions.FromEmptyOptions());

        if (!DeleteObject(hBitmap))
        {
            throw new Win32Exception();
        }

        return wpfBitmap;
    }

MessageBoxImage Enum을 확장합니다.

    public static ImageSource ToImageSource(this MessageBoxImage enumValue)
    {
        switch (enumValue)
        {
            case MessageBoxImage.Error:
                return SystemIcons.Error.ToImageSource();
            case MessageBoxImage.Question:
                return SystemIcons.Question.ToImageSource();
            case MessageBoxImage.Warning:
                return SystemIcons.Warning.ToImageSource();
            case MessageBoxImage.Information:
                return SystemIcons.Information.ToImageSource();
        }

        return null;
    }

수익:

(전체 WPF 창 코드를 여기에 게시하지는 않지만, "아이콘" 및 "이미지"는 "ImageSource" 유형의 속성으로, 데이터 바인딩을 통해 이미지 컨트롤에 연결됩니다.

    public ConfirmationWindow(Icon icon, MessageBoxImage image, string title, string content, bool defaultIsYes = true)
    {
        InitializeComponent();            

        Icon = icon.ToImageSource();
        Image = image.ToImageSource();
        Title = title;
        Content = content;
        DefaultIsYes = defaultIsYes;
    }
MessageBox.Show(
  "Hello, world!",
  "My App",
  MessageBoxButton.OK, MessageBoxImage.Information);

그것처럼 간단해.

언급URL : https://stackoverflow.com/questions/1309738/how-do-i-get-an-image-for-the-various-messageboximages-or-messageboxicons 입니다.

반응형