Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 21:05 17.05.24 
Клубове/ Компютри и Интернет / .NET Всички теми Следваща тема Пълен преглед*
Информация за клуба
Тема Re: DirectorySelectDialog [re: DrmR]
Автор Гypy (бенгбъс драйвър)
Публикувано15.07.04 10:11  



Да - това е забавно. Няма го във весия 1.0 на .НЕТ, но го има във 1.1. Ако таргет платформата ти е 1.0 - ето ти малко фънки код как да го покажеш въпросният диалог.


<code>
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Security.Permissions;

namespace Microsoft.Samples.WinForms.Extras
{

internal class Win32API
{
// C# representation of the IMalloc interface.
[InterfaceType ( ComInterfaceType.InterfaceIsIUnknown ),
Guid ( "00000002-0000-0000-C000-000000000046" )]
public interface IMalloc
{
[PreserveSig] IntPtr Alloc ( [In] int cb );
[PreserveSig] IntPtr Realloc ( [In] IntPtr pv, [In] int cb );
[PreserveSig] void Free ( [In] IntPtr pv );
[PreserveSig] int GetSize ( [In] IntPtr pv );
[PreserveSig] int DidAlloc ( IntPtr pv );
[PreserveSig] void HeapMinimize ( );
}

[DllImport("User32.DLL")]
public static extern IntPtr GetActiveWindow ( );

public class Shell32
{
// Styles used in the BROWSEINFO.ulFlags field.
[Flags]
public enum BffStyles
{
RestrictToFilesystem = 0x0001, // BIF_RETURNONLYFSDIRS
RestrictToDomain = 0x0002, // BIF_DONTGOBELOWDOMAIN
RestrictToSubfolders = 0x0008, // BIF_RETURNFSANCESTORS
ShowTextBox = 0x0010, // BIF_EDITBOX
ValidateSelection = 0x0020, // BIF_VALIDATE
NewDialogStyle = 0x0040, // BIF_NEWDIALOGSTYLE
BrowseForComputer = 0x1000, // BIF_BROWSEFORCOMPUTER
BrowseForPrinter = 0x2000, // BIF_BROWSEFORPRINTER
BrowseForEverything = 0x4000, // BIF_BROWSEINCLUDEFILES
}

// Delegate type used in BROWSEINFO.lpfn field.
public delegate int BFFCALLBACK ( IntPtr hwnd, uint uMsg, IntPtr lParam, IntPtr lpData );

[StructLayout ( LayoutKind.Sequential, Pack=8 )]
public struct BROWSEINFO
{
public IntPtr hwndOwner;
public IntPtr pidlRoot;
public IntPtr pszDisplayName;
[MarshalAs ( UnmanagedType.LPTStr )]
public string lpszTitle;
public int ulFlags;
[MarshalAs ( UnmanagedType.FunctionPtr )]
public BFFCALLBACK lpfn;
public IntPtr lParam;
public int iImage;
}

[DllImport ( "Shell32.DLL" )]
public static extern int SHGetMalloc ( out IMalloc ppMalloc );

[DllImport ( "Shell32.DLL" )]
public static extern int SHGetSpecialFolderLocation (
IntPtr hwndOwner, int nFolder, out IntPtr ppidl );

[DllImport ( "Shell32.DLL" )]
public static extern int SHGetPathFromIDList (
IntPtr pidl, StringBuilder Path );

[DllImport ( "Shell32.DLL", CharSet=CharSet.Auto )]
public static extern IntPtr SHBrowseForFolder ( ref BROWSEINFO bi );
}
}



/// <summary>
/// Component wrapping access to the Browse For Folder common dialog box.
/// Call the ShowDialog() method to bring the dialog box up.
/// </summary>


[ToolboxBitmap(typeof(FolderBrowser))]
public sealed class FolderBrowser : Component
{
private static readonly int MAX_PATH = 260;

// Root node of the tree view.
private FolderID startLocation = FolderID.Desktop;

// Browse info options.
private int publicOptions = (int) Win32API.Shell32.BffStyles.RestrictToFilesystem |
(int) Win32API.Shell32.BffStyles.RestrictToDomain;
private int privateOptions = (int) Win32API.Shell32.BffStyles.NewDialogStyle;

// Description text to show.
private string descriptionText = "Please select a folder below:";

// Folder chosen by the user.
private string directoryPath = String.Empty;

/// <summary>
/// Enum of CSIDLs identifying standard shell folders.
/// </summary>
public enum FolderID
{
Desktop = 0x0000,
Printers = 0x0004,
MyDocuments = 0x0005,
Favorites = 0x0006,
Recent = 0x0008,
SendTo = 0x0009,
StartMenu = 0x000b,
MyComputer = 0x0011,
NetworkNeighborhood = 0x0012,
Templates = 0x0015,
MyPictures = 0x0027,
NetAndDialUpConnections = 0x0031,
}

private static Win32API.IMalloc GetSHMalloc ( )
{
Win32API.IMalloc malloc;
Win32API.Shell32.SHGetMalloc ( out malloc );
return malloc;
}

/// <summary>
/// Shows the folder browser dialog box.
/// </summary>
public DialogResult ShowDialog ( )
{
return ShowDialog ( null );
}

/// <summary>
/// Shows the folder browser dialog box with the specified owner window.
/// </summary>
public DialogResult ShowDialog ( IWin32Window owner )
{
IntPtr pidlRoot = IntPtr.Zero;

// Get/find an owner HWND for this dialog.
IntPtr hWndOwner;

if ( owner != null )
{
hWndOwner = owner.Handle;
}
else
{
hWndOwner = Win32API.GetActiveWindow ( );
}

// Get the IDL for the specific startLocation.
Win32API.Shell32.SHGetSpecialFolderLocation ( hWndOwner, (int) startLocation, out pidlRoot );

if (pidlRoot == IntPtr.Zero)
{
return DialogResult.Cancel;
}

int mergedOptions = (int)publicOptions | (int)privateOptions;

if ( ( mergedOptions & (int)Win32API.Shell32.BffStyles.NewDialogStyle ) != 0 )
{
if ( System.Threading.ApartmentState.MTA == Application.OleRequired ( ) )
mergedOptions = mergedOptions & (~ (int)Win32API.Shell32.BffStyles.NewDialogStyle);
}

IntPtr pidlRet = IntPtr.Zero;

try
{
// Construct a BROWSEINFO.
Win32API.Shell32.BROWSEINFO bi = new Win32API.Shell32.BROWSEINFO ( );
IntPtr buffer = Marshal.AllocHGlobal ( MAX_PATH);

bi.pidlRoot = pidlRoot;
bi.hwndOwner = hWndOwner;
bi.pszDisplayName = buffer;
bi.lpszTitle = descriptionText;
bi.ulFlags = mergedOptions;
// The rest of the fields are initialized to zero by the constructor.
// bi.lpfn = null; bi.lParam = IntPtr.Zero; bi.iImage = 0;

// Show the dialog.
pidlRet = Win32API.Shell32.SHBrowseForFolder ( ref bi );

// Free the buffer you've allocated on the global heap.
Marshal.FreeHGlobal ( buffer );

if ( pidlRet == IntPtr.Zero )
{
// User clicked Cancel.
return DialogResult.Cancel;
}

// Then retrieve the path from the IDList.
StringBuilder sb = new StringBuilder ( MAX_PATH );
if ( 0 == Win32API.Shell32.SHGetPathFromIDList ( pidlRet, sb ) )
{
return DialogResult.Cancel;
}

// Convert to a string.
directoryPath = sb.ToString ( );
}
finally
{
Win32API.IMalloc malloc = GetSHMalloc ( );
malloc.Free ( pidlRoot );

if ( pidlRet != IntPtr.Zero )
{
malloc.Free ( pidlRet );
}
}

return DialogResult.OK;
}

/// <summary>
/// Helper function used to set and reset bits in the publicOptions bitfield.
/// </summary>
private void SetOptionField ( int mask, bool turnOn )
{
if (turnOn)
publicOptions |= mask;
else
publicOptions &= ~mask;
}

/// <summary>
/// Only return file system directories. If the user selects folders
/// that are not part of the file system, the OK button is unavailable.
/// </summary>
[Category ( "Navigation" )]
[Description ( "Only return file system directories. If the user selects folders " +
"that are not part of the file system, the OK button is unavailable." )]
[DefaultValue ( true )]
public bool OnlyFilesystem
{
get
{
return (publicOptions & (int) Win32API.Shell32.BffStyles.RestrictToFilesystem) != 0;
}
set
{
SetOptionField ( (int) Win32API.Shell32.BffStyles.RestrictToFilesystem, value );
}
}

/// <summary>
/// Location of the root folder from which to start browsing. Only the specified
/// folder and any folders beneath it in the namespace hierarchy appear
/// in the dialog box.
/// </summary>
[Category ( "Navigation" )]
[Description ( "Location of the root folder from which to start browsing. Only the specified " +
"folder and any folders beneath it in the namespace hierarchy appear " +
"in the dialog box." )]
[DefaultValue ( typeof(FolderID), "0")]
public FolderID StartLocation
{
get
{
return startLocation;
}
set
{
new UIPermission ( UIPermissionWindow.AllWindows ).Demand ( );
startLocation = value;
}
}

/// <summary>
/// Full path to the folder selected by the user.
/// </summary>
[Category("Navigation")]
[Description("Full path to the folder slected by the user.")]
public string DirectoryPath
{
get
{
return directoryPath;
}
}



}




}

</code>

--
Sometimes the sole purpose of your life is to serve as a warning to others.

Редактирано от Гypy на 15.07.04 10:11.



Цялата тема
ТемаАвторПубликувано
* DirectorySelectDialog DrmR   15.07.04 00:39
. * Re: DirectorySelectDialog Mgla   15.07.04 09:33
. * Re: DirectorySelectDialog Гypy   15.07.04 10:11
. * Re: DirectorySelectDialog antipop   15.07.04 10:18
. * Re: DirectorySelectDialog nevil   15.07.04 10:47
. * Re: DirectorySelectDialog DrmR   15.07.04 18:36
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.