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

📄 ztreecontrol.cpp

📁 Symbian手机智能操作系统下的源码,图像查看软件,支持十几种图形格式.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "../StdAfx.h"

#include "zTreeControl.h"

zTreeControl::zTreeControl(void)
{
//#ifdef _PPC
	INITCOMMONCONTROLSEX icex;
	icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
	icex.dwICC = ICC_TREEVIEW_CLASSES;
	InitCommonControlsEx(&icex);
//#endif

	m_Version = 0.1f;
	m_Tag = 0x54524545;		//"TREE"

	m_pNode = NULL;
	m_pFile = NULL;
	m_Flag.TrunFlagsShowChildNumber(FALSE);
	m_Flag.TrunFlagsShowItemProperties(TRUE);
	m_Flag.TrunFlagsShowImageIcon(TRUE);

	m_pImageList = NULL;
	m_pImageSave = NULL;	
}

zTreeControl::~zTreeControl(void)
{
}

int zTreeControl::CreateEx(int ctlid,int x, int y, int nWidth, int nHeight, HWND hParent,HINSTANCE hInst)
{
	DWORD	dwExtStyle	= 0;
	TCHAR *	lpszClass	= WC_TREEVIEW;
	TCHAR *	lpszName	= _T("树控件");
	DWORD	dwStyle		= WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL |\
		TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | TVS_HASBUTTONS;

	m_hCtrl = ::CreateWindowEx(dwExtStyle,lpszClass,lpszName,dwStyle,
		x,y,nWidth,nHeight,hParent,(HMENU)ctlid,hInst,NULL);
	
	return zControl::CreateEx(ctlid,x,y,nWidth,nHeight,hParent,hInst);
}

int zTreeControl::OnNotify(LPNMHDR lParam)
{
	int ret = 0;
	NM_TREEVIEW* pLvdi = (NM_TREEVIEW*)lParam;
	POINT pt={0};
	TCHAR szMsg[300]={0};

	switch(pLvdi->hdr.code)
	{
	case 0xffffffef:
//		wsprintf(szMsg,_T("Notify:MouseMove?%x\n"),pLvdi->hdr.code);
		break;
	case 0xfffffff9:
//		wsprintf(szMsg,_T("Notify:Mouse??%x\n"),pLvdi->hdr.code);
		break;
	case 0xfffffffb:
//	wsprintf(szMsg,_T("Notify:MouseRbuttonDown?%x\n"),pLvdi->hdr.code);
		OnPopupMenu(pt);
	break;

	case TVN_SELCHANGED:
		SetCurrent(pLvdi);
		OnClick(GetCurrent());
		break;
	case NM_DBLCLK:
		OnDblclk(GetCurrent());
		break;
	case 0x3e8:				//菜单弹出消息
	case WM_RBUTTONDOWN:
	case WM_CONTEXTMENU:	//0x7b
		wsprintf(szMsg,_T("Notify:Tree:0x7B\n "));
		//		m_bMenu = 1;
		break;

	case NM_CUSTOMDRAW:		//
		OnCustomDraw((LPNMTVCUSTOMDRAW) lParam);
		break;
	case TVN_GETDISPINFO:
		OnDispInfo(lParam);
		break;
	default:
		break;
	}

	if (_tcslen(szMsg)>0)	::OutputDebugString(szMsg);

	return zControl::OnNotify(lParam);
}

void zTreeControl::OnCustomDraw(LPNMTVCUSTOMDRAW lParam)
{
	int a =0;
}


int	zTreeControl::Save(TCHAR * pszSaveName)
{
	if (m_pFile==NULL) return 0;

	int total = 0;
	BOOL ret = m_pFile->CreateFile(pszSaveName,_T("w"));
	if (ret)
	{
		//写标记
		m_pFile->WriteFile(&m_Tag,1,sizeof(m_Tag));
		//写存储版本
		m_pFile->WriteFile(&m_Version,1,sizeof(float));
		//获取有多少个根项
		int n = GotoRoot();
		if (n!=0) n=1;
		while(GotoNextSibling()) {n++;}
		m_pFile->WriteFile(&n,1,sizeof(int));

		//存储节点
		GotoRoot();
		zTreeNode * pNode = this->GetCurrent();
		if (pNode)
		{
			total = SaveItem(pNode->hNode);
		}
		m_pFile->CloseFile();
	}
	return total;
}


int zTreeControl::SaveItem(HTREEITEM hti)
{
	//操作,遍历选择项.
	int ret = 0;
	while(hti)
	{
		zTreeNode * pNode = (zTreeNode *)this->GetNodeParam(hti);
		SaveNode(pNode);
		ret ++;

		HTREEITEM hClient = TreeView_GetChild(m_hCtrl,hti);
		if (hClient)		//有子项
		{
			SaveItem(hClient);
		}

		hti = TreeView_GetNextSibling(m_hCtrl,hti);
	}
	return ret;
}

int zTreeControl::SaveNode(zTreeNode* pNode)
{
	//操作,保存节点
//	m_pFile->WriteFile(&pNode->nChild,1,sizeof(int));		//写子项数
//	m_pFile->WriteFile(&pNode->nState,1,sizeof(long));		//写节点状态
//	m_pFile->WriteFile(pNode->sName,1,sizeof(pNode->sName));//写节点名字

	//写属性 (写属性由属性自己写)
//	size_t na = pNode->m_Properties.GetSize();			//属性数
//	m_pFile->WriteFile(&na,1,sizeof(size_t));
//	for (unsigned int i=0;i<na;i++)			//各个属性
//	{
//		int nType = pNode->m_Properties.GetType(i);
//		TCHAR * pTitle = pNode->m_Properties.GetTitle(i);
//		TCHAR * pName  = pNode->m_Properties.GetName(i);
//		long lParam = pNode->m_Properties.GetParam(i);
//		zTreeProperties::ITEMPROPERTIES it;
//		m_pFile->WriteFile(&nType,1,sizeof(it.nType));
//		m_pFile->WriteFile(pTitle,1,sizeof(it.szTitle));
//		m_pFile->WriteFile(pName,1,sizeof(it.szName));
//		m_pFile->WriteFile(&lParam,1,sizeof(it.nParam));
//	}
	
	return 1;
}

int zTreeControl::Load(TCHAR * pszLoadName)
{
	if (m_pFile==NULL) return 0;

	int total = 0;
	this->Reset();
	BOOL ret =m_pFile->CreateFile(pszLoadName,_T("r"));
	if (ret)
	{
		//读取标记
		DWORD tag;
		m_pFile->ReadFile(&tag,1,sizeof(DWORD));
		if(tag!=m_Tag)
		{
			::MessageBox(m_hCtrl,_T("不是本类型文件!"),_T("错误"),MB_OK|MB_ICONQUESTION);
			m_pFile->CloseFile();
			return 0;
		}
		//读取版本
		float version;
		m_pFile->ReadFile(&version,1,sizeof(float));
		if(version!=m_Version)
		{
			::MessageBox(m_hCtrl,_T("存储文件版本和本程序版本不一致!"),_T("错误"),MB_OK|MB_ICONQUESTION);
			m_pFile->CloseFile();
			return 0;
		}
		//读取根项
		int nRoot = 0;
		m_pFile->ReadFile(&nRoot,1,sizeof(int));

		for (int i=0;i<nRoot;i++)
		{
			zTreeNode * pNode = new zTreeNode();
			LoadNode(pNode);
			AddRoot(pNode);

			LoadItem(pNode); 
		}
		this->GotoRoot();
		m_pFile->CloseFile();
	}
	return total;
}

int zTreeControl::LoadItem(zTreeNode * pNode)
{
	//操作,遍历选择项.
	int ret = 0;
	for (int i=0;i<pNode->nChild;i++)
	{
		m_pNode = pNode;
		zTreeNode * pRNode = new zTreeNode();
		LoadNode(pRNode);

		AddChild(pRNode); 
		if (pRNode->nChild>0)
		{
			LoadItem(pRNode);
		}
	}
	return ret;
}

int zTreeControl::LoadNode(zTreeNode * pNode)
{
	//读取节点
//	m_pFile->ReadFile(&pNode->nChild,1,sizeof(int));
//	m_pFile->ReadFile(&pNode->nState,1,sizeof(long));
//	m_pFile->ReadFile(pNode->sName,1,sizeof(pNode->sName));

	//读取属性项.(读属性由属性自己读)
	int np = 0;
//	m_pFile->ReadFile(&np,1,sizeof(size_t));
//	for (int i=0;i<np;i++)
//	{
//		zTreeNode::ITEMPROPERTIES it;
//		m_pFile->ReadFile(&it.nType,1,sizeof(it.nType));
//		m_pFile->ReadFile(it.szTitle,1,sizeof(it.szTitle));
//		m_pFile->ReadFile(it.szName,1,sizeof(it.szName));
//		m_pFile->ReadFile(&it.nParam,1,sizeof(it.nParam));
//
//		pNode->AddProperties(it.nType,it.szTitle,it.szName,it.nParam);
//	}
	return np;
}

int zTreeControl::Reset()
{
	if (!m_hCtrl)	return 0;
	return TreeView_DeleteAllItems(m_hCtrl);
}

int zTreeControl::Delete()
{
	if (!m_pNode) return 0;

	//当前项设置为其下一项,如果没有下一项设置为上一项,如果都没有设置空.
	HTREEITEM hti = TreeView_GetNextSibling(m_hCtrl,m_pNode->hNode);
	if (!hti) hti = TreeView_GetPrevSibling(m_hCtrl,m_pNode->hNode);

	//删除当前项
	DeleteParentNum(m_pNode);
	TreeView_DeleteItem(m_hCtrl,m_pNode->hNode);

	//设置新选择
	TVITEM ti;
	TCHAR str[200]={0};
	zTreeNode * pNode = NULL;
	if (hti)
	{
		ti.mask = TVIF_TEXT | TVIF_PARAM | TVIF_HANDLE;
		ti.hItem = hti;
		ti.pszText = str;
		ti.cchTextMax = 200;
		TreeView_GetItem(m_hCtrl,&ti);
		pNode = (zTreeNode*) ti.lParam;
	}
	return SetCurrent(pNode);
}

int zTreeControl::AddRoot(zTreeNode * pNode)
{
	TVINSERTSTRUCT tvi;
	memset(&tvi,0,sizeof(TVINSERTSTRUCT));
	tvi.hParent = TVI_ROOT;								//or HTREEITEM
	tvi.hInsertAfter = TVI_LAST;						//or TVI_FIRST / TVI_SORT
	tvi.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
	tvi.item.pszText = LPSTR_TEXTCALLBACK;				//
	tvi.item.lParam = (LPARAM)pNode;
	tvi.item.iImage = I_IMAGECALLBACK;					// item image: defer to OnGetDispInfo ()
	tvi.item.iSelectedImage = I_IMAGECALLBACK;			// item selimage: defer to OnGetDispInfo ()

	pNode->hNode = TreeView_InsertItem(m_hCtrl,&tvi);
	m_pNode = pNode;										//添加根项,当前项改变.

	return TreeView_SelectItem(m_hCtrl,m_pNode->hNode);
}

int zTreeControl::AddChild(zTreeNode * pNode ,HTREEITEM flag)
{
	TVINSERTSTRUCT tvi;
	memset(&tvi,0,sizeof(TVINSERTSTRUCT));
	if (!m_pNode|| !m_pNode->hNode)
	{
		tvi.hParent = TVI_ROOT;			//or HTREEITEM
	}else
	{
		tvi.hParent = m_pNode->hNode;			//or HTREEITEM
	}
	tvi.hInsertAfter = flag;	//or TVI_FIRST / TVI_SORT
	tvi.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
	tvi.item.iImage = I_IMAGECALLBACK;					// item image: defer to OnGetDispInfo ()
	tvi.item.iSelectedImage = I_IMAGECALLBACK;			// item selimage: defer to OnGetDispInfo ()
	tvi.item.pszText = LPSTR_TEXTCALLBACK;
	tvi.item.lParam = (LPARAM)pNode;

	pNode->hNode = TreeView_InsertItem(m_hCtrl,&tvi);

	return (UINT)pNode;
}

int zTreeControl::AddSibling(zTreeNode * pNode,HTREEITEM flag)
{
	TVINSERTSTRUCT tvi;
	memset(&tvi,0,sizeof(TVINSERTSTRUCT));
	if (!m_pNode || !m_pNode->hNode)
	{
		tvi.hParent = TVI_ROOT;						//or HTREEITEM
	}else
	{
		tvi.hParent = TreeView_GetParent(m_hCtrl,m_pNode->hNode);
	}
	tvi.hInsertAfter = flag;						//or TVI_FIRST / TVI_SORT
	tvi.item.mask = TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
	tvi.item.iImage = I_IMAGECALLBACK;					// item image: defer to OnGetDispInfo ()
	tvi.item.iSelectedImage = I_IMAGECALLBACK;			// item selimage: defer to OnGetDispInfo ()
	tvi.item.pszText = LPSTR_TEXTCALLBACK;
	tvi.item.lParam = (LPARAM)pNode;

	pNode->hNode = TreeView_InsertItem(m_hCtrl,&tvi);
	m_pNode = pNode;								//添加兄弟项,当前项改.
	
	return TreeView_SelectItem(m_hCtrl,m_pNode->hNode);
}

int zTreeControl::AddParentNum(zTreeNode * pNode)
{
	if ((pNode==NULL)||(pNode->hNode==NULL))
		return 0;

	HTREEITEM hti = NULL;
	hti = TreeView_GetParent(m_hCtrl,pNode->hNode);
	TVITEM ti;
	memset(&ti,0,sizeof(TVITEM));
	zTreeNode * pPNode = NULL;
	if (hti)
	{
		ti.mask = TVIF_PARAM | TVIF_HANDLE;
		ti.hItem = hti;
		TreeView_GetItem(m_hCtrl,&ti);
		pPNode = (zTreeNode*) ti.lParam;
		pPNode->nChild++;
	}
	
	return FlushText(pPNode);
}

int zTreeControl::DeleteParentNum(zTreeNode * pNode)
{
	if ((pNode==NULL)||(pNode->hNode==NULL))
		return 0;

	HTREEITEM hti = NULL;
	hti = TreeView_GetParent(m_hCtrl,pNode->hNode);
	TVITEM ti;
	memset(&ti,0,sizeof(TVITEM));
	zTreeNode * pPNode = NULL;
	if (hti)
	{
		ti.mask = TVIF_PARAM | TVIF_HANDLE;
		ti.hItem = hti;
		TreeView_GetItem(m_hCtrl,&ti);
		pPNode = (zTreeNode*) ti.lParam;
		pPNode->nChild--;
	}
	
	return FlushText(pPNode);
}


int	zTreeControl::FlushText(zTreeNode * pNode)
{
	if (pNode==NULL || pNode->hNode==NULL)	return 0;

	TVITEM ti;
	memset(&ti,0,sizeof(TVITEM));
	ti.mask = TVIF_HANDLE | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
	ti.iImage = I_IMAGECALLBACK;					// item image: defer to OnGetDispInfo ()
	ti.iSelectedImage = I_IMAGECALLBACK;			// item selimage: defer to OnGetDispInfo ()
	ti.pszText = LPSTR_TEXTCALLBACK;
	ti.hItem = pNode->hNode;
	
	return TreeView_SetItem(m_hCtrl,&ti);
}

int zTreeControl::SetCurrent(NM_TREEVIEW* pLvdi)
{
	HTREEITEM hti;
	hti = TreeView_GetSelection(m_hCtrl);

	TVITEM ti;
	TCHAR str[200]={0};
	zTreeNode * pNode = NULL;
	if (hti)
	{
		ti.mask = TVIF_TEXT | TVIF_PARAM | TVIF_HANDLE;
		ti.hItem = hti;
		ti.pszText = str;
		ti.cchTextMax = 200;
		TreeView_GetItem(m_hCtrl,&ti);
		pNode = (zTreeNode*) ti.lParam;
	}

	return SetCurrent(pNode);
}

int	zTreeControl::SetCurrent(zTreeNode * pNode)
{
	if (pNode)
	{
		m_pNode = pNode;
		return TreeView_SelectItem(m_hCtrl,m_pNode->hNode);
	}
	return 0;
}

⌨️ 快捷键说明

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