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

📄 treeview.cpp

📁 visual c++ 实例编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Adds an item's data to a combobox (m_pCombo)
BOOL CJTITreeView::ShowItem()
{
	CString strData(' ',(m_nLevel-1)*2);
	CString strPad(' ',150);
	CString strID;

	// Indent the item based on its level
	strID.Format("\t%d",m_tvItem.lParam);

	if(m_nLevel > 0)
		strData += m_tvItem.pszText+strPad+strID;
	else strData = "** Active Group **"+strPad+strID;

	m_pCombo->AddString(strData);

	if(m_tvItem.lParam == m_nDefGroup)
		m_pCombo->SelectString(-1,strData);

	return(0);
}

// Deletes the specified item
BOOL CJTITreeView::ClearItem()
{
	GROUPS& arrGroups = GetDocument()->GetGroups();
	int nItem = m_tvItem.lParam;

	// Zap the group's items
	arrGroups[nItem].arrItems.SetSize(0);

	// Reset the default clipboard monitoring group to zero if this
	// group was currently the default group
	if(GetDocument()->GetDefGroup() == nItem)
		GetDocument()->SetDefGroup(0);

	return(0);
}

// Builds a textual representation of the tree in the specified combobox
void CJTITreeView::DisplayTree(CComboBox *pCombo)
{
	m_nLevel = 0;
	m_pCombo = pCombo;
	m_nDefGroup = GetDocument()->GetDefGroup();

	RecurseItem(m_pTree->GetRootItem(),ShowItem);
}

// Deletes the specified tree node along with each of its child nodes
void CJTITreeView::ClearTree(HTREEITEM htreeItem)
{
	m_nLevel = 0;

	RecurseItem(htreeItem,ClearItem);
}

// Saves the tree to the specified archive
void CJTITreeView::SaveTree(CArchive& ar, int *pMap, HTREEITEM htreeStart)
{
	m_pArchive = &ar;
	m_nLevel = 0;
	m_nIndex = 0;
	m_pMap = pMap;

	BYTE byCount = m_pTree->GetCount();
	ar.Write(&byCount,sizeof(byCount));

	if(!htreeStart)
		htreeStart = m_pTree->GetRootItem();

	RecurseItem(htreeStart,ArchiveItem);
}

// Loads the tree from the specified archive
int CJTITreeView::LoadTree(CArchive& ar, BOOL bReset)
{
	GROUPS& arrGroups = GetDocument()->GetGroups();

	char szTitle[500];
	BYTE byLen, byImage;
	int nNewLevel, nCurrLevel = 0;
	HTREEITEM htreeParent = NULL;
	TV_INSERTSTRUCT tvstruct;
	BYTE byCount;

	// Clear the tree
	if(bReset)
		m_pTree->DeleteAllItems();

	// Get and set the group count
	ar.Read(&byCount,sizeof(byCount));

	if(bReset)
	{
		arrGroups.SetSize(0);
		m_nGroupCount = 0;
	}

	// Iterate through the items
	for(BYTE i = 0; i < byCount; i++)
	{
		CGroup Group;

		// Create place-holder for the group
		arrGroups.Add(Group);

		// Read an item
		ar.Read(&nNewLevel,sizeof(nNewLevel));
		ar.Read(&byImage,sizeof(byImage));
		ar.Read(&byLen,sizeof(byLen));
		ar.Read(szTitle,byLen);
		szTitle[byLen] = '\0';

		// Is this item at a parent level of last item we inserted?
		if(nNewLevel < nCurrLevel)
		{
			int nTemp = nCurrLevel;

			// Yes...figure out how many levels back it should be
			while(nTemp >= nNewLevel)
			{
				htreeParent = m_pTree->GetParentItem(htreeParent);
				nTemp--;
			}
		}
		else
		{	
			// No...this item is a sibling so let's assign the same
			// parent as the last item we inserted
			if(nNewLevel == nCurrLevel)
				htreeParent = m_pTree->GetParentItem(htreeParent);
		}

		// Save the new level
		nCurrLevel = nNewLevel;

		// Insert the new item and save its item handle
		tvstruct.hParent = htreeParent;
		tvstruct.hInsertAfter = TVI_LAST;
		tvstruct.item.iImage = byImage;
		tvstruct.item.iSelectedImage = byImage;
		tvstruct.item.pszText = szTitle;
		tvstruct.item.lParam = i;
		tvstruct.item.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT|TVIF_PARAM;
		htreeParent = m_pTree->InsertItem(&tvstruct);
	}

	// Expand the root item
	m_pTree->Expand(m_pTree->GetRootItem(),TVE_EXPAND);

	// Save the global group count
	m_nGroupCount += byCount;

	return(byCount);
}

// Terminate drag/drop with ESCAPE key
void CJTITreeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if(nChar == VK_ESCAPE && m_bDragging)
	{
		m_pImageList->DragLeave(this);
		m_pImageList->EndDrag();

		ReleaseCapture();
		KillTimer(1);
		
		m_bDragging = FALSE;
		m_pTree->SelectDropTarget(NULL);
	}
	else CTreeView::OnKeyDown(nChar, nRepCnt, nFlags);
}

// Adds a group to the tree
void CJTITreeView::OnAddItem() 
{
	CJTIGrpPropDlg dlgProp;

	dlgProp.SetTitle("Add Group");

	// Display the add dialog
	if(dlgProp.DoModal() == IDOK)
	{
		HTREEITEM htreeParent = m_pTree->GetSelectedItem();
		HTREEITEM htreeItem = m_pTree->InsertItem(dlgProp.GetDescription(),
										1,1,htreeParent,TVI_FIRST);
		m_pTree->SetItemData(htreeItem,m_nGroupCount++);

		GROUPS& arrGroups = GetDocument()->GetGroups();
		CGroup group;
		arrGroups.Add(group);

		GetDocument()->SetModifiedFlag(TRUE);
		GetDocument()->SaveModified();

		m_pTree->Expand(m_pTree->GetRootItem(),TVE_EXPAND);
		m_pTree->Expand(htreeParent,TVE_EXPAND);
	}
}

// Deletes the selected item from the tree
void CJTITreeView::OnDeleteItem() 
{
	if(AfxMessageBox(IDS_DELETE_GROUP,MB_ICONQUESTION|MB_YESNOCANCEL) == IDYES)
	{
		HTREEITEM htreeItem = m_pTree->GetSelectedItem();

		// Remove all items for the associated group and sub-groups
		ClearTree(htreeItem);

		// Reset the default clipboard monitoring group to zero if this
		// group was currently the default group
		int nItem = m_pTree->GetItemData(htreeItem);

		if(GetDocument()->GetDefGroup() == nItem)
			GetDocument()->SetDefGroup(0);

		// Remove the group from the tree too
		m_pTree->DeleteItem(htreeItem);

		GetDocument()->SetModifiedFlag(TRUE);
		GetDocument()->SaveModified();
	}
}

// Handles enabling the delete menu item
void CJTITreeView::OnUpdateDeleteItem(CCmdUI* pCmdUI) 
{
	// Must have an item selected and it can't be the root item
	pCmdUI->Enable((m_pTree->GetSelectedItem() != m_pTree->GetRootItem()) 
					&& m_pTree->GetSelectedItem());
}

// Displays the group context menu
void CJTITreeView::ShowMenu(CPoint point) 
{
	CMenu menu;

	menu.LoadMenu(IDR_TREEMENU);
	CMenu *pPopup = menu.GetSubMenu(0);

	SetFocus();
	pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,
							point.x,point.y,GetParentFrame(),NULL);
}

// Handles the right-click button
void CJTITreeView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	CPoint pt, ptTemp;

	GetCursorPos(&pt);
	unsigned int nFlags;

	ptTemp = pt;
	ScreenToClient(&ptTemp);

	HTREEITEM htreeItem = m_pTree->HitTest(ptTemp,&nFlags);
	if(htreeItem)
		m_pTree->SelectItem(htreeItem);

	ShowMenu(pt);
	
	*pResult = 0;
}

// Displays the group properties dialogbox
void CJTITreeView::OnItemProperties() 
{
	CJTIGrpPropDlg dlgProp;
	HTREEITEM htreeItem = m_pTree->GetSelectedItem();

	m_pTree->GetItemText(htreeItem);

	dlgProp.SetDescription(m_pTree->GetItemText(htreeItem));
	if(dlgProp.DoModal() == IDOK)
	{
		m_pTree->SetItemText(htreeItem,dlgProp.GetDescription());
		GetDocument()->SetModifiedFlag(TRUE);
		GetDocument()->SaveModified();
	}
}

// Handles enabling the group properties menu item
void CJTITreeView::OnUpdateItemProperties(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable((m_pTree->GetSelectedItem() != m_pTree->GetRootItem()));
}

// Called when the selection changes in the group tree
void CJTITreeView::OnSelChanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

	int nGroup = pNMTreeView->itemNew.lParam;

	// Notify the link list that it needs to update itself
	CMainFrame *pFrame = (CMainFrame *) GetParentFrame();
	pFrame->GetList()->PostMessage(UM_GROUP_CHANGED,nGroup);

	*pResult = 0;
}

// Disables Copy menu item
void CJTITreeView::OnUpdateEditCopy(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(FALSE);
}

// Disables Cut menu item
void CJTITreeView::OnUpdateEditCut(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(FALSE);
}

// Disables Paste menu item
void CJTITreeView::OnUpdateEditPaste(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(FALSE);
}

void CJTITreeView::OnEditCopy() 
{
}

// Called to handle keyboard shortcuts
BOOL CJTITreeView::PreTranslateMessage(MSG* pMsg) 
{
	if(pMsg->message == WM_KEYUP)
	{
		if(m_pTree->GetSelectedItem())
		{
			switch(pMsg->wParam)
			{
				// Insert key adds group
				case VK_INSERT:
					OnAddItem();
					return(TRUE);

				// Delete key deletes group
				case VK_DELETE:
					if(m_pTree->GetSelectedItem() != m_pTree->GetRootItem())
						OnDeleteItem();
					return(TRUE);
			}
		}
	}
	
	return CTreeView::PreTranslateMessage(pMsg);
}

// Handles Paste Default context menu item
void CJTITreeView::OnPasteDefault() 
{
	HTREEITEM htreeItem = m_pTree->GetSelectedItem();
	int nGroup = m_pTree->GetItemData(htreeItem);

	// Make selected group the default paste group
	if(nGroup == nGroup == GetDocument()->GetDefGroup())
		nGroup = 0;

	GetDocument()->SetDefGroup(nGroup);
	GetDocument()->SetModifiedFlag(TRUE);
	GetDocument()->SaveModified();
}

// Handles enabling Default Paste Group menu item
void CJTITreeView::OnUpdatePasteDefault(CCmdUI* pCmdUI) 
{
	HTREEITEM htreeItem = m_pTree->GetSelectedItem();
	int nGroup = m_pTree->GetItemData(htreeItem);

	pCmdUI->Enable(nGroup > 0);

	if(nGroup > 0)
		pCmdUI->SetCheck(nGroup == GetDocument()->GetDefGroup());
}

// Handles the Move Down menu item
void CJTITreeView::OnMoveDown() 
{
	HTREEITEM htreeItem = m_pTree->GetSelectedItem();

	// Move the item down one position in the group
	HTREEITEM htreeNewItem = MoveNode(htreeItem,m_pTree->GetParentItem(htreeItem),
							m_pTree->GetNextSiblingItem(htreeItem));

	m_pTree->DeleteItem(htreeItem);
	m_pTree->SelectItem(htreeNewItem);

	GetDocument()->SetModifiedFlag(TRUE);
	GetDocument()->SaveModified();
}

// Handles enabling the Move Down menu item
void CJTITreeView::OnUpdateMoveDown(CCmdUI* pCmdUI) 
{
	BOOL bEnable = FALSE;

	HTREEITEM htreeItem = m_pTree->GetSelectedItem();

	if(htreeItem && htreeItem != m_pTree->GetRootItem() && m_pTree->GetNextSiblingItem(htreeItem))
		bEnable = TRUE;

	pCmdUI->Enable(bEnable);
}

// Handles the Move Up menu item
void CJTITreeView::OnMoveUp() 
{
	HTREEITEM htreeItem = m_pTree->GetSelectedItem();
	HTREEITEM htreeSibling = m_pTree->GetPrevSiblingItem(htreeItem);

	htreeSibling = m_pTree->GetPrevSiblingItem(htreeSibling);
	if(!htreeSibling)
		htreeSibling = TVI_FIRST;

	// Move the item up one postion in the group
	HTREEITEM htreeNewItem = MoveNode(htreeItem,m_pTree->GetParentItem(htreeItem),htreeSibling);

	m_pTree->DeleteItem(htreeItem);
	m_pTree->SelectItem(htreeNewItem);

	GetDocument()->SetModifiedFlag(TRUE);
	GetDocument()->SaveModified();
}

// Handles enabling the Move Up menu item
void CJTITreeView::OnUpdateMoveUp(CCmdUI* pCmdUI) 
{
	BOOL bEnable = FALSE;

	HTREEITEM htreeItem = m_pTree->GetSelectedItem();

	if(htreeItem && htreeItem != m_pTree->GetRootItem() && m_pTree->GetPrevSiblingItem(htreeItem))
		bEnable = TRUE;

	pCmdUI->Enable(bEnable);
}


⌨️ 快捷键说明

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