usingSystem;usingSystem.ComponentModel;usingSystem.Drawing.Design;usingSystem.Runtime.InteropServices;usingSystem.Windows.Forms;namespaceFileBorserDialog
{#region Editor
///
///FolderBrowser 的设计器基类///
public classFolderNameEditor : UITypeEditor
{public overrideUITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{returnUITypeEditorEditStyle.Modal;
}public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, objectvalue)
{
FolderBrowserDialog browser= newFolderBrowserDialog();if (value != null)
{
browser.DirectoryPath= string.Format("{0}", value);
}if (browser.ShowDialog(null) ==DialogResult.OK)returnbrowser.DirectoryPath;returnvalue;
}
}#endregion
#region FolderBrowserDialog Base
///
///Vista 样式的选择文件对话框的基类///
[Description("提供一个Vista样式的选择文件对话框")]
[Editor(typeof(FolderNameEditor), typeof(UITypeEditor))]public classFolderBrowserDialog : Component
{///
///初始化 FolderBrowser 的新实例///
publicFolderBrowserDialog()
{
}#region Public Property
///
///获取在 FolderBrowser 中选择的文件夹路径///
public string DirectoryPath { get; set; }///
///向用户显示 FolderBrowser 的对话框///
/// 任何实现 System.Windows.Forms.IWin32Window(表示将拥有模式对话框的顶级窗口)的对象。
///
publicDialogResult ShowDialog(IWin32Window owner)
{
IntPtr hwndOwner= owner != null ?owner.Handle : GetActiveWindow();
IFileOpenDialog dialog= (IFileOpenDialog)newFileOpenDialog();try{
IShellItem item;if (!string.IsNullOrEmpty(DirectoryPath))
{
IntPtr idl;uint atts = 0;if (SHILCreateFromPath(DirectoryPath, out idl, ref atts) == 0)
{if (SHCreateShellItem(IntPtr.Zero, IntPtr.Zero, idl, out item) == 0)
{
dialog.SetFolder(item);
}
}
}
dialog.SetOptions(FOS.FOS_PICKFOLDERS|FOS.FOS_FORCEFILESYSTEM);uint hr =dialog.Show(hwndOwner);if (hr ==ERROR_CANCELLED)returnDialogResult.Cancel;if (hr != 0)returnDialogResult.Abort;
dialog.GetResult(outitem);stringpath;
item.GetDisplayName(SIGDN.SIGDN_FILESYSPATH,outpath);
DirectoryPath=path;returnDialogResult.OK;
}finally{
Marshal.ReleaseComObject(dialog);
}
}#endregion
#region BaseType[DllImport("shell32.dll")]private static extern int SHILCreateFromPath([MarshalAs(UnmanagedType.LPWStr)] string pszPath, out IntPtr ppIdl, ref uintrgflnOut);
[DllImport("shell32.dll")]private static extern int SHCreateShellItem(IntPtr pidlParent, IntPtr psfParent, IntPtr pidl, outIShellItem ppsi);
[DllImport("user32.dll")]private static externIntPtr GetActiveWindow();private const uint ERROR_CANCELLED = 0x800704C7;
[ComImport]
[Guid("DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7")]private classFileOpenDialog
{
}
[ComImport]
[Guid("42f85136-db7e-439c-85f1-e4075d135fc8")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]private interfaceIFileOpenDialog
{
[PreserveSig]uint Show([In] IntPtr parent); //IModalWindow
void SetFileTypes(); //not fully defined
void SetFileTypeIndex([In] uintiFileType);void GetFileTypeIndex(out uintpiFileType);void Advise(); //not fully defined
voidUnadvise();voidSetOptions([In] FOS fos);void GetOptions(outFOS pfos);voidSetDefaultFolder(IShellItem psi);voidSetFolder(IShellItem psi);void GetFolder(outIShellItem ppsi);void GetCurrentSelection(outIShellItem ppsi);void SetFileName([In, MarshalAs(UnmanagedType.LPWStr)] stringpszName);void GetFileName([MarshalAs(UnmanagedType.LPWStr)] out stringpszName);void SetTitle([In, MarshalAs(UnmanagedType.LPWStr)] stringpszTitle);void SetOkButtonLabel([In, MarshalAs(UnmanagedType.LPWStr)] stringpszText);void SetFileNameLabel([In, MarshalAs(UnmanagedType.LPWStr)] stringpszLabel);void GetResult(outIShellItem ppsi);void AddPlace(IShellItem psi, intalignment);void SetDefaultExtension([In, MarshalAs(UnmanagedType.LPWStr)] stringpszDefaultExtension);void Close(inthr);void SetClientGuid(); //not fully defined
voidClearClientData();voidSetFilter([MarshalAs(UnmanagedType.Interface)] IntPtr pFilter);void GetResults([MarshalAs(UnmanagedType.Interface)] out IntPtr ppenum); //not fully defined
void GetSelectedItems([MarshalAs(UnmanagedType.Interface)] out IntPtr ppsai); //not fully defined
}
[ComImport]
[Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]private interfaceIShellItem
{void BindToHandler(); //not fully defined
void GetParent(); //not fully defined
void GetDisplayName([In] SIGDN sigdnName, [MarshalAs(UnmanagedType.LPWStr)] out stringppszName);void GetAttributes(); //not fully defined
void Compare(); //not fully defined
}private enum SIGDN : uint{
SIGDN_DESKTOPABSOLUTEEDITING= 0x8004c000,
SIGDN_DESKTOPABSOLUTEPARSING= 0x80028000,
SIGDN_FILESYSPATH= 0x80058000,
SIGDN_NORMALDISPLAY= 0,
SIGDN_PARENTRELATIVE= 0x80080001,
SIGDN_PARENTRELATIVEEDITING= 0x80031001,
SIGDN_PARENTRELATIVEFORADDRESSBAR= 0x8007c001,
SIGDN_PARENTRELATIVEPARSING= 0x80018001,
SIGDN_URL= 0x80068000}
[Flags]private enumFOS
{
FOS_ALLNONSTORAGEITEMS= 0x80,
FOS_ALLOWMULTISELECT= 0x200,
FOS_CREATEPROMPT= 0x2000,
FOS_DEFAULTNOMINIMODE= 0x20000000,
FOS_DONTADDTORECENT= 0x2000000,
FOS_FILEMUSTEXIST= 0x1000,
FOS_FORCEFILESYSTEM= 0x40,
FOS_FORCESHOWHIDDEN= 0x10000000,
FOS_HIDEMRUPLACES= 0x20000,
FOS_HIDEPINNEDPLACES= 0x40000,
FOS_NOCHANGEDIR= 8,
FOS_NODEREFERENCELINKS= 0x100000,
FOS_NOREADONLYRETURN= 0x8000,
FOS_NOTESTFILECREATE= 0x10000,
FOS_NOVALIDATE= 0x100,
FOS_OVERWRITEPROMPT= 2,
FOS_PATHMUSTEXIST= 0x800,
FOS_PICKFOLDERS= 0x20,
FOS_SHAREAWARE= 0x4000,
FOS_STRICTFILETYPES= 4}#endregion}#endregion}