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

📄 dlgtreectrl.cpp

📁 网吧管理系统VC源码
💻 CPP
字号:
// DlgTreeCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "Server.h"
#include "DlgTreeCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include "ServerView.h"

/////////////////////////////////////////////////////////////////////////////
// CDlgTreeCtrl

CDlgTreeCtrl::CDlgTreeCtrl()
{
	m_bUpdate = FALSE;
	m_contextMenu.LoadMenu(IDR_TREEDLG_MENU);
}

CDlgTreeCtrl::~CDlgTreeCtrl()
{
}


BEGIN_MESSAGE_MAP(CDlgTreeCtrl, CTreeCtrl)
	//{{AFX_MSG_MAP(CDlgTreeCtrl)
	ON_NOTIFY_REFLECT(TVN_BEGINLABELEDIT, OnBeginlabeledit)
	ON_WM_RBUTTONDOWN()
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
	ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndlabeledit)
	ON_COMMAND(IDM_TREE_DELETE, OnTreeDeleteItem)
	ON_COMMAND(IDM_TREE_NEW_REGION, OnTreeNewRegion)
	ON_COMMAND(IDM_TREE_RENAME, OnTreeRename)
	//}}AFX_MSG_MAP
	ON_COMMAND_RANGE(WM_USER, WM_USER+100, OnChangeRegion)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgTreeCtrl message handlers


void CDlgTreeCtrl::OnRButtonDown(UINT nFlags, CPoint point) 
{
	SetFocus();

	HTREEITEM hCurrSel = GetSelectedItem();
	HTREEITEM hNewSel = HitTest(point, &nFlags);

	if(hNewSel == NULL)
	{
		SelectItem(NULL);
	}
	else
	{
		if((hCurrSel != hNewSel) && (TVHT_ONITEM & nFlags))
		{
			SelectItem(hNewSel);
		}
		if(TVHT_ONITEM & nFlags)
		{
			CMenu* pSubMenu = m_contextMenu.GetSubMenu(0);
			CMenu* pPopMenu = pSubMenu->GetSubMenu(3);
			
			int nCount = pPopMenu->GetMenuItemCount();
			for(int i = 0; i < nCount; i++)
			{
				pPopMenu->DeleteMenu(0, MF_BYPOSITION);
			}
			HTREEITEM hChildItem = GetChildItem(GetRootItem());
			if(hNewSel != GetRootItem())
			{
				i = 0;
				if(!ItemHasChildren(hNewSel) && GetParentItem(hNewSel) != GetRootItem())
					hNewSel = GetParentItem(hNewSel);
				while(hChildItem)
				{
					if(hChildItem == hNewSel)
					{
						hChildItem = GetNextSiblingItem(hChildItem);
						continue;
					}
					pPopMenu->AppendMenu(MF_STRING, WM_USER+i, GetItemText(hChildItem));
					i++;
					hChildItem = GetNextSiblingItem(hChildItem);
				}
			}
			ClientToScreen(&point);
			pSubMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
			point.x, point.y, this);
		}
	}

	CTreeCtrl::OnRButtonDown(nFlags, point);
}

void CDlgTreeCtrl::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	static BOOL bSelectedRoot = TRUE;
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	HTREEITEM hRootItem = GetRootItem();
	CServerView * pServerView = (CServerView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
	*pResult = 1;

	CPoint point;
	CRect rect;
	GetClientRect(&rect);
	::GetCursorPos(&point);
	ScreenToClient(&point);
	if(rect.PtInRect(point))
		pServerView->m_bUpdate = FALSE;

	if(pServerView->m_bUpdate)
	{
		pServerView->m_bUpdate = FALSE;
		return;
	}

	m_bUpdate = TRUE;
	if(!ItemHasChildren(pNMTreeView->itemNew.hItem))
	{
		if(bSelectedRoot)
		{
			pServerView->SetSelectState(GetItemText(pNMTreeView->itemNew.hItem));
		}
		else
		{
			if(!ItemHasChildren(pNMTreeView->itemOld.hItem))
			{
				if(GetParentItem(pNMTreeView->itemOld.hItem) == GetParentItem(pNMTreeView->itemNew.hItem))
				{
					pServerView->SetSelectState(GetItemText(pNMTreeView->itemNew.hItem));
				}
				else
				{
					pServerView->AddViewItem(GetItemText( GetParentItem(pNMTreeView->itemNew.hItem) ) );
					pServerView->SetSelectState(GetItemText(pNMTreeView->itemNew.hItem));
				}
			}
			else
			{
				if(pNMTreeView->itemOld.hItem == GetParentItem(pNMTreeView->itemNew.hItem))
				{
					pServerView->SetSelectState(GetItemText(pNMTreeView->itemNew.hItem));
				}
				else
				{
					pServerView->AddViewItem(GetItemText(GetParentItem(pNMTreeView->itemNew.hItem)));
					pServerView->SetSelectState(GetItemText(pNMTreeView->itemNew.hItem));
				}
			}
		}
	}
	else
	{
		if(pNMTreeView->itemNew.hItem == hRootItem)
		{
			pServerView->AddViewItem(NULL);
			//pServerView->SetSelectState(NULL);
			bSelectedRoot = TRUE;
		}
		else
		{
			if(!ItemHasChildren(pNMTreeView->itemOld.hItem))
			{
				if(GetParentItem(pNMTreeView->itemOld.hItem) == pNMTreeView->itemNew.hItem)
				{
					if(bSelectedRoot)
						pServerView->AddViewItem(GetItemText(pNMTreeView->itemNew.hItem));	
					//pServerView->SetSelectState(NULL);
				}
				else
				{
					pServerView->AddViewItem(GetItemText(pNMTreeView->itemNew.hItem));
					//pServerView->SetSelectState(NULL);
				}
			}
			else
			{
				pServerView->AddViewItem(GetItemText(pNMTreeView->itemNew.hItem));
				//pServerView->SetSelectState(NULL);
			}
			bSelectedRoot = FALSE;
		}
	}
}

void CDlgTreeCtrl::OnChangeRegion(UINT nID)
{
	HTREEITEM hCurrSel = GetSelectedItem();
	HTREEITEM hChildItem = GetChildItem(GetRootItem());
	CServerView * pServerView = (CServerView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
	CListCtrl& clc = pServerView->GetListCtrl();

	if(!ItemHasChildren(hCurrSel) && GetParentItem(hCurrSel) == GetRootItem())
		return;
	if(ItemHasChildren(hCurrSel))
	{
		UINT i = WM_USER;
		while(hChildItem)
		{
			if(hChildItem == hCurrSel)
			{
				hChildItem = GetNextSiblingItem(hChildItem);
				continue;
			}
			if(i == nID)
				break;
			i++;
			hChildItem = GetNextSiblingItem(hChildItem);
		}

		CString strNewName(GetItemText(hChildItem));
		CString strOldName(GetItemText(hCurrSel));
		pServerView->m_pDaoRecord->MoveFirst();
		while(!pServerView->m_pDaoRecord->IsEOF())
		{
			if(pServerView->m_pDaoRecord->m_strRegion == strOldName)
			{
				pServerView->m_pDaoRecord->Edit();
				pServerView->m_pDaoRecord->m_strRegion = strNewName;
				pServerView->m_pDaoRecord->Update();
				InsertItem( pServerView->m_pDaoRecord->m_strName, 3, 4, hChildItem);
			}
			pServerView->m_pDaoRecord->MoveNext();
		}
		clc.DeleteAllItems();
		hChildItem = GetChildItem(hCurrSel);
		while(hChildItem)
		{
			hCurrSel = GetNextSiblingItem(hChildItem);
			DeleteItem(hChildItem);
			hChildItem = hCurrSel;
		}
	}
	else
	{
		UINT i = WM_USER;
		HTREEITEM hCurrSelParent = GetParentItem(hCurrSel);
		while(hChildItem)
		{
			if(hChildItem == hCurrSelParent)
			{
				hChildItem = GetNextSiblingItem(hChildItem);
				continue;
			}
			if(i == nID)
				break;
			i++;
			hChildItem = GetNextSiblingItem(hChildItem);
		}
		CString strNewName(GetItemText(hChildItem));
		CString strFilter("[计算机名]=\"");
		strFilter += GetItemText(hCurrSel);
		strFilter += '\"';

		if(!pServerView->m_strRegion.IsEmpty())
		{
			LVFINDINFO info;
			info.flags = LVFI_PARTIAL|LVFI_STRING;
			info.psz = GetItemText(hCurrSel);
			clc.DeleteItem(clc.FindItem(&info));
		}
		pServerView->m_pDaoRecord->FindFirst(strFilter);
		pServerView->m_pDaoRecord->Edit();
		pServerView->m_pDaoRecord->m_strRegion = strNewName;
		pServerView->m_pDaoRecord->Update();
		InsertItem( pServerView->m_pDaoRecord->m_strName, 3, 4, hChildItem);
		DeleteItem(hCurrSel);
	}
}

void CDlgTreeCtrl::OnTreeDeleteItem() 
{
	HTREEITEM hCurrSel = GetSelectedItem();
	if(ItemHasChildren(hCurrSel) || GetParentItem(hCurrSel) != GetRootItem())
	{
		CString str("<");
		str += GetItemText(hCurrSel);
		str += ">不能被删除!";
		AfxMessageBox(str);
		return;
	}
	DeleteItem(hCurrSel);
	return;
}

void CDlgTreeCtrl::OnTreeRename() 
{
	HTREEITEM hCurrSel = GetSelectedItem();
	if(GetParentItem(hCurrSel) != GetRootItem())
	{
		CString str("<");
		str += GetItemText(hCurrSel);
		str += ">不能被更名!";
		AfxMessageBox(str);
		return;
	}
	CEdit* pEdit = EditLabel(hCurrSel);
}

void CDlgTreeCtrl::OnTreeNewRegion() 
{
	HTREEITEM hCurrItem = InsertItem( "请输入名称", 2, 1, GetRootItem());
	EditLabel(hCurrItem);
}

void CDlgTreeCtrl::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
	HTREEITEM hChildItem = GetChildItem(GetRootItem());
	CString strNewName;
	GetEditControl()->GetWindowText(strNewName);	
	if(strNewName.IsEmpty())
	{
		AfxMessageBox("不能为空!");
		EditLabel(pTVDispInfo->item.hItem);
		*pResult = 0;
		return;
	}
	while(hChildItem)
	{
		if(hChildItem == pTVDispInfo->item.hItem)
		{
			hChildItem = GetNextSiblingItem(hChildItem);
			continue;
		}
		if(GetItemText(hChildItem) == strNewName)
		{
			AfxMessageBox("名称重复!");
			EditLabel(pTVDispInfo->item.hItem);
			*pResult = 0;
			return ;
		}
		hChildItem = GetNextSiblingItem(hChildItem);
	}
	*pResult = 1;
	CServerView * pServerView = (CServerView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
	pServerView->m_pDaoRecord->MoveFirst();

	while(!pServerView->m_pDaoRecord->IsEOF())
	{
		if(pServerView->m_pDaoRecord->m_strRegion == m_strOldName)
		{
			pServerView->m_pDaoRecord->Edit();
			pServerView->m_pDaoRecord->m_strRegion = strNewName;
			pServerView->m_pDaoRecord->Update();
		}
		pServerView->m_pDaoRecord->MoveNext();
	}
}

void CDlgTreeCtrl::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
	HTREEITEM hItem = GetRootItem();

	if(pTVDispInfo->item.hItem == hItem || GetParentItem(pTVDispInfo->item.hItem) != hItem)
	{
		*pResult = 1;
		return ;
	}
	
	m_strOldName = pTVDispInfo->item.pszText;
	CEdit * pEdit = GetEditControl();
	if(pEdit)
	{
		pEdit->LimitText(20);
		*pResult = 0;
		return;
	}
}

⌨️ 快捷键说明

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