Здравствуйте, Аноним, Вы писали:
А>Здравствуйте.
А>Получаю картики для файлов/папок через COM интерфейс IExtractImage для items в ListView. Но есть две проблемы...
А>1. IExtractImage.Extract не возвращает картинку для пустой папки (выбрасывает exception).
А>Как получить картинку для пустой папки (желтая пиктограмка как в windows explorer)? Не обязательно через interop. Можно средствами .net. Простейший казалось бы случай , но никак не найду решение.
А>2. Возвращаемые картинки для папок имеют чёрный фон. Сейчас борюсь с этим так :
А>А>this.image.MakeTransparent(Color.Black);
А>
А>Может есть способ их получить сразу с прозрачным фоном ?
А>Заранее спасибо.
Таким вот способом беру иконки для файлов и папок.
[StructLayout(LayoutKind.Sequential)]
internal struct SHFILEINFO
{
public IntPtr hIcon;
public IntPtr iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
};
class Win32
{
public const uint SHGFI_ICON = 0x100;
public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
public const uint SHGFI_SMALLICON = 0x1; // 'Small icon
[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath,
uint dwFileAttributes,
ref SHFILEINFO psfi,
uint cbSizeFileInfo,
uint uFlags);
[DllImport("shell32.dll")]
internal static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);
[DllImport("User32.dll")]
internal static extern int DestroyIcon(IntPtr hIcon);
}
class IconManager
{
internal static System.Windows.Media.Imaging.BitmapSource GetFileIcon(string fName)
{
SHFILEINFO shinfo = new SHFILEINFO();
IntPtr hImgSmall = Win32.SHGetFileInfo(fName, 0, ref shinfo,
(uint)Marshal.SizeOf(shinfo),
Win32.SHGFI_ICON |
Win32.SHGFI_SMALLICON);
IntPtr dd = shinfo.hIcon;
System.Windows.Media.Imaging.BitmapSource b = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(dd, Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
return b;
}
}