亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲三级理论片| 丁香五精品蜜臀久久久久99网站| 美女诱惑一区二区| 99re在线视频这里只有精品| 制服丝袜中文字幕一区| 中文字幕五月欧美| 韩国精品一区二区| 欧美一区二区三区在线观看视频| 中文字幕一区不卡| 国产精品一区二区三区99| 88在线观看91蜜桃国自产| 亚洲高清久久久| 国产精品传媒在线| 麻豆91精品91久久久的内涵| 色偷偷成人一区二区三区91| 国产调教视频一区| 蓝色福利精品导航| 欧美精品一二三| 亚洲图片有声小说| 91香蕉视频黄| 国产精品二三区| 国产成人免费xxxxxxxx| 精品久久久久久久久久久久包黑料 | 精品少妇一区二区| 天天影视涩香欲综合网| 欧美日韩中文精品| 亚洲国产精品天堂| 欧美视频在线播放| 亚洲成人资源网| 欧美在线影院一区二区| 一区二区三区精品视频在线| 91视视频在线观看入口直接观看www| 欧美精彩视频一区二区三区| 国产精品一品视频| 中文字幕av在线一区二区三区| 国产精品一区二区三区四区| 精品欧美久久久| 激情图区综合网| 精品国产91九色蝌蚪| 久久成人18免费观看| 精品国产髙清在线看国产毛片| 蜜臀精品久久久久久蜜臀| 日韩西西人体444www| 激情久久久久久久久久久久久久久久| 日韩欧美国产1| 国产一区二区伦理| 中文字幕精品一区二区精品绿巨人| 成人免费毛片片v| 亚洲欧美中日韩| 欧美日韩在线直播| 老司机精品视频导航| 国产三级精品三级在线专区| 91视频免费播放| 午夜激情久久久| 精品99999| 9人人澡人人爽人人精品| 亚洲激情六月丁香| 日韩欧美国产综合一区| 国产很黄免费观看久久| 亚洲六月丁香色婷婷综合久久 | 亚洲.国产.中文慕字在线| 在线成人高清不卡| 国产精品自拍一区| 一区二区三区四区亚洲| 日韩视频永久免费| av在线不卡观看免费观看| 亚洲国产成人精品视频| 欧美v国产在线一区二区三区| www.亚洲激情.com| 免费黄网站欧美| 国产精品久久久久婷婷| 538prom精品视频线放| 成人综合激情网| 午夜精品久久久久久久久久 | 国产精品69毛片高清亚洲| 亚洲精品高清视频在线观看| 欧美私模裸体表演在线观看| 国内精品久久久久影院薰衣草| 亚洲男同性视频| 国产日韩精品久久久| 91精品婷婷国产综合久久竹菊| 成人性生交大片免费看中文| 免费xxxx性欧美18vr| 亚洲男人的天堂一区二区| 久久久久久麻豆| 欧美精品在线视频| 91国模大尺度私拍在线视频| 国产精品一区二区黑丝| 男人的j进女人的j一区| 亚洲第一激情av| 亚洲日本丝袜连裤袜办公室| 精品国产一区二区三区不卡| 欧美精品丝袜中出| 色拍拍在线精品视频8848| 成人小视频免费在线观看| 久久国产麻豆精品| 日韩精品亚洲专区| 亚洲网友自拍偷拍| 一区二区不卡在线视频 午夜欧美不卡在 | 男人的j进女人的j一区| 亚洲在线一区二区三区| 日韩精品福利网| 亚洲一区二区三区不卡国产欧美 | 亚洲国产精品久久久男人的天堂| 国产精品国产三级国产三级人妇| 亚洲精品一区二区在线观看| 91精品国产一区二区三区蜜臀| 欧美在线啊v一区| 在线免费观看一区| 欧美熟乱第一页| 在线一区二区三区| 欧美亚洲动漫另类| 欧美日韩一二区| 欧美日韩国产在线观看| 欧美色手机在线观看| 在线观看亚洲一区| 欧美乱妇20p| 欧美一区二区三区视频在线| 欧美一级xxx| 亚洲精品一区二区三区蜜桃下载 | 成人免费视频免费观看| 成人av小说网| 色妞www精品视频| 欧美专区日韩专区| 欧美精品在线观看播放| 欧美α欧美αv大片| 久久先锋资源网| 国产精品美女一区二区三区| 亚洲欧美综合在线精品| 一区二区三区视频在线观看| 五月婷婷激情综合| 麻豆91免费观看| 成人综合激情网| 在线观看av不卡| 91精品国产欧美一区二区| 精品久久久久久久久久久久包黑料| 久久综合网色—综合色88| 欧美国产激情二区三区 | 日本福利一区二区| 3atv一区二区三区| www欧美成人18+| 亚洲女与黑人做爰| 另类中文字幕网| 波多野结衣中文字幕一区| 欧美性视频一区二区三区| 日韩欧美亚洲另类制服综合在线 | 久久中文娱乐网| 久久国产生活片100| 成人av电影在线| 欧美日韩免费一区二区三区| 日韩欧美久久一区| 欧美激情在线一区二区| 亚洲国产精品影院| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美日韩精品二区第二页| 日韩亚洲电影在线| 最新热久久免费视频| 三级影片在线观看欧美日韩一区二区| 精品亚洲成a人在线观看| 97久久久精品综合88久久| 日韩欧美国产一区二区三区| 国产精品久久久久久亚洲毛片| 亚洲在线中文字幕| 成人免费观看男女羞羞视频| 91精品国产乱| 亚洲欧洲精品一区二区精品久久久| 日本亚洲一区二区| 91网站最新网址| 欧美成人免费网站| 亚洲成人手机在线| 岛国精品在线观看| 精品国产免费久久| 天天av天天翘天天综合网| 99精品视频在线观看免费| 精品国产免费人成电影在线观看四季 | 亚洲四区在线观看| 国产黄色91视频| 日韩三级伦理片妻子的秘密按摩| 亚洲女性喷水在线观看一区| 东方欧美亚洲色图在线| 精品精品国产高清一毛片一天堂| 亚洲成av人片在线观看无码| 91网站最新网址| 国产精品日韩成人| 国产精品一二三| 精品国产91亚洲一区二区三区婷婷 | 亚洲男女毛片无遮挡| 欧美系列一区二区| 成人性生交大片免费看在线播放| 午夜精品福利一区二区蜜股av| 精品国产a毛片| 成人免费福利片| 日本va欧美va精品| 免费人成精品欧美精品| 国产精品免费视频观看| 91麻豆精品国产91久久久资源速度| 国产白丝网站精品污在线入口| 日韩av在线发布| 青青草国产成人av片免费| 中文字幕在线免费不卡|