亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? shelltree.cpp

?? CAN__組建現場總線系統設計技術(光盤)
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
#include "stdafx.h"
#include "shelltree.h"
#include "shfileinfo.h"
#include "fpattern.h"



#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#pragma warning ( disable : 4711 )
////////////////////////////////////////////////////////////////////////////////
// CShellTree
//

CShellTree::CShellTree ()
{
  m_flags = SHLT_FOLDERS;
}

CShellTree:: ~ CShellTree ()
{
}

BEGIN_MESSAGE_MAP (CShellTree, CTreeCtrl)
//{{AFX_MSG_MAP(CShellTree)
ON_MESSAGE (SHLT_GETFLAGS, OnGetFlags)
ON_MESSAGE (SHLT_MODIFYFLAGS, OnModifyFlags)
ON_MESSAGE (SHLT_MODIFYPATTERN, OnModifyPattern)
//}}AFX_MSG_MAP
END_MESSAGE_MAP ()

#pragma warning ( disable : 4100 )
LRESULT CShellTree::OnGetFlags (WPARAM wParam, LPARAM lParam)
{
  return GetFlags ();
}
#pragma warning ( default : 4100 )

LRESULT CShellTree::
OnModifyFlags (WPARAM wParam, LPARAM lParam)
{
  ModifyFlags (wParam, lParam);
  return 0;
}

#pragma warning ( disable : 4100 )
LRESULT CShellTree::
OnModifyPattern (WPARAM wParam, LPARAM lParam)
{
  ModifyPattern ((LPCTSTR) lParam);
  return 0;
}
#pragma warning ( default : 4100 )

DWORD CShellTree::GetFlags ()
const
{
  return m_flags;
}

void CShellTree::ModifyFlags (DWORD dwRemove, DWORD dwAdd)
{
  DWORD flags = m_flags;

  m_flags &= ~dwRemove;
  m_flags |= dwAdd;
  if (m_flags != flags)
    PopulateTree ();
}

void CShellTree::
ModifyPattern (CString pattern)
{
  CString part;
  int pos, len = pattern.GetLength ();

  m_patterns.RemoveAll ();
  while ((pos = pattern.Find (_T (','))) != -1)
    {
      part = pattern.Left (pos);
      if (!part.IsEmpty () && fpattern_isvalid (part))
        {
          m_patterns.AddTail (part);
        }
      len -= pos + 1;
      pattern = pattern.Right (len);
    }
  if (pattern.IsEmpty () && fpattern_isvalid (pattern))
    {
      m_patterns.AddTail (pattern);
    }
  if (m_flags & SHLT_FILES)
    PopulateTree ();
}

/****************************************************************************
 *
 *    FUNCTION: PopulateTree()
 *
 *    PURPOSE:  Processes the File.Fill/RefreshTree command
 *
 ****************************************************************************/
void CShellTree::
PopulateTree ()
{

  LPSHELLFOLDER lpsf = NULL;
  LPITEMIDLIST lpi = NULL;
  HRESULT hr;
  TV_SORTCB tvscb;

  // Get a pointer to the desktop folder.
  hr = SHGetDesktopFolder (&lpsf);

  if (SUCCEEDED (hr))
    {
      // Initialize the tree view to be empty.
      DeleteAllItems ();

      // Fill in the tree view from the root.
      FillTreeView (lpsf, NULL, TVI_ROOT);
      //TunnelFillTree(lpsf, NULL, TVI_ROOT);
      // Release the folder pointer.
      lpsf->Release ();
    }
  tvscb.hParent = TVI_ROOT;
  tvscb.lParam = 0;
  tvscb.lpfnCompare = TreeViewCompareProc;

  // Sort the items in the tree view
  SortChildrenCB (&tvscb /*, FALSE */ );

  HTREEITEM hItem;
  hItem = GetRootItem ();
  Expand (hItem, TVE_EXPAND);
  Select (GetRootItem (), TVGN_CARET);
}

/****************************************************************************
 *
 *  FUNCTION:   PopulateTree()
 *
 *  PURPOSE:    Processes the File.Fill/RefreshTree command
 *              This overload  has the ability to open from a
 *              special folderlocation like SHBrowseForFolder()
 *
 *  WARNING:    TunnelTree() will not work if you use a special
 *              folderlocation
 *
 ****************************************************************************/
void CShellTree::PopulateTree (int nFolder)
{

  LPSHELLFOLDER lpsf = NULL, lpsf2 = NULL;
  LPITEMIDLIST lpi = NULL;
  HRESULT hr;
  TV_SORTCB tvscb;

  // Get a pointer to the desktop folder.
  hr = SHGetDesktopFolder (&lpsf);

  if (SUCCEEDED (hr))
    {
      // Initialize the tree view to be empty.
      DeleteAllItems ();

      if (!SUCCEEDED (SHGetSpecialFolderLocation (
                          m_hWnd, nFolder, &lpi)))
        {
          lpi = NULL;
          FillTreeView (lpsf, NULL, TVI_ROOT);
        }
      else
        {
          hr = lpsf->BindToObject (lpi,
                                   0, IID_IShellFolder, (LPVOID *) & lpsf2);

          if (SUCCEEDED (hr))
            {
              // Fill in the tree view from the root.
              FillTreeView (lpsf2, lpi, TVI_ROOT);
              lpsf2->Release ();
            }
          else
            FillTreeView (lpsf, NULL, TVI_ROOT);
        }

      // Release the folder pointer.
      lpsf->Release ();
    }
  tvscb.hParent = TVI_ROOT;
  tvscb.lParam = 0;
  tvscb.lpfnCompare = TreeViewCompareProc;

  // Sort the items in the tree view
  SortChildrenCB (&tvscb /*, FALSE */ );

  HTREEITEM hItem;
  hItem = GetRootItem ();
  Expand (hItem, TVE_EXPAND);
  Select (GetRootItem (), TVGN_CARET);
}

/****************************************************************************
 *
 *  FUNCTION: FillTreeView( LPSHELLFOLDER lpsf,
 *                          LPITEMIDLIST  lpifq,
 *                          HTREEITEM     hParent)
 *
 *  PURPOSE: Fills a branch of the TreeView control.  Given the
 *           shell folder, enumerate the subitems of this folder,
 *           and add the appropriate items to the tree.
 *
 *  PARAMETERS:
 *    lpsf         - Pointer to shell folder that we want to enumerate items
 *    lpifq        - Fully qualified item id list to the item that we are enumerating
 *                   items for.  In other words, this is the PIDL to the item
 *                   identified by the lpsf parameter.
 *    hParent      - Parent node
 *
 *  COMMENTS:
 *    This function enumerates the items in the folder identifed by lpsf.
 *    Note that since we are filling the left hand pane, we will only add
 *    items that are folders and/or have sub-folders.  We *could* put all
 *    items in here if we wanted, but that's not the intent.
 *
 ****************************************************************************/
void CShellTree::
FillTreeView (LPSHELLFOLDER lpsf, LPITEMIDLIST lpifq, HTREEITEM hParent)
{
  TV_ITEM tvi;                  // TreeView Item.

  TV_INSERTSTRUCT tvins;        // TreeView Insert Struct.

  HTREEITEM hPrev = NULL;       // Previous Item Added.

  LPSHELLFOLDER lpsf2 = NULL;
  LPENUMIDLIST lpe = NULL;
  LPITEMIDLIST lpi = NULL, lpiTemp = NULL, lpifqThisItem = NULL;
  LPTVITEMDATA lptvid = NULL;
  LPMALLOC lpMalloc = NULL;
  ULONG ulFetched;
  UINT uCount = 0;
  HRESULT hr;
  TCHAR szBuff[256];
  HWND hwnd =::GetParent (m_hWnd);

  // Allocate a shell memory object.
  hr =::SHGetMalloc (&lpMalloc);
  if (FAILED (hr))
    return;

  if (SUCCEEDED (hr))
    {
      // Get the IEnumIDList object for the given folder.
      hr = lpsf->EnumObjects (hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &lpe);

      if (SUCCEEDED (hr))
        {
          // Enumerate throught the list of folder and non-folder objects.
          while (S_OK == lpe->Next (1, &lpi, &ulFetched))
            {
              uCount++;
              //Create a fully qualified path to the current item
              //The SH* shell api's take a fully qualified path pidl,
              //(see GetIcon above where I call SHGetFileInfo) whereas the
              //interface methods take a relative path pidl.
              ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;

              // Determine what type of object we have.
              lpsf->GetAttributesOf (1, (const struct _ITEMIDLIST **) &lpi, &ulAttrs);

              //:original                if(ulAttrs & (SFGAO_HASSUBFOLDER | SFGAO_FOLDER))
              if (m_flags & SHLT_FOLDERS && ulAttrs & SFGAO_FOLDER ||
                    m_flags & SHLT_FILES && !(ulAttrs & (SFGAO_FOLDER | SFGAO_LINK)) ||
                    m_flags & SHLT_LINKS && ulAttrs & SFGAO_LINK)
                {
                  //We need this next if statement so that we don't add things like
                  //the MSN to our tree.  MSN is not a folder, but according to the
                  //shell it has subfolders.
                  //:original                   if(ulAttrs & SFGAO_FOLDER)
                  {
                    tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

                    //:original                      if(ulAttrs & SFGAO_HASSUBFOLDER)
                    if (ulAttrs & (SFGAO_FOLDER | SFGAO_HASSUBFOLDER))
                      {
                        //This item has sub-folders, so let's put the + in the TreeView.
                        //The first time the user clicks on the item, we'll populate the
                        //sub-folders.
                        tvi.cChildren = 1;
                        tvi.mask |= TVIF_CHILDREN;
                      }

                    //Now get the friendly name that we'll put in the treeview.
                    if (!GetName (lpsf, lpi, SHGDN_NORMAL, szBuff))
                      goto Done;    // Error - could not get friendly name.

                    if (!(ulAttrs & (SFGAO_FOLDER | SFGAO_LINK)))
                      {
                        POSITION pos = m_patterns.GetHeadPosition ();

                        if (pos)
                          {
                            CString pattern;

                            do
                              {
                                pattern = m_patterns.GetNext (pos);
                                if (fpattern_matchn (pattern, szBuff))
                                  goto found;
                              }
                            while (pos);
                            goto next;
found:
                            ;
                          }
                      }

                    //OK, let's get some memory for our ITEMDATA struct
                    lptvid = (LPTVITEMDATA) lpMalloc->Alloc (sizeof (TVITEMDATA));
                    if (!lptvid)
                      goto Done;    // Error - could not allocate memory.

                    tvi.pszText = szBuff;
                    tvi.cchTextMax = MAX_PATH;

                    lpifqThisItem = ConcatPidls (lpifq, lpi);

                    //Now, make a copy of the ITEMIDLIST
                    lptvid->lpi = CopyITEMID (lpMalloc, lpi);

                    GetNormalAndSelectedIcons (lpifqThisItem, &tvi);

                    lptvid->lpsfParent = lpsf;  //Store the parent folders SF

                    lpsf->AddRef ();

                    lptvid->lpifq = ConcatPidls (lpifq, lpi);

                    tvi.lParam = (LPARAM) lptvid;

                    // Populate the TreeVeiw Insert Struct
                    // The item is the one filled above.
                    // Insert it after the last item inserted at this level.
                    // And indicate this is a root entry.
                    tvins.item = tvi;
                    tvins.hInsertAfter = hPrev;
                    tvins.hParent = hParent;

                    // Add the item to the tree
                    hPrev = InsertItem (&tvins);
                  }
                  // Free this items task allocator.
                  lpMalloc->Free (lpifqThisItem);
                  lpifqThisItem = 0;
                }
next:
              lpMalloc->Free (lpi);     //Free the pidl that the shell gave us.

              lpi = 0;
            }
          if (!uCount)
            {
              tvi.hItem = hParent;
              tvi.cChildren = 0;
              tvi.mask = TVIF_HANDLE | TVIF_CHILDREN;
              SetItem (&tvi);
            }
        }

    }
  else
    return;

Done:

  if (lpe)
    lpe->Release ();

  //The following 2 if statements will only be TRUE if we got here on an
  //error condition from the "goto" statement.  Otherwise, we free this memory
  //at the end of the while loop above.
  if (lpi && lpMalloc)
    lpMalloc->Free (lpi);
  if (lpifqThisItem && lpMalloc)
    lpMalloc->Free (lpifqThisItem);

  if (lpMalloc)
    lpMalloc->Release ();
}


/****************************************************************************
 *
 *    FUNCTION: GetNormalAndSelectedIcons(LPITEMIDLIST lpifq, LPTV_ITEM lptvitem)
 *
 *    PURPOSE:  Gets the index for the normal and selected icons for the current item.
 *
 *    PARAMETERS:
 *    lpifq    - Fully qualified item id list for current item.
 *    lptvitem - Pointer to treeview item we are about to add to the tree.
 *

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美中文字幕公布| 福利一区福利二区| 国产精品看片你懂得| 欧美精品一区视频| 欧美成人激情免费网| 欧美一区二区在线播放| 欧美午夜电影网| 91黄色免费观看| 色综合天天综合色综合av | 成人国产电影网| 国产成人免费在线视频| 国产一区在线不卡| 国产裸体歌舞团一区二区| 精品亚洲aⅴ乱码一区二区三区| 日韩精品一二三四| 视频一区国产视频| 麻豆精品一区二区| 国产美女一区二区| 成人午夜激情在线| 日本福利一区二区| 欧美日韩一区二区在线观看视频 | 欧美性色黄大片| 在线观看欧美精品| 777欧美精品| 欧美成人三级电影在线| 久久久久久久综合| 中文字幕一区二区三| 一区二区三区视频在线观看| 亚洲一区二区三区爽爽爽爽爽| 亚洲电影视频在线| 精品一区二区久久| 成人福利在线看| 色哟哟在线观看一区二区三区| 欧美色窝79yyyycom| 日韩免费高清电影| 国产欧美精品国产国产专区| 亚洲欧美日韩在线| 日本欧美肥老太交大片| 国产黄色精品网站| 欧美日韩国产系列| 国产欧美精品日韩区二区麻豆天美| 亚洲欧美日韩电影| 国产一区二区三区香蕉| 91麻豆自制传媒国产之光| 91精品国产乱码| 国产精品无遮挡| 日韩精品一二区| 99精品久久只有精品| 这里只有精品视频在线观看| 国产日韩欧美综合在线| 天天综合网 天天综合色| 丁香五精品蜜臀久久久久99网站| 在线观看国产一区二区| 亚洲精品一区二区三区蜜桃下载| 亚洲精品老司机| 亚洲猫色日本管| 国产精品99久久久久久似苏梦涵 | 欧美午夜一区二区三区| 国产亚洲福利社区一区| 亚洲成人精品一区二区| 不卡av在线免费观看| 欧美刺激午夜性久久久久久久| 亚洲欧美日韩一区| 成人福利视频在线看| 日韩久久久精品| 婷婷亚洲久悠悠色悠在线播放| 国产·精品毛片| 久久亚洲一级片| 男人的j进女人的j一区| 欧美日韩一卡二卡| 亚洲另类一区二区| 丁香一区二区三区| 久久久www成人免费无遮挡大片| 国产中文字幕一区| 宅男在线国产精品| 亚洲福利视频三区| 欧美午夜精品免费| 亚洲综合激情网| 91在线国产福利| 国产精品不卡一区| av高清不卡在线| 欧美激情一区二区三区不卡| 国产乱码精品一区二区三| 欧美大片在线观看一区| 美女国产一区二区| 日韩色视频在线观看| 久久精品国产**网站演员| 欧美夫妻性生活| 日本不卡一区二区| 欧美一区二区三区视频在线观看| 日韩精品1区2区3区| 日韩一区二区影院| 蓝色福利精品导航| 久久午夜电影网| 国产精品一卡二卡| 国产精品成人免费在线| 91免费版pro下载短视频| 夜夜精品视频一区二区| 欧美日韩在线直播| 久久不见久久见免费视频7| 亚洲精品一区二区三区蜜桃下载| 久久99久久99| 国产精品三级电影| 91香蕉视频mp4| 亚洲成av人在线观看| 精品国产露脸精彩对白| www.66久久| 亚洲成人先锋电影| 久久人人超碰精品| eeuss鲁片一区二区三区在线观看| 一区二区三区在线视频免费观看| 欧美巨大另类极品videosbest | 2019国产精品| 91视频你懂的| 蜜桃一区二区三区在线观看| 久久精品夜色噜噜亚洲a∨| 91色综合久久久久婷婷| 天堂va蜜桃一区二区三区漫画版 | 国产一区欧美二区| 亚洲欧美日韩国产另类专区| 91精品国产美女浴室洗澡无遮挡| 国产成人精品三级麻豆| 亚洲最新视频在线观看| 久久久久久久免费视频了| 欧美影院午夜播放| 国产精品亚洲成人| 亚洲成人精品一区| 国产精品久久久久久久午夜片| 6080午夜不卡| 99久久精品国产一区| 麻豆精品视频在线观看| 一区二区三区在线免费播放| 久久先锋资源网| 欧美日韩高清一区二区三区| 成人激情开心网| 蜜臀久久久99精品久久久久久| 亚洲欧洲色图综合| 欧美zozo另类异族| 精品视频一区 二区 三区| 成人avav影音| 国产精品一色哟哟哟| 日本va欧美va精品发布| 亚洲一二三四久久| 亚洲色图欧美在线| 国产日韩欧美在线一区| 日韩三级视频在线观看| 欧美日韩一二三| 日本道免费精品一区二区三区| 国产不卡免费视频| 国内外成人在线| 美日韩一区二区| 日韩av在线免费观看不卡| 一区二区三区蜜桃| 中文字幕在线不卡国产视频| 欧美激情一区二区三区在线| 精品国产乱码久久久久久夜甘婷婷| 欧美性猛交xxxxxxxx| 色琪琪一区二区三区亚洲区| www.66久久| 99久久久无码国产精品| av一区二区久久| 日韩视频在线你懂得| 欧美日韩一卡二卡三卡| 欧美日韩视频第一区| 欧美色精品在线视频| 欧美日韩免费视频| 欧美日韩国产免费| 91精品国产一区二区| 日韩三级在线观看| xnxx国产精品| 国产精品视频一二三| 亚洲欧美一区二区三区久本道91 | 亚洲少妇屁股交4| 亚洲免费在线视频一区 二区| 尤物在线观看一区| 亚洲高清免费在线| 青草av.久久免费一区| 狠狠色丁香婷婷综合| 国产高清视频一区| 91视频一区二区三区| 欧美日韩国产片| 久久婷婷久久一区二区三区| 亚洲国产精品成人综合色在线婷婷| 亚洲欧美在线另类| 亚洲成年人网站在线观看| 久久精品国产精品青草| 国产精品456露脸| 日本韩国视频一区二区| 欧美精品亚洲一区二区在线播放| 日韩精品影音先锋| 成人欧美一区二区三区1314| 亚洲18女电影在线观看| 精品制服美女丁香| 91蝌蚪porny九色| 日韩美女在线视频| 亚洲精品日韩专区silk| 狠狠色丁香婷婷综合久久片| 在线视频你懂得一区| 日韩免费成人网| 一区二区日韩电影|