// ShoshTreeCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "TreeCtrl.h"
#include "ShoshTreeCtrl.h"
#include "IconChooseDlg.h"
#include "DelFatherDlg.h"
#include "TreeCtrlDlg.h"
#include "SetTreeStylesDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define SHOSH_SETCHECK
/////////////////////////////////////////////////////////////////////////////
// CShoshTreeCtrl
CShoshTreeCtrl::CShoshTreeCtrl()
{
CreateShoshIL(RGB(198,247,181)); //树控件的初始颜色也在此设置
for(int i=0;i<4;i++)
bStyles[i]=true;
bStyles[4]=false;
}
CShoshTreeCtrl::~CShoshTreeCtrl()
{
}
VOID CShoshTreeCtrl::CreateShoshIL(COLORREF clrColor)
{
m_ImageList.Create(16, 16, ILC_COLOR32 ,10,CLR_NONE);
m_ImageList.SetBkColor(clrColor); //设置背景色
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON4));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON5));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON6));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON7));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON8));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON9));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON10));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON11));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON12));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON13));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON14));
}
BEGIN_MESSAGE_MAP(CShoshTreeCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CShoshTreeCtrl)
ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndlabeledit)
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
ON_COMMAND(IDM_ITEM_DELETE, OnItemDelete)
ON_COMMAND(IDM_ITEM_EDIT, OnItemEdit)
ON_COMMAND(IDM_ITEM_INSERT_AFTER, OnItemInsertAfter)
ON_COMMAND(IDM_ITEM_INSERT_BEFORE, OnItemInsertBefore)
ON_COMMAND(IDM_ITEM_INSERT_CHILD, OnItemInsertChild)
ON_COMMAND(IDM_ITEM_INSERT_ROOT, OnItemInsertRoot)
ON_COMMAND(IDM_ITEM_MOVEDOWN, OnItemMovedown)
ON_COMMAND(IDM_ITEM_MOVEUP, OnItemMoveup)
ON_COMMAND(IDM_ITEM_MOVEFIRST, OnItemMovefirst)
ON_COMMAND(IDM_ITEM_MOVELAST, OnItemMovelast)
ON_COMMAND(IDM_SET_ITEM_ICONS, OnSetItemIcons)
ON_COMMAND(IDM_INSERT_FATHER, OnInsertFather)
ON_COMMAND(IDM_GINSERT_ROOT, OnGinsertRoot)
ON_COMMAND(IDM_ABOUT, OnAbout)
ON_COMMAND(IDM_GCLEAR_ALL, OnGclearAll)
ON_COMMAND(IDM_GSET_FONTCOLOR, OnGsetFontcolor)
ON_COMMAND(IDM_GSET_BKCOLOR, OnGsetBkcolor)
ON_COMMAND(IDM_SET_STYLES, OnSetStyles)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CShoshTreeCtrl message handlers
void CShoshTreeCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
/* CString str,temstr;
GetEditControl()->GetWindowText(str);
str.Replace(_T(" ")," "); //把中文空格换成两个英文空格
temstr=str;
str.TrimLeft();
str.TrimRight();
if(strlen(str)<1 || temstr!=str) //第二个条件保证不以空格开头或结尾
*pResult=false; //set it false not to save the changes
else
*pResult = true; //set it true to save the changes
*///注释部分的方法只检测不修改
//检测并自动去掉首尾空格
CString str(pTVDispInfo->item.pszText);
str.Replace(_T(" ")," ");
str.TrimLeft();
str.TrimRight();
if(strlen(str)<1)
*pResult=false;
else
{
sprintf(pTVDispInfo->item.pszText,"%s",str.GetBuffer(str.GetLength()));
*pResult=true;
}
}
void CShoshTreeCtrl::OnRclick(NMHDR* pNMHDR, LRESULT* pResult)
{
CPoint point;
UINT pflag;
GetCursorPos(&point);
ScreenToClient(&point);
HTREEITEM hItem=HitTest(point,&pflag);
CMenu mainMenu;
mainMenu.LoadMenu(IDM_POPMENU);
if(hItem==NULL)
{
CMenu* pPopMenu=mainMenu.GetSubMenu(1);
ClientToScreen(&point);
pPopMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON , point.x,point.y,FromHandle(this->m_hWnd),NULL);
}
else
{
CMenu* pPopMenu=mainMenu.GetSubMenu(0);
SelectItem(hItem);
ClientToScreen(&point);
pPopMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON , point.x,point.y,FromHandle(this->m_hWnd),NULL);
}
*pResult = 0;
}
void CShoshTreeCtrl::OnItemDelete()
{
HTREEITEM selItem=GetSelectedItem();
if(ItemHasChildren(selItem))
{
GetParentItem(GetParentItem(selItem));
CDelFatherDlg delDlg;
if(IDOK==delDlg.DoModal())
{
switch(delDlg.m_iDelFatherMethod)
{
case 0:
DeleteItem(selItem);
break;
case 1: //使子节点成为父节点的兄弟节点;
DelMoveChildrenBeBrother(selItem,GetParentItem(GetParentItem(selItem)));
DeleteItem(selItem); //取消时没有动作
break;
case 2: //使子节点成为父节点的子节点;
DelMoveChildrenBeSon(selItem,GetParentItem(selItem));
DeleteItem(selItem); //取消时没有动作
break;
case 3:
HTREEITEM delItem=GetChildItem(selItem);
while(NULL!=delItem)
{
selItem=GetNextSiblingItem(delItem);
DeleteItem(delItem);
delItem=selItem;
}
break;
}
}
}
else
DeleteItem(selItem);
}
void CShoshTreeCtrl::OnItemEdit()
{
EditLabel(GetSelectedItem());
}
int CShoshTreeCtrl::GetLevel(const HTREEITEM htim) //得到第几级节点
{
HTREEITEM tempHitm=htim;
int level=1;
while(tempHitm=GetParentItem(tempHitm),tempHitm!=NULL)
level++;
level%=7;
return level;
}
void CShoshTreeCtrl::OnItemInsertAfter()
{
HTREEITEM hitm=GetSelectedItem();
if(NULL==hitm)
return;
int level=GetLevel(hitm);
EditLabel(InsertItem("请输入名字",2*level-2,2*level-1,GetParentItem(hitm),hitm));
}
void CShoshTreeCtrl::OnItemInsertBefore()
{
HTREEITEM hitm=GetSelectedItem();
if(NULL==hitm)
return;
int level=GetLevel(hitm);
EditLabel(InsertItem("请输入名字",2*level-2,2*level-1,GetParentItem(hitm),GetPrevSiblingItem(hitm)==NULL?TVI_FIRST:GetPrevSiblingItem(hitm)));
}
void CShoshTreeCtrl::OnItemInsertChild()
{
HTREEITEM hitm=GetSelectedItem();
if(NULL==hitm)
return;
int level=GetLevel(hitm);
level++;
HTREEITEM tempHitm=InsertItem("请输入名字",2*level-2,2*level-1,hitm,TVI_LAST);
Expand(hitm,TVE_EXPAND);
EditLabel(tempHitm);
}
void CShoshTreeCtrl::OnItemInsertRoot()
{
EditLabel(InsertItem("请输入名字",0,1,TVI_ROOT,TVI_FIRST));
}
void CShoshTreeCtrl::OnItemMovedown()
{
HTREEITEM item1,item2,toFather;
item1=GetSelectedItem();
item2=GetNextSiblingItem(item1);
BOOL bDirectDown=TRUE;
if(MoveItemUD(item1,item2,bDirectDown,toFather))
SelectItem(bDirectDown?toFather:item2);
}
void CShoshTreeCtrl::OnItemMoveup()
{
HTREEITEM item1,item2,toFather;
item1=GetSelectedItem();
item2=GetPrevSiblingItem(item1);
BOOL bDirectDown=FALSE;
if(MoveItemUD(item1,item2,bDirectDown,toFather))
SelectItem(bDirectDown?item1:toFather);
}
VOID CShoshTreeCtrl::MoveChildren(HTREEITEM hFather,HTREEITEM hInsertTo)
{
if(NULL==hFather)
return;
HTREEITEM curHitm,hFatherCall;
curHitm=GetChildItem(hFather);
while(NULL!=curHitm)
{
int image,selectedImage;
GetItemImage(curHitm,image,selectedImage);
hFatherCall=InsertItem(GetItemText(curHitm),image,selectedImage,hInsertTo,TVI_LAST);
#ifdef SHOSH_SETCHECK
SetCheck(hFatherCall,GetCheck(curHitm));
#endif
if(ItemHasChildren(curHitm))
MoveChildren(curHitm,hFatherCall);
Expand(hFatherCall,IsExpanded(curHitm));
curHitm=GetNextSiblingItem(curHitm);
}
}
BOOL CShoshTreeCtrl::MoveItemUD(HTREEITEM& item1,HTREEITEM& item2,BOOL& bDirectDown,HTREEITEM& toFather)
{
//item1 meams from_treeitem,item2 means to_treeitem,toFather is used to accept new item that just inserted.
if(NULL==item2 || NULL==item1)
return FALSE;
if(!ItemHasChildren(item2) && ItemHasChildren(item1)) //要移动的项有子节点而比较项没有子节点,改变移动方向,提高效率,但是同时使本函数变得有点复杂
{
HTREEITEM
评论30
最新资源