/// <summary> /// Loads the root TreeView nodes. /// </summary> private void LoadRootNodes() { // Create the root shell item. ShellItem m_shDesktop = new ShellItem(); // Create the root node. TreeNode tvwRoot = new TreeNode(); tvwRoot.Text = m_shDesktop.DisplayName; tvwRoot.ImageIndex = m_shDesktop.IconIndex; tvwRoot.SelectedImageIndex = m_shDesktop.IconIndex; tvwRoot.Tag = m_shDesktop; // Now we need to add any children to the root node. ArrayList arrChildren = m_shDesktop.GetSubFolders(); foreach (ShellItem shChild in arrChildren) { TreeNode tvwChild = new TreeNode(); tvwChild.Text = shChild.DisplayName; tvwChild.ImageIndex = shChild.IconIndex; tvwChild.SelectedImageIndex = shChild.IconIndex; tvwChild.Tag = shChild; // If this is a folder item and has children then add a place holder node. if (shChild.IsFolder && shChild.HasSubFolder) tvwChild.Nodes.Add("PH"); tvwRoot.Nodes.Add(tvwChild); } // Add the root node to the tree. treeWnd.Nodes.Clear(); treeWnd.Nodes.Add(tvwRoot); tvwRoot.Expand(); }
/// <summary> /// Constructor. Create a sub-item shell item object. /// </summary> /// <param name="shDesktop">IShellFolder interface of the Desktop</param> /// <param name="pIDL">The fully qualified PIDL for this shell item</param> /// <param name="shParent">The ShellItem object for this item's parent</param> public ShellItem(ShellAPI.IShellFolder shDesktop, IntPtr pIDL, ShellItem shParent) { // We need the Desktop shell item to exist first. if (m_bHaveRootShell == false) throw new Exception("The root shell item must be created before creating a sub-item"); // Create the FQ PIDL for this new item. m_pIDL = ShellAPI.ILCombine(shParent.PIDL, pIDL); // Get the properties of this item. ShellAPI.SFGAOF uFlags = ShellAPI.SFGAOF.SFGAO_FOLDER | ShellAPI.SFGAOF.SFGAO_HASSUBFOLDER; // Here we get some basic attributes. shDesktop.GetAttributesOf(1, out m_pIDL, out uFlags); IsFolder = Convert.ToBoolean(uFlags & ShellAPI.SFGAOF.SFGAO_FOLDER); HasSubFolder = Convert.ToBoolean(uFlags & ShellAPI.SFGAOF.SFGAO_HASSUBFOLDER); // Now we want to get extended attributes such as the icon index etc. ShellAPI.SHFILEINFO shInfo = new ShellAPI.SHFILEINFO(); ShellAPI.SHGFI vFlags = ShellAPI.SHGFI.SHGFI_SMALLICON | ShellAPI.SHGFI.SHGFI_SYSICONINDEX | ShellAPI.SHGFI.SHGFI_PIDL | ShellAPI.SHGFI.SHGFI_DISPLAYNAME; ShellAPI.SHGetFileInfo(m_pIDL, 0, out shInfo, (uint)Marshal.SizeOf(shInfo), vFlags); DisplayName = shInfo.szDisplayName; IconIndex = shInfo.iIcon; Path = GetPath(); // Create the IShellFolder interface for this item. if (IsFolder) { uint hRes = shParent.m_shShellFolder.BindToObject(pIDL, IntPtr.Zero, ref ShellAPI.IID_IShellFolder, out m_shShellFolder); if (hRes != 0) Marshal.ThrowExceptionForHR((int)hRes); } }