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

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

?? shelltreectrl.cpp

?? 一個完整的顯示Windows目錄的程序
?? CPP
字號:
// ShellTreeCtrl.cpp : implementation file
//
/////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2000-2001 by Paolo Messina
// (http://www.geocities.com/ppescher - ppescher@yahoo.com)
//
// The contents of this file are subject to the Artistic License (the "License").
// You may not use this file except in compliance with the License. 
// You may obtain a copy of the License at:
// http://www.opensource.org/licenses/artistic-license.html
//
// If you find this code useful, credits would be nice!
//
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ShellTreeCtrl.h"

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

/////////////////////////////////////////////////////////////////////////////
// CShellTreeCtrl

CShellTreeCtrl::CShellTreeCtrl()
{
	m_nCallbackMask = 0;
}

CShellTreeCtrl::~CShellTreeCtrl()
{
}


BEGIN_MESSAGE_MAP(CShellTreeCtrl, CWaitingTreeCtrl)
	//{{AFX_MSG_MAP(CShellTreeCtrl)
	ON_NOTIFY_REFLECT(TVN_DELETEITEM, OnDeleteItem)
	ON_NOTIFY_REFLECT(TVN_GETDISPINFO, OnGetDispInfo)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CShellTreeCtrl message handlers

BOOL CShellTreeCtrl::PopulateItem(HTREEITEM hParent)
{
	if (hParent == TVI_ROOT)
	{
		// not handled yet, do nothing in Release builds
		ASSERT(FALSE);
		return TRUE;
	}

	TVITEMDATA* pData = (TVITEMDATA*)GetItemData(hParent);
	if (pData == NULL)
		return TRUE;	// invalid shell item, ignore it silently

	// get parent pidl
	ASSERT(pData->IsValid());
	CShellPidl& pidlParent = pData->pidlAbs;

	if (!EnumFolderItems(hParent, pidlParent, pData->nFlags))
		return TRUE;	// failed, won't try anymore!

// TODO: change this method!!

	// do not check for children if parent is a removable media
	// (just try: if it's a filesystem object, it has a path)
	TCHAR path[MAX_PATH];
	if (SHGetPathFromIDList(pidlParent, path))
	{
		path[3] = 0;
		UINT type = GetDriveType(path);
		if (type != DRIVE_FIXED)
			return FALSE;
	}

	return TRUE;
}

void CShellTreeCtrl::PreSubclassWindow() 
{
	InitializeControl();

	CWaitingTreeCtrl::PreSubclassWindow();
}

void CShellTreeCtrl::InitializeControl()
{
    // Attach to the system image list
	CShellPidl pidl((UINT)CSIDL_DESKTOP, m_hWnd);
    
    SHFILEINFO sfi;
	ZeroMemory(&sfi, sizeof(SHFILEINFO));
	HIMAGELIST hSysImageList = (HIMAGELIST) SHGetFileInfo((LPCTSTR)(LPCITEMIDLIST)pidl,
		0, &sfi, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

	//TreeView_SetImageList(m_hWnd, hSysImageList, TVSIL_NORMAL);
	// postpone imagelist attaching
	// (seems it doesn't like a sendmessage when dynamically created
	// maybe because it has not received the WM_CREATE message yet?)
	PostMessage(TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)hSysImageList);
}

void CShellTreeCtrl::AddRootFolderContent(LPCITEMIDLIST pidlFolder, UINT nFlags)
{
	if (pidlFolder == NULL)
	{
		CShellPidl pidl((UINT)CSIDL_DESKTOP, m_hWnd);
		InsertSubItem(TVI_ROOT, m_pDesktopFolder, NULL, pidl, nFlags);
		return;
	}

	SetRedraw(FALSE);
	EnumFolderItems(TVI_ROOT, pidlFolder, nFlags);
	SetRedraw(TRUE);
}


int CALLBACK CShellTreeCtrl::CompareFunc(LPARAM lParam1,
		LPARAM lParam2, LPARAM /*lParamSort*/)
{
	TVITEMDATA* pData1 = (TVITEMDATA*)lParam1;
	TVITEMDATA* pData2 = (TVITEMDATA*)lParam2;
	ASSERT(pData1->IsValid() && pData2->IsValid());

	// TODO: parent folders should be checked some day
	SShellFolderPtr pParentFolder = pData2->pParentFolder;

	HRESULT hr = pParentFolder->CompareIDs(0,
		pData1->pidlAbs.GetLastChild(),
		pData2->pidlAbs.GetLastChild() );
	if (FAILED(hr))
		return 0;	// error, don't sort
	
	short ret = (short)HRESULT_CODE(hr);
	if (ret < 0)
		return -1;
	if (ret > 0)
		return 1;
	return 0;
}

void CShellTreeCtrl::FillItem(TVITEM& item)
{
	DWORD dwAttributes;

	// get item data
	TVITEMDATA* pData = (TVITEMDATA*)item.lParam;
	ASSERT(pData->IsValid());

	// get a relative pidl
	LPCITEMIDLIST pidlRel = pData->pidlAbs.GetLastChild();

	if (item.mask & TVIF_TEXT)
	{
		// get display name
		CString sName;
		CShellString str;

		if (pData->nFlags & STCF_SHOWPATH)
		{
			// use an absolute or relative path, if possible
			sName = pData->pidlAbs.GetPath();
			if (!sName.IsEmpty() && !(pData->nFlags & STCF_SHOWFULLNAME))
				sName = sName.Right(sName.ReverseFind(_T('\\')));
		}
		if (sName.IsEmpty())
		{
			// use a global or contextual displayname
			DWORD uDisplayFlags = SHGDN_INFOLDER;
			if (pData->nFlags & STCF_SHOWFULLNAME)
				uDisplayFlags = SHGDN_NORMAL;

			pData->pParentFolder->GetDisplayNameOf(pidlRel, uDisplayFlags
				| SHGDN_INCLUDE_NONFILESYS, str.GetPointer(pidlRel));
			sName = str;	// copy to string
		}
		// set item text
		lstrcpyn(item.pszText, (LPCTSTR)sName, item.cchTextMax);
	}

	if (item.mask & (TVIF_IMAGE | TVIF_SELECTEDIMAGE))
	{
		// get some attributes
		dwAttributes = SFGAO_FOLDER | SFGAO_LINK | SFGAO_SHARE | SFGAO_GHOSTED;
		pData->pParentFolder->GetAttributesOf(1, &pidlRel, &dwAttributes);

		// set correct icon
		if (dwAttributes & SFGAO_GHOSTED)
		{
			item.mask |= LVIF_STATE;
			item.stateMask |= LVIS_CUT;
			item.state |= LVIS_CUT;
		}
		if (dwAttributes & SFGAO_SHARE)
		{
			item.mask |= LVIF_STATE;
			item.state &= ~LVIS_OVERLAYMASK;
			item.state |= INDEXTOOVERLAYMASK(1);
			item.stateMask |= LVIS_OVERLAYMASK;
		}
		else if (dwAttributes & SFGAO_LINK)
		{
			item.mask |= LVIF_STATE;
			item.state &= ~LVIS_OVERLAYMASK;
			item.state |= INDEXTOOVERLAYMASK(2);
			item.stateMask |= LVIS_OVERLAYMASK;
		}

		if (item.mask & TVIF_IMAGE)
		{
			item.iImage = pData->pidlAbs.GetIconIndex(SHGFI_SMALLICON);
			item.iSelectedImage = item.iImage;
		}
		if ((item.mask & TVIF_SELECTEDIMAGE)
			&& (dwAttributes & SFGAO_FOLDER))
		{
			item.iSelectedImage = pData->pidlAbs.GetIconIndex(SHGFI_SMALLICON
				|SHGFI_OPENICON);
		}
	}

	if (item.mask & TVIF_CHILDREN)
	{
		// get some attributes
		dwAttributes = SFGAO_FOLDER;
		pData->pParentFolder->GetAttributesOf(1, &pidlRel, &dwAttributes);

		// get children
		item.cChildren = 0;
		if (dwAttributes & SFGAO_FOLDER)
		{
			if (pData->nFlags & STCF_INCLUDEFILES)
				item.cChildren = 1;
			else if (dwAttributes & SFGAO_REMOVABLE)
				item.cChildren = 1;
			else
			{
				dwAttributes = SFGAO_HASSUBFOLDER;
				pData->pParentFolder->GetAttributesOf(1, &pidlRel, &dwAttributes);

				item.cChildren = (dwAttributes & SFGAO_HASSUBFOLDER) ? 1 : 0;
			}
		}
	}

}

void CShellTreeCtrl::OnDeleteItem(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TVITEM& item = ((LPNMTREEVIEW)pNMHDR)->itemOld;

	// free item data, ignore invalid shell items
	if (item.lParam != 0)
		delete (TVITEMDATA*)item.lParam;

	*pResult = 0;
}

void CShellTreeCtrl::OnGetDispInfo(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TVITEM& item = ((LPNMTVDISPINFO)pNMHDR)->item;

	// use the provided buffer for text
	FillItem(item);

	*pResult = 0;
}

CShellPidl CShellTreeCtrl::GetItemIDList(HTREEITEM hItem)
{
	TVITEMDATA* pData = (TVITEMDATA*)GetItemData(hItem);
	if (pData != NULL)
	{
		ASSERT(pData->IsValid());
		return pData->pidlAbs;
	}
	return CShellPidl();	// invalid pidl
}

void CShellTreeCtrl::InsertSubItem(HTREEITEM hParent, LPSHELLFOLDER pParentFolder, LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidl, UINT nFlags)
{
	TVINSERTSTRUCT tvis;
	ZeroMemory(&tvis, sizeof(TVINSERTSTRUCT));
	tvis.hParent = hParent;
	tvis.hInsertAfter = TVI_LAST;

	// provide a buffer for the item text
	TCHAR szText[MAX_PATH];
	tvis.item.pszText = szText;
	tvis.item.cchTextMax = MAX_PATH;

	// used fields
	const UINT nTVIFlags = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE
		| TVIF_CHILDREN | TVIF_PARAM;

	// prepare item data
	TVITEMDATA* pData = new TVITEMDATA;
	pData->pidlAbs.Combine(pidlParent, pidl);
	pData->pParentFolder = pParentFolder;
	pData->nFlags = nFlags;

	// set item data
	ASSERT(pData->IsValid());
	tvis.item.lParam = (LPARAM)pData;

	// fill with pidl, text, icons and children - handle callbacks
	tvis.item.mask = nTVIFlags & ~m_nCallbackMask;
	FillItem(tvis.item);

	if (m_nCallbackMask & TVIF_IMAGE)
		tvis.item.iImage = I_IMAGECALLBACK;
	if (m_nCallbackMask & TVIF_SELECTEDIMAGE)
		tvis.item.iSelectedImage = I_IMAGECALLBACK;
	if (m_nCallbackMask & TVIF_TEXT)
		tvis.item.pszText = LPSTR_TEXTCALLBACK;
	if (m_nCallbackMask & TVIF_CHILDREN)
		tvis.item.cChildren = I_CHILDRENCALLBACK;
	tvis.item.mask |= nTVIFlags;

	// then insert new item
	InsertItem(&tvis);
}

void CShellTreeCtrl::AddRootItem(LPCITEMIDLIST pidlRoot, UINT nFlags)
{
	// not needed if pParentFolder is an argument
	CShellPidl pidlParent;
	pidlParent.CloneLastParent(pidlRoot);
	SShellFolderPtr pParentFolder(m_pDesktopFolder, pidlParent);
	
	InsertSubItem(TVI_ROOT, pParentFolder, NULL, pidlRoot, nFlags);
}

BOOL CShellTreeCtrl::EnumFolderItems(HTREEITEM hParent, LPCITEMIDLIST pidlParent, UINT nFlags)
{
	// get parent shell folder
	SShellFolderPtr pParentFolder(m_pDesktopFolder, pidlParent);

	// not a valid folder object
	if (!pParentFolder.IsValid())
		return FALSE;	//  failed!

	// enum child pidls
	SEnumIDListPtr pEnumIDList(pParentFolder, SHCONTF_FOLDERS
		| ((nFlags & STCF_INCLUDEFILES) ? SHCONTF_NONFOLDERS : 0)
		| ((nFlags & STCF_INCLUDEHIDDEN) ? SHCONTF_INCLUDEHIDDEN : 0), m_hWnd);

	if (pEnumIDList.IsValid())
	{
		SetPopulationCount(0);

		CShellPidl pidl;
		while (NOERROR == pEnumIDList->Next(1, pidl.GetPointer(), NULL))
		{
			// add child item, inherit some flags (inclusion)
			InsertSubItem(hParent, pParentFolder, pidlParent, pidl,
				nFlags & STCF_INCLUDEMASK);

			// notify progress
			IncreasePopulation();
		}
	}

	if (GetPopulationCount() > 0)
	{
		// sort items
		TVSORTCB tvscb;
		tvscb.hParent = hParent;
		tvscb.lpfnCompare = CompareFunc;
		// tvscb.lParam = 0;	// not meaningful yet
		SortChildrenCB(&tvscb);
	}

	// notify progress
	SetPopulationCount(1,1);

	// success!
	return TRUE;
}

BOOL CShellTreeCtrl::GetItemContextMenu(HTREEITEM hItem, CShellContextMenu& rCtxMenu)
{
	TVITEMDATA* pData = (TVITEMDATA*)GetItemData(hItem);
	if (!pData->IsValid())
		return FALSE;

	return rCtxMenu.Create(pData->pParentFolder,
		pData->pidlAbs.GetLastChild());
}

void CShellTreeCtrl::SetCallbackMask(UINT nMask)
{
	m_nCallbackMask = nMask &
		(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_CHILDREN);
}

UINT CShellTreeCtrl::GetCallbackMask()
{
	return m_nCallbackMask;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲自拍与偷拍| 97国产一区二区| 亚洲一区在线视频| 国产精品久久精品日日| 久久综合中文字幕| 欧美午夜电影网| 欧美亚洲综合另类| 一本久道久久综合中文字幕| 成人爽a毛片一区二区免费| 欧美人与禽zozo性伦| 一级中文字幕一区二区| 精品美女被调教视频大全网站| 91女厕偷拍女厕偷拍高清| 美女一区二区久久| 欧美一区二区三区免费大片| 国产一区二区三区观看| 亚洲免费观看视频| 国产日产亚洲精品系列| 欧美一区二区三区思思人| 91在线播放网址| 国产激情精品久久久第一区二区| 亚洲成人av资源| 悠悠色在线精品| 亚洲精品成a人| 综合av第一页| 欧美大白屁股肥臀xxxxxx| 在线这里只有精品| 91视频免费观看| 色婷婷综合五月| 91电影在线观看| 欧美丰满少妇xxxxx高潮对白| www国产成人免费观看视频 深夜成人网| 欧美成人vps| 成人性视频网站| 亚洲成人动漫av| 精品国精品国产| 老司机精品视频导航| 亚洲激情在线激情| 精品国精品自拍自在线| 91精品在线观看入口| 在线不卡a资源高清| 欧美岛国在线观看| 久久久精品国产免大香伊| 国产精品福利av| 一级精品视频在线观看宜春院| 午夜欧美2019年伦理| 免费久久99精品国产| 国产乱码精品一区二区三| 成人激情视频网站| 欧洲精品一区二区| 欧美经典一区二区三区| 亚洲午夜羞羞片| 福利电影一区二区| 欧美日韩高清影院| 亚洲免费三区一区二区| 蜜桃av一区二区三区电影| 一本大道久久a久久精二百| 欧美一区二区三区免费| 久久综合狠狠综合久久综合88| 综合电影一区二区三区 | 一区二区三区不卡在线观看| 麻豆一区二区99久久久久| 欧美日韩综合色| 一区二区三区国产| 成人国产精品免费观看动漫| 日韩欧美电影一二三| 日本欧美一区二区在线观看| 色欧美日韩亚洲| 亚洲精品中文字幕乱码三区| 成人免费视频一区| 久久久精品综合| 国产最新精品免费| 欧美成人精品1314www| 免费在线观看一区二区三区| 日韩丝袜情趣美女图片| 日韩成人一级大片| 欧美xxxx在线观看| 国产一区二区视频在线| 国产午夜亚洲精品午夜鲁丝片 | 久久人人97超碰com| 国产一区二区久久| 日韩毛片高清在线播放| 国产精品一区在线| 亚洲精品成a人| 8x福利精品第一导航| 国产一区二区精品久久91| 中文成人综合网| 欧美日韩精品一区视频| 韩国成人福利片在线播放| 亚洲国产成人一区二区三区| 99精品久久免费看蜜臀剧情介绍| 亚洲女人的天堂| 2024国产精品| 欧日韩精品视频| 岛国av在线一区| 亚洲福利视频一区| 国产精品久久久久久久午夜片 | 日韩精品一区二区三区在线播放| 国产麻豆精品久久一二三| 国产午夜精品一区二区三区视频 | 色综合天天狠狠| 色综合咪咪久久| 欧美亚洲综合在线| 精品国产电影一区二区| 日韩欧美一级在线播放| 国产亚洲精品aa| 亚洲男人的天堂av| 夜夜爽夜夜爽精品视频| 亚洲图片你懂的| 亚洲国产综合在线| 全国精品久久少妇| 国产成人免费视频| 成人黄色小视频在线观看| 成人精品国产免费网站| 成人免费观看男女羞羞视频| 国产精品一品二品| 波多野结衣一区二区三区| 成人黄色大片在线观看| av在线播放一区二区三区| 国产成人av自拍| 色综合网站在线| 欧美日本一区二区| 日韩免费视频一区| 一区二区三区免费| 国产九色精品成人porny | 韩国欧美一区二区| 在线视频你懂得一区| 精品国产91洋老外米糕| 综合网在线视频| 久久成人精品无人区| 丁香另类激情小说| 欧美日韩国产中文| 亚洲视频中文字幕| 国产乱理伦片在线观看夜一区| 欧美午夜一区二区| 久久综合国产精品| 青青草国产精品亚洲专区无| 成人中文字幕电影| 精品国产91久久久久久久妲己 | 欧美三级日本三级少妇99| 久久久久久电影| 国产精品一区二区免费不卡| 国产日韩av一区| 一本久道久久综合中文字幕| 亚洲人成电影网站色mp4| 69堂国产成人免费视频| 国产精品一二三区| 午夜精品成人在线视频| 久久久九九九九| 欧美日本精品一区二区三区| 亚洲精品久久久蜜桃| 色综合色狠狠天天综合色| 亚洲国产精品久久久男人的天堂| 欧美丝袜自拍制服另类| 亚洲动漫第一页| 国产色婷婷亚洲99精品小说| 成人小视频免费在线观看| 中文字幕在线一区二区三区| av成人免费在线观看| 亚洲小说春色综合另类电影| 欧美日韩电影一区| 成人手机在线视频| 亚洲国产欧美在线| 欧美一区二区三区日韩视频| 国内精品伊人久久久久av一坑 | 久久国产精品72免费观看| 中文字幕av在线一区二区三区| 91麻豆国产自产在线观看| 国产午夜精品久久久久久免费视| 91蜜桃婷婷狠狠久久综合9色| 国产精品一卡二卡| 美女一区二区视频| 蜜桃视频在线观看一区| 亚洲综合久久久久| 樱花影视一区二区| 亚洲精品一卡二卡| 一卡二卡欧美日韩| 亚洲精品成a人| 日韩美女视频一区二区在线观看| 精品一区二区三区在线观看| 欧美一区二区三区性视频| 亚洲福利国产精品| 色88888久久久久久影院野外| 国产精品家庭影院| 欧美做爰猛烈大尺度电影无法无天| 日本一区二区视频在线| 成人午夜激情在线| 亚洲日本免费电影| 在线精品观看国产| 一区二区三区国产精品| 色域天天综合网| 日韩国产精品大片| 精品欧美黑人一区二区三区| 高清久久久久久| 一区二区三区免费在线观看| 91精品国产福利在线观看| 久久精品国产77777蜜臀| 国产网红主播福利一区二区| 成人国产亚洲欧美成人综合网| 最新日韩av在线|