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

📄 pmarkupdemoview.cpp

📁 evc写的XML文件读写程序,Microsoft Windows CE平台适用。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	m_edit.SetFocus();
	return 0;
}

HTREEITEM CPMarkupDemoView::AddElemToTree(HTREEITEM hParentItem)
{
	HTREEITEM hItem;
	hItem = m_tree.InsertItem( m_pXML->GetTagName(), hParentItem );
	m_tree.SetItemData( hItem, 0 );
	return hItem;
}

BOOL CPMarkupDemoView::ElemHasSubItems()
{
	BOOL bElemHasSubItems = FALSE;
	if ( m_pXML->FindChildElem() || ! m_pXML->GetChildData().IsEmpty() )
		bElemHasSubItems = TRUE;
	return bElemHasSubItems;
}

BOOL CPMarkupDemoView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
{
	// NMHDR is { HWND hwndFrom; UINT idFrom; UINT code; }
	NMHDR* pNMHDR = (NMHDR*)lParam;

	// Double-click on tree
	if ( pNMHDR->code == NM_DBLCLK && pNMHDR->idFrom == IDC_MARKUP_TREE )
	{
		if ( m_tree.GetSelectedItem() )
		{
			OnMarkupFind();

			// Message handled
			*pResult = 0;
			return TRUE;
		}
	}

	// Right-click on tree
	if ( pNMHDR->code == NM_RCLICK && pNMHDR->idFrom == IDC_MARKUP_TREE )
	{
		// Create popup menu
		// From resource, use menu.LoadMenu( IDR_MARKUPTREE );
		// and menu.GetSubMenu(0)->TrackPopupMenu()
		CMenu menu;
		UINT nFlags = MF_STRING;
		BOOL bShowMenu = TRUE;
		DWORD dwPos = GetMessagePos();
		CPoint point(LOWORD(dwPos), HIWORD(dwPos));
		ScreenToClient(&point);

		if ( GetDocument()->IsParsed() )
		{
			// Determine item right-clicked on
			HTREEITEM hItem = m_tree.HitTest( point );
			if ( hItem )
			{
				// Select item clicked on
				m_tree.SelectItem( hItem );

				// Is it an attribute?
				BOOL bIsAttrib = m_tree.GetItemData( hItem );

				// Is this the root element or root element attribute?
				BOOL bRootElem = FALSE;
				HTREEITEM hParentItem = m_tree.GetParentItem( hItem );
				if ( ! hParentItem ||
					( ! m_tree.GetParentItem(hParentItem) && m_tree.GetItemData(hItem)==1 ) )
					bRootElem = TRUE;

				menu.CreatePopupMenu();
				if ( bIsAttrib )
				{
					menu.AppendMenu( nFlags, ID_MARKUP_FIND, _T("&Find Elem") );
					menu.AppendMenu( nFlags, ID_MARKUP_ADD_ATTRIB, _T("Add A&ttrib") );
				}
				else
				{
					menu.AppendMenu( nFlags, ID_MARKUP_FIND, _T("&Find Elem") );
					if ( ! bRootElem )
						menu.AppendMenu( nFlags, ID_MARKUP_ADD, _T("&Add Elem") );
					menu.AppendMenu( nFlags, ID_MARKUP_ADD_CHILD, _T("Add &Child Elem") );
					menu.AppendMenu( nFlags, ID_MARKUP_ADD_ATTRIB, _T("Add A&ttrib") );
				}
			}
			else
				bShowMenu = FALSE;
		}
		else
		{
			menu.CreatePopupMenu();
			menu.AppendMenu( nFlags, ID_FILE_PARSE, _T("&Parse") );
		}

		if ( bShowMenu )
		{
			// Run popup menu
			ClientToScreen(&point);
			menu.TrackPopupMenu(
				TPM_LEFTALIGN , point.x, point.y, this );
		}

		// Message handled
		*pResult = 0;
		return TRUE;
	}

	// Expand item in tree
	if ( pNMHDR->code == TVN_ITEMEXPANDING && pNMHDR->idFrom == IDC_MARKUP_TREE )
	{
		NMTREEVIEW* pnmtv = (NMTREEVIEW*)pNMHDR;
		if ( pnmtv->action & TVE_EXPAND )
		{
			// Is the child empty?
			HTREEITEM hParentItem = pnmtv->itemNew.hItem;
			HTREEITEM hItem = m_tree.GetChildItem( hParentItem );
			if ( hItem && m_tree.GetItemText( hItem ).IsEmpty() )
			{
				// Remove blank child
				m_tree.DeleteItem( hItem );

				// Add attribs and child elements to tree
				SetPos( hParentItem );
				while ( m_pXML->FindChildElem() )
				{
					// Go into child
					m_pXML->IntoElem();

					// Add to tree control
					hItem = AddElemToTree( hParentItem );

					// Create empty child under it, if it has data, attribs, or children
					if ( ElemHasSubItems() )
						m_tree.InsertItem( _T(""), hItem );

					// Back to parent to find next child
					m_pXML->OutOfElem();
				}
			}
		}
	}
	
	if ( pNMHDR->code == GN_CONTEXTMENU && pNMHDR->idFrom == IDC_MARKUP_TREE )
	{
		// Create popup menu
		// From resource, use menu.LoadMenu( IDR_MARKUPTREE );
		// and menu.GetSubMenu(0)->TrackPopupMenu()
		CMenu menu;
		UINT nFlags = MF_STRING;
		BOOL bShowMenu = TRUE;
		DWORD dwPos = GetMessagePos();
		CPoint point(LOWORD(dwPos), HIWORD(dwPos));
		ScreenToClient(&point);

		if ( GetDocument()->IsParsed() )
		{
			// Determine item right-clicked on
			HTREEITEM hItem = m_tree.HitTest( point );
			if ( hItem )
			{
				// Select item clicked on
				m_tree.SelectItem( hItem );

				// Is it an attribute?
				BOOL bIsAttrib = m_tree.GetItemData( hItem );

				// Is this the root element or root element attribute?
				BOOL bRootElem = FALSE;
				HTREEITEM hParentItem = m_tree.GetParentItem( hItem );
				if ( ! hParentItem ||
					( ! m_tree.GetParentItem(hParentItem) && m_tree.GetItemData(hItem)==1 ) )
					bRootElem = TRUE;

				menu.CreatePopupMenu();
				if ( bIsAttrib )
				{
					menu.AppendMenu( nFlags, ID_MARKUP_FIND, _T("&Find Elem") );
					menu.AppendMenu( nFlags, ID_MARKUP_ADD_ATTRIB, _T("Add A&ttrib") );
				}
				else
				{
					menu.AppendMenu( nFlags, ID_MARKUP_FIND, _T("&Find Elem") );
					if ( ! bRootElem )
						menu.AppendMenu( nFlags, ID_MARKUP_ADD, _T("&Add Elem") );
					menu.AppendMenu( nFlags, ID_MARKUP_ADD_CHILD, _T("Add &Child Elem") );
					menu.AppendMenu( nFlags, ID_MARKUP_ADD_ATTRIB, _T("Add A&ttrib") );
				}
			}
			else
				bShowMenu = FALSE;
		}
		else
		{
			menu.CreatePopupMenu();
			menu.AppendMenu( nFlags, ID_FILE_PARSE, _T("&Parse") );
		}

		if ( bShowMenu )
		{
			// Run popup menu
			ClientToScreen(&point);
			menu.TrackPopupMenu(
				TPM_LEFTALIGN , point.x, point.y, this );
		}

		// Message handled
		*pResult = 0;
		return TRUE;
	}

	return CView::OnNotify(wParam, lParam, pResult);
}

void CPMarkupDemoView::OnMarkupFind() 
{
	if ( GetDocument()->IsParsed() )
	{
		HTREEITEM hItem = m_tree.GetSelectedItem();
		if ( hItem )
		{
			// Select element
			SetPos( hItem );
			int nStart, nEnd;
			GetDocument()->m_doc.GetOffsets( nStart, nEnd );
			m_edit.SetSel( nStart, nEnd + 1 );

			// Edit control must have focus to display selection
			// Post message so that it gets focus after current message is complete
			PostMessage( WM_APP );
		}
	}
}

void CPMarkupDemoView::OnMarkupAdd() 
{
	if ( GetDocument()->IsParsed() )
	{
		HTREEITEM hItem = m_tree.GetSelectedItem();
		if ( hItem )
		{
			// Add a new element to the document
			SetPos( hItem );
			CString csName = m_pXML->GetTagName();
			m_pXML->AddElem( csName );

			// Add item to tree
			HTREEITEM hParentItem = m_tree.GetParentItem( hItem );
			hItem = m_tree.InsertItem( csName, hParentItem, hItem );
			m_tree.SetItemData( hItem, 0 );

			// Set document in edit window
			SetEditTextFromDoc();
		}
	}
}

void CPMarkupDemoView::OnMarkupAddChild() 
{
	if ( GetDocument()->IsParsed() )
	{
		HTREEITEM hParentItem = m_tree.GetSelectedItem();
		if ( hParentItem )
		{
			// Find last child position
			HTREEITEM hItem = m_tree.GetChildItem( hParentItem );
			HTREEITEM hItemSet = hParentItem;
			BOOL bChild = FALSE;
			while ( hItem )
			{
				hItemSet = hItem;
				bChild = TRUE;
				hItem = m_tree.GetNextSiblingItem( hItem );
			}
			SetPos( hItemSet, bChild );
			
			// Add a new element to the document
			CString csName = _T("ChildOf") + m_pXML->GetTagName();
			m_pXML->AddChildElem( csName );

			// Add item to tree
			hItem = m_tree.InsertItem( csName, hParentItem );
			m_tree.SetItemData( hItem, 0 );
			m_tree.Expand( hParentItem, TVE_EXPAND );

			// Set document in edit window
			SetEditTextFromDoc();
		}
	}
}

void CPMarkupDemoView::OnMarkupAddAttrib() 
{
	if ( GetDocument()->IsParsed() )
	{
		HTREEITEM hItem = m_tree.GetSelectedItem();
		if ( hItem )
		{
			// Add a new attrib to the element
			SetPos( hItem );
			++m_nAddAttrib;
			CString csAttribName;
			csAttribName.Format( _T("attrib%d"), m_nAddAttrib );
			CString csAttribValue;
			csAttribValue.Format( _T("val%d"), m_nAddAttrib );
			m_pXML->AddAttrib( csAttribName, csAttribValue );

			// If selected item is attribute, get element item
			if ( m_tree.GetItemData(hItem) == 1 )
				hItem = m_tree.GetParentItem( hItem );

			// Determine last attribute item
			HTREEITEM hAttribItem = TVI_FIRST;
			HTREEITEM hNextChildItem = m_tree.GetChildItem( hItem );

			// Make sure its not an unexpanded tree item already having children
			if ( ! hNextChildItem || ! m_tree.GetItemText(hNextChildItem).IsEmpty() )
			{
				while ( hNextChildItem && m_tree.GetItemData( hNextChildItem ) == 1 )
				{
					hAttribItem = hNextChildItem;
					hNextChildItem = m_tree.GetNextSiblingItem( hNextChildItem );
				}
			}
			m_tree.Expand( hItem, TVE_EXPAND );

			// Set document in edit window
			SetEditTextFromDoc();
		}
	}
}

void CPMarkupDemoView::OnEditCopy() 
{
	m_edit.Copy();
}

void CPMarkupDemoView::OnEditCut() 
{
	m_edit.Cut();
}

void CPMarkupDemoView::OnEditPaste() 
{
	m_edit.Paste();
}

void CPMarkupDemoView::OnEditUndo() 
{
	m_edit.Undo();
}

void CPMarkupDemoView::OnUpdateEditUndo(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable( m_edit.CanUndo() );
}

⌨️ 快捷键说明

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