markus / SmartUpdate / IconHelper.cs @ master
이력 | 보기 | 이력해설 | 다운로드 (9.13 KB)
1 |
using System; |
---|---|
2 |
using System.Drawing; |
3 |
using System.Collections; |
4 |
using System.ComponentModel; |
5 |
using System.Data; |
6 |
using System.Runtime.InteropServices; |
7 |
|
8 |
namespace Etier.IconHelper |
9 |
{ |
10 |
/// <summary> |
11 |
/// Provides static methods to read system icons for both folders and files. |
12 |
/// </summary> |
13 |
/// <example> |
14 |
/// <code>IconReader.GetFileIcon("c:\\general.xls");</code> |
15 |
/// </example> |
16 |
public class IconReader |
17 |
{ |
18 |
/// <summary> |
19 |
/// Options to specify the size of icons to return. |
20 |
/// </summary> |
21 |
public enum IconSize |
22 |
{ |
23 |
/// <summary> |
24 |
/// Specify large icon - 32 pixels by 32 pixels. |
25 |
/// </summary> |
26 |
Large = 0, |
27 |
/// <summary> |
28 |
/// Specify small icon - 16 pixels by 16 pixels. |
29 |
/// </summary> |
30 |
Small = 1 |
31 |
} |
32 |
|
33 |
/// <summary> |
34 |
/// Options to specify whether folders should be in the open or closed state. |
35 |
/// </summary> |
36 |
public enum FolderType |
37 |
{ |
38 |
/// <summary> |
39 |
/// Specify open folder. |
40 |
/// </summary> |
41 |
Open = 0, |
42 |
/// <summary> |
43 |
/// Specify closed folder. |
44 |
/// </summary> |
45 |
Closed = 1 |
46 |
} |
47 |
|
48 |
/// <summary> |
49 |
/// Returns an icon for a given file - indicated by the name parameter. |
50 |
/// </summary> |
51 |
/// <param name="name">Pathname for file.</param> |
52 |
/// <param name="size">Large or small</param> |
53 |
/// <param name="linkOverlay">Whether to include the link icon</param> |
54 |
/// <returns>System.Drawing.Icon</returns> |
55 |
public static System.Drawing.Icon GetFileIcon(string name, IconSize size, bool linkOverlay) |
56 |
{ |
57 |
Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO(); |
58 |
uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_USEFILEATTRIBUTES; |
59 |
|
60 |
if (true == linkOverlay) flags += Shell32.SHGFI_LINKOVERLAY; |
61 |
|
62 |
/* Check the size specified for return. */ |
63 |
if (IconSize.Small == size) |
64 |
{ |
65 |
flags += Shell32.SHGFI_SMALLICON; |
66 |
} |
67 |
else |
68 |
{ |
69 |
flags += Shell32.SHGFI_LARGEICON; |
70 |
} |
71 |
|
72 |
Shell32.SHGetFileInfo(name, |
73 |
Shell32.FILE_ATTRIBUTE_NORMAL, |
74 |
ref shfi, |
75 |
(uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi), |
76 |
flags); |
77 |
|
78 |
// Copy (clone) the returned icon to a new object, thus allowing us to clean-up properly |
79 |
System.Drawing.Icon icon = (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone(); |
80 |
User32.DestroyIcon(shfi.hIcon); // Cleanup |
81 |
return icon; |
82 |
} |
83 |
|
84 |
/// <summary> |
85 |
/// Used to access system folder icons. |
86 |
/// </summary> |
87 |
/// <param name="size">Specify large or small icons.</param> |
88 |
/// <param name="folderType">Specify open or closed FolderType.</param> |
89 |
/// <returns>System.Drawing.Icon</returns> |
90 |
public static System.Drawing.Icon GetFolderIcon(IconSize size, FolderType folderType) |
91 |
{ |
92 |
// Need to add size check, although errors generated at present! |
93 |
uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_USEFILEATTRIBUTES; |
94 |
|
95 |
if (FolderType.Open == folderType) |
96 |
{ |
97 |
flags += Shell32.SHGFI_OPENICON; |
98 |
} |
99 |
|
100 |
if (IconSize.Small == size) |
101 |
{ |
102 |
flags += Shell32.SHGFI_SMALLICON; |
103 |
} |
104 |
else |
105 |
{ |
106 |
flags += Shell32.SHGFI_LARGEICON; |
107 |
} |
108 |
|
109 |
// Get the folder icon |
110 |
Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO(); |
111 |
Shell32.SHGetFileInfo(null, |
112 |
Shell32.FILE_ATTRIBUTE_DIRECTORY, |
113 |
ref shfi, |
114 |
(uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi), |
115 |
flags); |
116 |
|
117 |
System.Drawing.Icon.FromHandle(shfi.hIcon); // Load the icon from an HICON handle |
118 |
|
119 |
// Now clone the icon, so that it can be successfully stored in an ImageList |
120 |
System.Drawing.Icon icon = (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone(); |
121 |
|
122 |
User32.DestroyIcon(shfi.hIcon); // Cleanup |
123 |
return icon; |
124 |
} |
125 |
} |
126 |
|
127 |
/// <summary> |
128 |
/// Wraps necessary Shell32.dll structures and functions required to retrieve Icon Handles using SHGetFileInfo. Code |
129 |
/// courtesy of MSDN Cold Rooster Consulting case study. |
130 |
/// </summary> |
131 |
/// |
132 |
|
133 |
// This code has been left largely untouched from that in the CRC example. The main changes have been moving |
134 |
// the icon reading code over to the IconReader type. |
135 |
public class Shell32 |
136 |
{ |
137 |
|
138 |
public const int MAX_PATH = 256; |
139 |
[StructLayout(LayoutKind.Sequential)] |
140 |
public struct SHITEMID |
141 |
{ |
142 |
public ushort cb; |
143 |
[MarshalAs(UnmanagedType.LPArray)] |
144 |
public byte[] abID; |
145 |
} |
146 |
|
147 |
[StructLayout(LayoutKind.Sequential)] |
148 |
public struct ITEMIDLIST |
149 |
{ |
150 |
public SHITEMID mkid; |
151 |
} |
152 |
|
153 |
[StructLayout(LayoutKind.Sequential)] |
154 |
public struct BROWSEINFO |
155 |
{ |
156 |
public IntPtr hwndOwner; |
157 |
public IntPtr pidlRoot; |
158 |
public IntPtr pszDisplayName; |
159 |
[MarshalAs(UnmanagedType.LPTStr)] |
160 |
public string lpszTitle; |
161 |
public uint ulFlags; |
162 |
public IntPtr lpfn; |
163 |
public int lParam; |
164 |
public IntPtr iImage; |
165 |
} |
166 |
|
167 |
// Browsing for directory. |
168 |
public const uint BIF_RETURNONLYFSDIRS = 0x0001; |
169 |
public const uint BIF_DONTGOBELOWDOMAIN = 0x0002; |
170 |
public const uint BIF_STATUSTEXT = 0x0004; |
171 |
public const uint BIF_RETURNFSANCESTORS = 0x0008; |
172 |
public const uint BIF_EDITBOX = 0x0010; |
173 |
public const uint BIF_VALIDATE = 0x0020; |
174 |
public const uint BIF_NEWDIALOGSTYLE = 0x0040; |
175 |
public const uint BIF_USENEWUI = (BIF_NEWDIALOGSTYLE | BIF_EDITBOX); |
176 |
public const uint BIF_BROWSEINCLUDEURLS = 0x0080; |
177 |
public const uint BIF_BROWSEFORCOMPUTER = 0x1000; |
178 |
public const uint BIF_BROWSEFORPRINTER = 0x2000; |
179 |
public const uint BIF_BROWSEINCLUDEFILES = 0x4000; |
180 |
public const uint BIF_SHAREABLE = 0x8000; |
181 |
|
182 |
[StructLayout(LayoutKind.Sequential)] |
183 |
public struct SHFILEINFO |
184 |
{ |
185 |
public const int NAMESIZE = 80; |
186 |
public IntPtr hIcon; |
187 |
public int iIcon; |
188 |
public uint dwAttributes; |
189 |
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)] |
190 |
public string szDisplayName; |
191 |
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NAMESIZE)] |
192 |
public string szTypeName; |
193 |
}; |
194 |
|
195 |
public const uint SHGFI_ICON = 0x000000100; // get icon |
196 |
public const uint SHGFI_DISPLAYNAME = 0x000000200; // get display name |
197 |
public const uint SHGFI_TYPENAME = 0x000000400; // get type name |
198 |
public const uint SHGFI_ATTRIBUTES = 0x000000800; // get attributes |
199 |
public const uint SHGFI_ICONLOCATION = 0x000001000; // get icon location |
200 |
public const uint SHGFI_EXETYPE = 0x000002000; // return exe type |
201 |
public const uint SHGFI_SYSICONINDEX = 0x000004000; // get system icon index |
202 |
public const uint SHGFI_LINKOVERLAY = 0x000008000; // put a link overlay on icon |
203 |
public const uint SHGFI_SELECTED = 0x000010000; // show icon in selected state |
204 |
public const uint SHGFI_ATTR_SPECIFIED = 0x000020000; // get only specified attributes |
205 |
public const uint SHGFI_LARGEICON = 0x000000000; // get large icon |
206 |
public const uint SHGFI_SMALLICON = 0x000000001; // get small icon |
207 |
public const uint SHGFI_OPENICON = 0x000000002; // get open icon |
208 |
public const uint SHGFI_SHELLICONSIZE = 0x000000004; // get shell size icon |
209 |
public const uint SHGFI_PIDL = 0x000000008; // pszPath is a pidl |
210 |
public const uint SHGFI_USEFILEATTRIBUTES = 0x000000010; // use passed dwFileAttribute |
211 |
public const uint SHGFI_ADDOVERLAYS = 0x000000020; // apply the appropriate overlays |
212 |
public const uint SHGFI_OVERLAYINDEX = 0x000000040; // Get the index of the overlay |
213 |
|
214 |
public const uint FILE_ATTRIBUTE_DIRECTORY = 0x00000010; |
215 |
public const uint FILE_ATTRIBUTE_NORMAL = 0x00000080; |
216 |
|
217 |
[DllImport("Shell32.dll")] |
218 |
public static extern IntPtr SHGetFileInfo( |
219 |
string pszPath, |
220 |
uint dwFileAttributes, |
221 |
ref SHFILEINFO psfi, |
222 |
uint cbFileInfo, |
223 |
uint uFlags |
224 |
); |
225 |
} |
226 |
|
227 |
/// <summary> |
228 |
/// Wraps necessary functions imported from User32.dll. Code courtesy of MSDN Cold Rooster Consulting example. |
229 |
/// </summary> |
230 |
public class User32 |
231 |
{ |
232 |
/// <summary> |
233 |
/// Provides access to function required to delete handle. This method is used internally |
234 |
/// and is not required to be called separately. |
235 |
/// </summary> |
236 |
/// <param name="hIcon">Pointer to icon handle.</param> |
237 |
/// <returns>N/A</returns> |
238 |
[DllImport("User32.dll")] |
239 |
public static extern int DestroyIcon(IntPtr hIcon); |
240 |
} |
241 |
} |
242 |
|