Здравствуйте.
Получаю картики для файлов/папок через COM интерфейс IExtractImage для items в ListView. Но есть две проблемы...
1. IExtractImage.Extract не возвращает картинку для пустой папки (выбрасывает exception).
Как получить картинку для пустой папки (желтая пиктограмка как в windows explorer)? Не обязательно через interop. Можно средствами .net. Простейший казалось бы случай , но никак не найду решение.
2. Возвращаемые картинки для папок имеют чёрный фон. Сейчас борюсь с этим так :
this.image.MakeTransparent(Color.Black);
Может есть способ их получить сразу с прозрачным фоном ?
Заранее спасибо.
08.03.11 12:56: Перенесено модератором из '.NET' — TK
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте.
А>Получаю картики для файлов/папок через 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;
}
}
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте.
А>Получаю картики для файлов/папок через COM интерфейс IExtractImage для items в ListView. Но есть две проблемы...
эм..., мож пригодится
WindowsAPICodePack
System.Windows.Media.Imaging.BitmapSource это PresentationCore.dll (Framework не ниже 3.5). У меня приложение под Framework 2.0. Использовать SHGetFileInfo пробовал:
public static System.Drawing.Icon GetFolderIcon(IconSize size, FolderType folderType)
{
...
// Get the folder icon
Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO();
Shell32.SHGetFileInfo(null,
Shell32.FILE_ATTRIBUTE_DIRECTORY,
ref shfi,
(uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
flags);
System.Drawing.Icon.FromHandle(shfi.hIcon); // Load the icon from an HICON handle
// Now clone the icon, so that it can be successfully stored in an ImageList
System.Drawing.Icon icon = (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone();
User32.DestroyIcon(shfi.hIcon); // Cleanup
return icon;
}
}
Но для папок такой код возвращает неправильную картинку (показал бы ,но не знаю как добавить картинку). Причём для всех одинаковую.
Пробовал. Отлично работает на Win 7. Но требует Framework не ниже 3.5 и не работает на Win XP. А мне надо решение под Framework 2.0 и что бы на Win XP работало.