// 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的程序实例
共43个文件
ico:18个
h:8个
cpp:7个
4星 · 超过85%的资源 需积分: 42 24 下载量 47 浏览量
2012-11-16
16:17:50
上传
评论
收藏 270KB RAR 举报
温馨提示
实现了很多CTreeCtrl的功能.如移动.添加.删除节点等,功能很齐全,基本都有了
资源推荐
资源详情
资源评论
收起资源包目录
实现了很多CTreeCtrl的功能.如移动.添加.删除节点等.RAR (43个子文件)
StdAfx.h 1KB
TreeCtrl.clw 6KB
res
Wave Sound.ico 22KB
Printers2.ico 23KB
Recycle Bin empty.ico 24KB
Network Drive Connected.ico 24KB
ShoshFrame0.ico 8KB
Open Folder.ico 24KB
MS-DOS Application.ico 22KB
Movie Clip.ico 24KB
TreeCtrl.ico 1KB
21.ico 22KB
20.ico 22KB
29.ico 24KB
Removable Drive.ico 21KB
Network Drive Offline.ico 24KB
icon6.ico 1KB
TreeCtrl.rc2 400B
25.ico 24KB
ShoshFrame.ico 7KB
RAM Drive.ico 10KB
Thumbs.db 21KB
DelFatherDlg.cpp 1KB
TreeCtrlDlg.cpp 7KB
TreeCtrl.h 1KB
SetTreeStylesDlg.h 2KB
TreeCtrl.dsp 6KB
DelFatherDlg.h 1KB
ShoshTreeCtrl.cpp 15KB
IconChooseDlg.cpp 1KB
Resource.h 4KB
ShoshTreeCtrl.h 2KB
SetTreeStylesDlg.cpp 3KB
TreeCtrl.opt 57KB
TreeCtrl.dsw 539B
TreeCtrl.ncb 137KB
TreeCtrl.cpp 2KB
TreeCtrl.rc 17KB
TreeCtrlDlg.h 2KB
StdAfx.cpp 210B
TreeCtrl.aps 346KB
IconChooseDlg.h 1KB
TreeCtrl.plg 252B
共 43 条
- 1
dragonrxl
- 粉丝: 36
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页