📄 uitreectrl.cpp
字号:
//*******************************************************************************
// 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 + -