⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uitreectrl.cpp

📁 vc座的资源管理器源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//*******************************************************************************
// COPYRIGHT NOTES
// ---------------
// You may use this source code, compile or redistribute it as part of your application 
// for free. You cannot redistribute it as a part of a software development 
// library without the agreement of the author. If the sources are 
// distributed along with the application, you should leave the original 
// copyright notes in the source code without any changes.
// This code can be used WITHOUT ANY WARRANTIES at your own risk.
// 
// For the latest updates to this code, check this site:
// http://www.masmex.com 
// after Sept 2000
// 
// Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
//*******************************************************************************

// URLTreeCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "UITreeCtrl.h"
#include "UIMessages.h"
#include "cbformats.h"
#include "UIres.h"

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

/////////////////////////////////////////////////////////////////////////////
// CUITreeCtrl
IMPLEMENT_DYNAMIC(CUITreeCtrl,CUIDragDropTree)
IMPLEMENT_DYNAMIC(CRefresh,CObject)
IMPLEMENT_DYNAMIC(CRefreshCategory,CRefresh)


CUITreeCtrl::CUITreeCtrl(bool bDragDrop) 
: CUIDragDropTree(bDragDrop)
{
	m_idxClosed= 0;
	m_idxOpen = 0; 
	m_vkeydown = 0;
	m_IDTimer = 0;
	m_style = TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_SHOWSELALWAYS;
	m_PopupID =	0;
	m_pPopupWnd = NULL;
	m_hOrigFont = NULL;
	m_bMe = false;
}

CUITreeCtrl::~CUITreeCtrl()
{
}

void CUITreeCtrl::OnDeleteItemData(DWORD dwData)
{

}

void CUITreeCtrl::ItemPrePaint(LPNMTVCUSTOMDRAW lptvcd,LRESULT *pResult)
{
	*pResult = CDRF_DODEFAULT;
	if (lptvcd->nmcd.dwDrawStage & CDDS_ITEM)
	{
		UINT state = GetItemState((HTREEITEM)lptvcd->nmcd.dwItemSpec,TVIS_SELECTED | TVIS_EXPANDED);
		if ((state & TVIS_SELECTED))
			return;
		if ((state & TVIS_SELECTED) && (state & TVIS_EXPANDED))
			return;
	}
	HTREEITEM hItem = (HTREEITEM)lptvcd->nmcd.dwItemSpec;
	CUIListCtrlData* pData = GetListCtrlData(hItem);
	if (pData == NULL)
		return;
	*pResult = CDRF_NOTIFYPOSTPAINT;
	if (pData->IsFontSet())
	{
		CDC *pDC = CDC::FromHandle(lptvcd->nmcd.hdc);
		CFont *pOldFont = pDC->SelectObject((CFont*)pData->GetFont());
		m_hOrigFont = (HFONT)pOldFont;
		*pResult |= CDRF_NEWFONT;
	}
	lptvcd->clrText = pData->GetTextColor();
	lptvcd->clrTextBk = pData->GetBkColor();
}

void CUITreeCtrl::ItemPostPaint(LPNMTVCUSTOMDRAW lptvcd,LRESULT *pResult)
{
	CDC *pDC = CDC::FromHandle(lptvcd->nmcd.hdc);
	if (m_hOrigFont)
	{
		pDC->SelectObject(CFont::FromHandle(m_hOrigFont));
		m_hOrigFont = NULL;
	}
	*pResult = CDRF_DODEFAULT;
}

bool CUITreeCtrl::EndLabelEdit(HTREEITEM hItem,LPCTSTR pszText)
{
	return false;
}

UINT CUITreeCtrl::GetMenuID()
{
	return m_PopupID;
}

CWnd *CUITreeCtrl::GetMenuWnd()
{
	return m_pPopupWnd;
}

void CUITreeCtrl::SetPopupID(UINT nID)
{
	m_PopupID = nID;
}

void CUITreeCtrl::SetPopupWnd(CWnd *pWnd)
{
	m_pPopupWnd = pWnd;
}

bool CUITreeCtrl::DragDrop(CDD_OleDropTargetInfo *pInfo)
{
	if (pInfo->GetDataObject() == NULL)
	{
		HTREEITEM hItem = pInfo->GetTreeItem();
		if (pInfo->GetDropEffect() == DROPEFFECT_MOVE)
		{
			if (TransferItem(GetDragItem(),hItem))
			{
				DeleteItem(GetDragItem());
			}
		}
		else
		{
			AfxMessageBox(_T("Copy not supported!"));
		}
		return true;
	}
	return false;
}

bool CUITreeCtrl::DragEnter(CDD_OleDropTargetInfo *pInfo)
{
	return false;
}

bool CUITreeCtrl::DragLeave(CDD_OleDropTargetInfo *pInfo)
{
	return false;
}

bool CUITreeCtrl::DragOver(CDD_OleDropTargetInfo *pInfo)
{
	// possible non ole drag & drop
	if (pInfo->GetDataObject() == NULL)
	{
		return true;
	}
	// ole drag and drop expects the dropeffect to be set
	// any valid formats?
	if (CWDClipboardData::Instance()->IsDataAvailable(pInfo->GetDataObject()))
	{
		FORMATETC FormatEtc;
		FormatEtc.cfFormat = CWDClipboardData::Instance()->GetClipboardFormat(CWDClipboardData::e_cfFileGroupDesc);
		FormatEtc.ptd = NULL;
		FormatEtc.dwAspect = DVASPECT_CONTENT;
		FormatEtc.lindex = -1;
		FormatEtc.tymed = TYMED_HGLOBAL;
		HRESULT hr = pInfo->GetDataObject()->m_lpDataObject->QueryGetData(&FormatEtc);
		if ((pInfo->GetKeyboardState() & MK_SHIFT))
			pInfo->SetDropEffect(DROPEFFECT_MOVE);
		else if (hr == S_OK)
		{
			pInfo->SetDropEffect(DROPEFFECT_COPY);
		}
		else
			pInfo->SetDropEffect(DROPEFFECT_COPY);
		return true;
	}
	return false;
}

DROPEFFECT CUITreeCtrl::DoDragDrop(NM_TREEVIEW* pNMTreeView,COleDataSource *pOleDataSource)
{
	// non ole drag and drop only within tree
	CCF_String ccfText(GetItemText(pNMTreeView->itemNew.hItem));
	CWDClipboardData::Instance()->SetData(pOleDataSource,&ccfText,CWDClipboardData::e_cfString);
	return DROPEFFECT_ALL;
}

CRefresh *CUITreeCtrl::CreateRefreshObject(HTREEITEM hItem,LPARAM lParam)
{
	return new CRefresh(hItem,lParam);
}

void CUITreeCtrl::UpdateEvent(LPARAM lHint,CObject *pHint)
{
	GetParent()->SendMessage(WM_APP_UPDATE_ALL_VIEWS,(WPARAM)lHint,(LPARAM)pHint);
}

void CUITreeCtrl::UpdateCurrentSelection()
{
	HTREEITEM hItem = GetSelectedItem();
	if (hItem)
	{
		SelectionChanged(hItem,GetItemData(hItem));
	}
}

void CUITreeCtrl::DoubleClick(HTREEITEM hItem)
{
}

void CUITreeCtrl::SelectionChanged(HTREEITEM hItem,LPARAM lParam)
{
	CRefresh *pRefresh = CreateRefreshObject(hItem,lParam);
	if (pRefresh)
		UpdateEvent(HINT_TREE_SEL_CHANGED,pRefresh);
	delete pRefresh;
}

HTREEITEM CUITreeCtrl::AddAnItem(HTREEITEM hParent, LPCTSTR szText, LPARAM lParam, HTREEITEM hInsAfter,int iImage,int iSelImage, int nChildren)
{
	ASSERT_VALID(this);

	TV_ITEM tvI;
	TV_INSERTSTRUCT tvIns;
	ZeroMemory(&tvI,sizeof(tvI));
	ZeroMemory(&tvIns,sizeof(tvIns));
	tvI.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
	if (nChildren) // get the plus sign
	{
		tvI.mask |= TVIF_CHILDREN;
		tvI.cChildren = nChildren;
	}
	tvI.pszText = (LPTSTR)szText;
	tvI.cchTextMax = lstrlen(szText);
	if (iImage == 0)
		iImage = m_idxClosed;
	tvI.iImage = iImage;
	if (iSelImage == 0)
		iSelImage = iImage;
	tvI.iSelectedImage = iSelImage;
	tvI.lParam = (LPARAM)GetNewListCtrlData(lParam,hParent);
	tvIns.item = tvI;
	tvIns.hInsertAfter = hInsAfter;
	tvIns.hParent = hParent;
	
	m_bMe = true;
	HTREEITEM hNewItem = InsertItem(&tvIns);
	m_bMe = false;
	return hNewItem;
}

CUIListCtrlData *CUITreeCtrl::GetNewListCtrlData(DWORD dwData,HTREEITEM hParent)
{
	CUIListCtrlData *pListCtrlData = new CUIListCtrlData;
	pListCtrlData->SetExtData(dwData); 
	return pListCtrlData;
}

DWORD CUITreeCtrl::GetItemData(HTREEITEM hItem) const
{
	if (hItem == NULL)
		return 0;
	const CUIListCtrlData* pData = GetListCtrlData(hItem);
	if (pData)
		return pData->GetExtData();
	return 0;
}

BOOL CUITreeCtrl::SetItemData(HTREEITEM hItem,DWORD dwData,bool bAutoDelete)
{
	ASSERT(hItem);
	if (hItem == NULL) 
		return FALSE;
	CUIListCtrlData* pData = GetListCtrlData(hItem);
	if (pData == NULL) 
		return FALSE;
	pData->SetExtData(dwData);
	pData->SetAutoDelete(bAutoDelete);
	return TRUE;
}

CUIListCtrlData *CUITreeCtrl::GetListCtrlData(HTREEITEM hItem) const
{
	((CUITreeCtrl*)this)->m_bMe = true;
	CUIListCtrlData *pData = (CUIListCtrlData*)CTreeCtrl::GetItemData(hItem);
	((CUITreeCtrl*)this)->m_bMe = false;
	if (pData == NULL)
		return NULL;
	ASSERT(pData->IsKindOf(RUNTIME_CLASS(CUIListCtrlData)));
	return pData;
}

void CUITreeCtrl::SetTextColor(HTREEITEM hItem,COLORREF TextColor)
{
	CUIListCtrlData *pData = GetListCtrlData(hItem);
	if (pData)
		pData->SetTextColor(TextColor);
};

void CUITreeCtrl::SetBkColor(HTREEITEM hItem,COLORREF BkColor)
{
	CUIListCtrlData *pData = GetListCtrlData(hItem);
	if (pData)
		pData->SetBkColor(BkColor);
}

void CUITreeCtrl::SetDefaultTextColor(HTREEITEM hItem)
{
	CUIListCtrlData *pData = GetListCtrlData(hItem);
	if (pData)
		pData->SetDefaultTextColor();
};

void CUITreeCtrl::SetDefaultBkColor(HTREEITEM hItem)
{
	CUIListCtrlData *pData = GetListCtrlData(hItem);
	if (pData)
		pData->SetDefaultBkColor();
}

void CUITreeCtrl::SetItemFont(HTREEITEM hItem,CFont *pFont)
{
	CUIListCtrlData* pData = GetListCtrlData(hItem);
	if (pData == NULL)
		return;
	ASSERT(pFont);
	if (pFont)
		pData->SetFont(pFont);
}

void CUITreeCtrl::SetItemBold(HTREEITEM hItem,bool bBold)
{
	CUIListCtrlData* pData = GetListCtrlData(hItem);
	if (pData == NULL)
		return;
	if (!pData->IsFontSet())
		pData->SetFont(GetFont());
	const CFont *pFont = pData->GetFont();
	LOGFONT lf;
	((CFont*)pFont)->GetLogFont(&lf);
	lf.lfWeight = bBold ? FW_BOLD : FW_NORMAL; 
	CFont font;
	font.CreateFontIndirect(&lf);
	pData->SetFont(&font);
	CRect rect;
	if (GetItemRect(hItem,&rect,FALSE))
	{
		InvalidateRect(rect);
		UpdateWindow();
	}
}

HTREEITEM CUITreeCtrl::GetHitItem(CPoint *pt)
{
	UINT Flag;
	HTREEITEM hItem;
	CPoint cpt;

	POINT pt1;
	GetCursorPos(&pt1);
	ScreenToClient(&pt1);	
	cpt.x = pt1.x;
	cpt.y = pt1.y;
	hItem = HitTest(cpt, &Flag);
	if (hItem && ((Flag & TVHT_ONITEMLABEL) || (Flag & TVHT_ONITEMICON)))
	{
		if (pt)
			*pt = pt1;
		return hItem;
	}
	return NULL;
}

void CUITreeCtrl::Refresh()
{
}

void CUITreeCtrl::DeleteKey(HTREEITEM hItem)
{
}

void CUITreeCtrl::GoBack(HTREEITEM hItem)
{
}

void CUITreeCtrl::ShowProperties(HTREEITEM hItem)
{
}

void CUITreeCtrl::ShowPopupMenu(HTREEITEM hItem,CPoint point)
{
	UINT MenuID = GetMenuID();
	if (MenuID == 0) 
		return;
	CWnd *pWndMess = GetMenuWnd();
	if (pWndMess == NULL)
		pWndMess = this;
	CMenu menu;
	VERIFY(menu.LoadMenu(MenuID));
	CMenu* pPopup = menu.GetSubMenu(0);
	ASSERT(pPopup != NULL);
	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndMess);
}

BEGIN_MESSAGE_MAP(CUITreeCtrl, CUIDragDropTree)
	//{{AFX_MSG_MAP(CUITreeCtrl)
	ON_NOTIFY_REFLECT_EX(NM_DBLCLK, OnDblclk)
	ON_NOTIFY_REFLECT_EX(NM_RETURN, OnReturn)
	ON_NOTIFY_REFLECT_EX(NM_RCLICK, OnRclick)
	ON_NOTIFY_REFLECT_EX(NM_CUSTOMDRAW, OnCustomDraw)
	ON_NOTIFY_REFLECT_EX(TVN_ITEMEXPANDED, OnItemExpanded)
	ON_NOTIFY_REFLECT_EX(TVN_ITEMEXPANDING, OnItemExpanding)
	ON_NOTIFY_REFLECT_EX(TVN_SELCHANGED, OnSelchanged)
	ON_NOTIFY_REFLECT_EX(TVN_ENDLABELEDIT, OnEndLabelEdit)
	ON_NOTIFY_REFLECT_EX(TVN_DELETEITEM, OnDeleteItem)
	ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydownFolder)
	ON_WM_MOUSEWHEEL()
	ON_WM_TIMER()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_APP_ON_PROPERTIES_KEY,OnAppPropertiesKey)
	ON_MESSAGE(WM_APP_ON_DELETE_KEY,OnAppDeleteKey)
	ON_MESSAGE(WM_APP_ON_CONTEXT_MENU_KEY,OnAppContextMenuKey)
	ON_MESSAGE(WM_APP_ON_BACKSPACE_KEY,OnAppBackspaceKey)
	ON_MESSAGE(WM_APP_ON_EDIT_KEY,OnAppEditKey)
	ON_MESSAGE(WM_APP_ON_REFRESH_KEY,OnAppRefreshKey)

	ON_MESSAGE(TVM_GETITEM,OnTVMGetItem)
	ON_MESSAGE(TVM_SETITEM,OnTVMSetItem)
	ON_MESSAGE(TVM_INSERTITEM,OnTVMInsertItem)
	ON_MESSAGE(WM_APP_TIMER_SEL_CHANGE,OnTimerSelChange)
	ON_MESSAGE(WM_APP_OLE_DD_DODRAGDROP, OnDDDoDragDrop)
	ON_MESSAGE(WM_APP_OLE_DD_DROP, OnDragDrop)
	ON_MESSAGE(WM_APP_OLE_DD_OVER, OnDragOver)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -