다양한 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
에 표시된 것과 다릅니다.MessageBoxes
Asterisk, 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 입니다.
'programing' 카테고리의 다른 글
특정 형식의 파일만 있는 디렉토리를 어떻게 구분합니까? (0) | 2023.04.25 |
---|---|
파일에서 특정 줄에 대한 커밋 로그를 검색하시겠습니까? (0) | 2023.04.25 |
Kotlin: 목록 캐스팅을 사용하는 방법:선택되지 않은 캐스트: kotlin.collections입니다.kotlin.colutions에 등록합니다.목록입니다. (0) | 2023.04.25 |
실패할 때까지 셸 명령을 반복적으로 실행하시겠습니까? (0) | 2023.04.25 |
UITableView 섹션 헤더의 글꼴 크기를 변경합니다. (0) | 2023.04.25 |