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

📄 fe_libdlg.cpp

📁 一个2D电磁场FEM计算的VC++源程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		return FALSE;
}

////////////////////////////////////////////////////////////////
//  Drag-n-Drop Implementation

void fe_CLibDlg::OnBegindragMytree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	m_dragItem = pNMTreeView->itemNew.hItem;

	if(m_dragItem!=LibParent) // can't drag top-level folder
	{
		CImageList* pDragImage;
		pDragImage = m_mytree.CreateDragImage( m_dragItem );
		m_mytree.SelectItem( m_dragItem );
		pDragImage->BeginDrag( 0, CPoint(0,-14) );
		pDragImage->DragEnter(this, pNMTreeView->ptDrag);
		SetCapture();
		m_bIsDragging = TRUE;
		delete pDragImage;
		SetTimer ( 1, 75, NULL ) ;
	}

	*pResult = 0;

}

void fe_CLibDlg::OnBegindragMylist(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	m_dragItem = pNMTreeView->itemNew.hItem;

	if(m_dragItem!=ModelParent)
	{
		CImageList* pDragImage;
		pDragImage = m_mylist.CreateDragImage( m_dragItem );
		m_mylist.SelectItem( m_dragItem );
		pDragImage->BeginDrag( 0, CPoint(0,-14) );
		pDragImage->DragEnter(this, pNMTreeView->ptDrag);
		SetCapture();
		m_bIsDragging = TRUE;
		delete pDragImage;
		bDragFromLibrary=FALSE;
		SetTimer ( 1, 75, NULL ) ;
	}

	*pResult = 0;
}

void fe_CLibDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	if( m_bIsDragging != FALSE )
    {
        CPoint      ptDrag( point );
		CPoint		ptTree( point );
		CPoint		ptList( point );
		UINT uHitTest = TVHT_ONITEM;
        
		MapWindowPoints( this, &ptDrag, 1 );
		MapWindowPoints( &m_mytree, &ptTree, 1 );
		MapWindowPoints( &m_mylist, &ptList, 1 );
        
		CImageList::DragMove( ptDrag );        
        m_dragTargetTree = m_mytree.HitTest( ptTree, &uHitTest );
        m_dragTargetList = m_mylist.HitTest( ptList, &uHitTest );
    }

	CResizableDialog::OnMouseMove(nFlags, point);
}

void fe_CLibDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if( m_bIsDragging != FALSE )
    {
		KillTimer ( 1 ) ;
        CImageList::DragLeave( &m_mytree );
        CImageList::EndDrag();
        ReleaseCapture();
        m_bIsDragging = FALSE;

		// Do some logic to drop onto the main tree if the property is
		// dropped onto the tree's window, but not exactly on the list
		if((m_dragTargetTree==NULL) && (m_dragTargetList==NULL))
		{
			POINT point;
			GetCursorPos(&point);
			void* pVoid = (void*)GetDesktopWindow()->WindowFromPoint(point);
			if((void *) &m_mytree==pVoid) m_dragTargetTree=LibParent;
			if((void *) &m_mylist==pVoid) m_dragTargetList=ModelParent;
		}

		// Drop onto the Library tree
        if( m_dragTargetTree != NULL )
        {
			if(!IsTailChasing(m_dragItem,m_dragTargetTree))
			{
				CopyItemToLibrary(m_dragItem,m_dragTargetTree);
				if(bDragFromLibrary) m_mytree.DeleteItem( m_dragItem );
			}
        }

		// Drop onto the model materials
		if( m_dragTargetList != NULL )
        {
			CopyItemToModel(m_dragItem,m_dragTargetList);
			if(!bDragFromLibrary) m_mylist.DeleteItem( m_dragItem );
        }
    }
    else CResizableDialog::OnLButtonUp(nFlags, point);
}

BOOL fe_CLibDlg::IsFolder(HTREEITEM hItem)
{
	int nImage,nSelImage;
	m_mytree.GetItemImage(hItem,nImage,nSelImage);
	if (nImage!=2) return TRUE;
	return FALSE;
}

HTREEITEM fe_CLibDlg::CopyItemToLibrary(HTREEITEM hItem, HTREEITEM hTarget)
{
	HTREEITEM hResult,hParent,hChild;
	
	CString szLabel = m_mytree.GetItemText(hItem);
	int ItemData = m_mytree.GetItemData(hItem);

	if(IsFolder(hTarget))
	{
		if (IsFolder(hItem))
		{
			hResult = m_mytree.InsertItem( szLabel, 0, 1, hTarget, TVI_LAST );
			m_mytree.SetItemData(hResult,ItemData);
			
			hChild=m_mytree.GetChildItem(hItem) ;
			while (hChild!=NULL)
			{
				CopyItemToLibrary(hChild,hResult) ;
				hChild = m_mytree.GetNextSiblingItem(hChild) ;
			}

		}
		else{
			if(!bDragFromLibrary)
			{
				CMaterialProp MProp=LibProps[ItemData];
				MProp.BHdata=NULL;MProp.BHpoints=NULL;
				LibProps.Add(MProp);
				int NewItemData=LibProps.GetUpperBound();
				CopyBHdata(LibProps[ItemData],LibProps[NewItemData]);
				ItemData=NewItemData;
			}
			hResult = m_mytree.InsertItem( szLabel, 2, 2, hTarget, TVI_LAST);
			m_mytree.SetItemData(hResult,ItemData);
		}
	}
	else
	{
		hParent = m_mytree.GetParentItem(hTarget);
		
		if (IsFolder(hItem))
		{
			hResult = m_mytree.InsertItem( szLabel, 0, 1, hParent, hTarget );
			m_mytree.SetItemData(hResult,ItemData);

			hChild=m_mytree.GetChildItem(hItem) ;
			while (hChild!=NULL)
			{
				CopyItemToLibrary(hChild,hResult) ;
				hChild = m_mytree.GetNextSiblingItem(hChild) ;
			}
		}
		else{
			if(!bDragFromLibrary)
			{
				CMaterialProp MProp=LibProps[ItemData];
				MProp.BHdata=NULL;MProp.BHpoints=NULL;
				LibProps.Add(MProp);
				int NewItemData=LibProps.GetUpperBound();
				CopyBHdata(LibProps[ItemData],LibProps[NewItemData]);
				ItemData=NewItemData;
			}
			hResult = m_mytree.InsertItem( szLabel, 2, 2, hParent, hTarget );
			m_mytree.SetItemData(hResult,ItemData);
		}
	}


	return hResult;
}

HTREEITEM fe_CLibDlg::CopyItemToModel(HTREEITEM hItem, HTREEITEM hTarget)
{
	HTREEITEM hResult,hParent,hChild;
	
	if (IsFolder(hItem))
	{
		hChild=m_mytree.GetChildItem(hItem) ;
		hParent=hTarget;
		while (hChild!=NULL)
		{
			hParent=CopyItemToModel(hChild,hParent) ;
			hChild = m_mylist.GetNextSiblingItem(hChild);
		}
		hResult=hParent;
	}
	else{	
        CString szLabel = m_mylist.GetItemText( hItem );
		int ItemData = m_mylist.GetItemData(hItem);

		if(bDragFromLibrary)
		{
			CMaterialProp MProp=LibProps[ItemData];
			MProp.BHdata=NULL;MProp.BHpoints=NULL;
			LibProps.Add(MProp);
			int NewItemData=LibProps.GetUpperBound();
			CopyBHdata(LibProps[ItemData],LibProps[NewItemData]);
			ItemData=NewItemData;
		}

		hParent = m_mylist.GetParentItem( hTarget );
        if( hParent != NULL )
			hResult=m_mylist.InsertItem( szLabel, 2, 2, ModelParent, hTarget);
		else
			hResult=m_mylist.InsertItem( szLabel, 2, 2, ModelParent, TVI_LAST );
		m_mylist.SetItemData(hResult,ItemData);
	}
	
	return hResult;
}

void fe_CLibDlg::AddNewProperty()
{
	HTREEITEM hParent,hResult;

	if(m_dragTargetList!=NULL)
	{
		hParent = m_mylist.GetParentItem(m_dragTargetList);
        if( hParent != NULL )
			hResult=m_mylist.InsertItem("New Material", 2, 2, ModelParent, m_dragTargetList);
		else
			hResult=m_mylist.InsertItem("New Material", 2, 2, ModelParent, TVI_LAST );

		CMaterialProp MProp;
		LibProps.Add(MProp);
		m_mylist.SetItemData(hResult,LibProps.GetUpperBound());
	}

	if(m_dragTargetTree!=NULL)
	{
		if(IsFolder(m_dragTargetTree)) hParent=m_dragTargetTree;
		else hParent = m_mytree.GetParentItem(m_dragTargetTree);
        if( hParent != NULL )
			hResult=m_mytree.InsertItem("New Material", 2, 2, hParent, m_dragTargetTree);
		else
			hResult=m_mytree.InsertItem("New Material", 2, 2, LibParent, TVI_LAST );

		CMaterialProp MProp;
		LibProps.Add(MProp);
		m_mytree.SetItemData(hResult,LibProps.GetUpperBound());
	}
}

void fe_CLibDlg::AddNewFolder()
{
	HTREEITEM hParent,hResult;

	if(m_dragTargetTree!=NULL)
	{
		if (IsFolder(m_dragTargetTree))
			hParent=m_dragTargetTree;
		else hParent = m_mytree.GetParentItem(m_dragTargetTree);
        if( hParent != NULL )
			hResult=m_mytree.InsertItem("New Folder", 0, 1, hParent, m_dragTargetTree);
		else
			hResult=m_mytree.InsertItem("New Folder", 0, 1, LibParent, TVI_LAST );

		CFolderProp FProp;
		FProp.FolderName="New Folder";
		FProp.FolderURL="";
		FProp.FolderVendor="";
		FoldProps.Add(FProp);
		m_mytree.SetItemData(hResult,FoldProps.GetUpperBound());
	}
}

void fe_CLibDlg::Zappit()
{
	if ((m_dragTargetTree!=NULL) && (m_dragTargetTree!=LibParent))
		m_mytree.DeleteItem(m_dragTargetTree);
	if ((m_dragTargetList!=NULL) && (m_dragTargetList!=ModelParent))
		m_mylist.DeleteItem(m_dragTargetList);
}

void fe_CLibDlg::OnRclickMytree(NMHDR* pNMHDR, LRESULT* pResult) 
{
		CMenu* pMenu = NULL;
		try
		{
			pMenu = new CMenu;
		}
		catch(...)
		{
			pMenu = NULL;
		}
		ASSERT(pMenu);

		POINT point;
		GetCursorPos(&point);
		CPoint ptTree(point);
		UINT uHitTest = TVHT_ONITEM;
		GetDesktopWindow()->MapWindowPoints( &m_mytree, &ptTree, 1 );
		m_dragTargetTree = m_mytree.HitTest( ptTree, &uHitTest );
		m_dragTargetList = NULL;

		if(m_dragTargetTree==NULL) m_dragTargetTree=LibParent;

		VERIFY(pMenu->CreatePopupMenu());
		if(m_dragTargetTree!=LibParent) 
			VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_CUT, "Delete Selected"));
		else
			VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_FIND, "Import Materials"));
		VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_COPY, "Add New Material"));
		VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_PASTE, "Add New Folder"));

		if(m_dragTargetTree!=NULL)
		{
			if(!IsFolder(m_dragTargetTree))
			{
				VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_REPLACE, "Modify Material"));
				HTREEITEM hParent=m_mytree.GetParentItem(m_dragTargetTree);
				if(hParent!=LibParent)
				{
					int k=m_mytree.GetItemData(hParent);
					if (FoldProps[k].FolderVendor!="")
					{
						CString VendorBlurb;
						VendorBlurb="Visit " + FoldProps[k].FolderVendor;
						VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_PASTE_LINK, VendorBlurb));
						VendorURL=FoldProps[k].FolderURL;
						VendorName=FoldProps[k].FolderVendor;
					}
				}
			}
			else if(m_dragTargetTree!=LibParent){
				VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_REPLACE, "Edit Folder Info"));
				int k=m_mytree.GetItemData(m_dragTargetTree);
				if (FoldProps[k].FolderVendor!="")
				{
					CString VendorBlurb;
					VendorBlurb="Visit " + FoldProps[k].FolderVendor;
					VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_PASTE_LINK, VendorBlurb));
					VendorURL=FoldProps[k].FolderURL;
					VendorName=FoldProps[k].FolderVendor;
				}
			}
		}

		pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,point.x,point.y,this);

		try
		{
			delete pMenu;
		}
		catch(...)
		{
			ASSERT(FALSE);
			TRACE("fe_CLibDlg::OnRclickMytree failed to destroy menu resource\n");
			pMenu = FALSE;
		}


	*pResult = 0;
}

void fe_CLibDlg::OnRclickMylist(NMHDR* pNMHDR, LRESULT* pResult) 
{
		CMenu* pMenu = NULL;
		try
		{
			pMenu = new CMenu;
		}
		catch(...)
		{
			pMenu = NULL;
		}
		ASSERT(pMenu);
		
		POINT point;
		GetCursorPos(&point);
		CPoint ptList(point);
		UINT uHitTest = TVHT_ONITEM;
		GetDesktopWindow()->MapWindowPoints( &m_mylist, &ptList, 1 );
		m_dragTargetList = m_mylist.HitTest( ptList, &uHitTest );
		m_dragTargetTree = NULL;

		if(m_dragTargetList==NULL) m_dragTargetList=ModelParent;

		VERIFY(pMenu->CreatePopupMenu());
		if (m_dragTargetList!=ModelParent)
			VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_CUT, "Delete Selected"));
		else
			VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_FIND, "Import Materials"));
		VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_COPY, "Add New Material"));

		if(m_dragTargetList!=NULL)
		{
			if(!IsFolder(m_dragTargetList))
				VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_REPLACE, "Modify Material"));
		}

		pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,point.x,point.y,this);

		try
		{
			delete pMenu;
		}
		catch(...)
		{
			ASSERT(FALSE);
			TRACE("fe_CLibDlg::OnRclickMylist failed to destroy menu resource\n");
			pMenu = FALSE;
		}

	*pResult = 0;
}

void fe_CLibDlg::CopyBHdata(CMaterialProp &source, CMaterialProp &dest)
{
	// copy BH data from source to destination
	dest.BHpoints=source.BHpoints;
	if(source.BHpoints==0) return;
	dest.BHdata=(CComplex *)calloc(source.BHpoints,sizeof(CComplex));
	for(int k=0;k<source.BHpoints;k++)
		dest.BHdata[k]=source.BHdata[k];
}

void fe_CLibDlg::OnDblclkMylist(NMHDR* pNMHDR, LRESULT* pResult) 
{
	POINT point;
	GetCursorPos(&point);
	CPoint ptList(point);
	UINT uHitTest = TVHT_ONITEM;
	GetDesktopWindow()->MapWindowPoints( &m_mylist, &ptList, 1 );
	m_dragTargetList = m_mylist.HitTest( ptList, &uHitTest );
	m_dragTargetTree = NULL;

⌨️ 快捷键说明

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