// 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
没有合适的资源?快使用搜索试试~ 我知道了~
ctreectrl基本操作
共39个文件
ico:18个
h:8个
cpp:7个
3星 · 超过75%的资源 需积分: 50 8 下载量 20 浏览量
2014-05-28
09:40:05
上传
评论
收藏 148KB RAR 举报
温馨提示
CTreeCtrl的功能.如移动.添加.删除节点 CTreeCtrl添加删除节点等,来源于网络,分享下。
资源推荐
资源详情
资源评论
收起资源包目录
CTreeCtrl的功能.如移动.添加.删除节点等.rar (39个子文件)
CTreeCtrl的功能.如移动.添加.删除节点等
ShoshTreeCtrl.cpp 15KB
TreeCtrl.h 1KB
Resource.h 4KB
TreeCtrl.cpp 2KB
IconChooseDlg.h 1KB
res
RAM Drive.ico 10KB
Open Folder.ico 24KB
TreeCtrl.ico 1KB
MS-DOS Application.ico 22KB
Network Drive Offline.ico 24KB
Network Drive Connected.ico 24KB
ShoshFrame.ico 7KB
TreeCtrl.rc2 400B
Removable Drive.ico 21KB
Wave Sound.ico 22KB
Printers2.ico 23KB
29.ico 24KB
Thumbs.db 21KB
21.ico 22KB
20.ico 22KB
Movie Clip.ico 24KB
Recycle Bin empty.ico 24KB
25.ico 24KB
ShoshFrame0.ico 8KB
icon6.ico 1KB
TreeCtrl.dsw 539B
DelFatherDlg.h 1KB
ShoshTreeCtrl.h 2KB
SetTreeStylesDlg.cpp 3KB
TreeCtrl.rc 17KB
TreeCtrl.suo 15KB
DelFatherDlg.cpp 1KB
TreeCtrl.dsp 6KB
IconChooseDlg.cpp 1KB
StdAfx.cpp 210B
TreeCtrlDlg.h 2KB
StdAfx.h 1KB
SetTreeStylesDlg.h 2KB
TreeCtrlDlg.cpp 7KB
共 39 条
- 1
资源评论
- defoliates2017-08-03还可以的,不过还有的功能没有实现!
SAINT850120
- 粉丝: 0
- 资源: 55
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功