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

📄 leftview.cpp

📁 <B>《Realtime Rendering》的随书源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				tree.SetItemData(item3,(DWORD)o);
				tree.SetItemImage(item3,TREE_TYPE_DYNOBJECT*2,TREE_TYPE_DYNOBJECT*2+1);
				tree.EnsureVisible(item3);
				tree.SelectItem(item3);
				tree.EditLabel(item3);
				strcpy(o->long_name,str);
				o->name[0]=0;
				GetDocument()->SetModifiedFlag();
				}
		}
		rv->Invalidate(0);
		break;
	}
}

void CLeftView::OnItemexpanded(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	*pResult = 0;
	CTreeCtrl& tree=GetTreeCtrl();
	if (pNMTreeView->action==2)
		tree.SetItemImage(pNMTreeView->itemNew.hItem,1,1);
	else 
	if (pNMTreeView->action==1)
		tree.SetItemImage(pNMTreeView->itemNew.hItem,0,0);
}

void CLeftView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	CMenu *menu;
	menu=AfxGetApp()->GetMainWnd()->GetMenu()->GetSubMenu(1);

	CTreeCtrl& tree=tv->GetTreeCtrl();

	TVHITTESTINFO hti;
	GetCursorPos(&hti.pt);
	ScreenToClient(&hti.pt);
	tree.HitTest(&hti);
	if (hti.flags&TVHT_ONITEMLABEL)
		tree.SelectItem(hti.hItem);
	
	GetCursorPos(&hti.pt);
	menu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,hti.pt.x,hti.pt.y,AfxGetApp()->GetMainWnd(),0);

	*pResult = 0;
}

void CLeftView::OnEditDelete() 
{
	TV_KEYDOWN key;
	key.wVKey=VK_DELETE;
	OnKeydown((NMHDR*)&key,0);
}

void CLeftView::OnEditInsert() 
{
	TV_KEYDOWN key;
	key.wVKey=VK_INSERT;
	OnKeydown((NMHDR*)&key,0);
}

void CLeftView::OnEditRename() 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;
	tree.EditLabel( item );
}

void CLeftView::OnUpdateEditRename(CCmdUI* pCmdUI) 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;
	DWORD o=tree.GetItemData(item);
	pCmdUI->Enable(item!=0 && o>255);
}

void CLeftView::OnUpdateEditInsert(CCmdUI* pCmdUI) 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;
	DWORD o=tree.GetItemData(item);

	pCmdUI->Enable(item!=0 && (o==TREE_TYPE_OBJECTS || o==TREE_TYPE_TEXTURES || o==TREE_TYPE_PLUGINS || o==TREE_TYPE_STOCK));
}

void CLeftView::OnUpdateEditDelete(CCmdUI* pCmdUI) 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;
	DWORD o=tree.GetItemData(item);

	pCmdUI->Enable(item!=0 && (o==TREE_TYPE_DLLS || o>255));
}

HTREEITEM CLeftView::SelectObject(HTREEITEM item,bsp_object *o)
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	DWORD type=tree.GetItemData(item);
	if (type>255)
		if (o==(bsp_object *)type)
			{
			tree.SelectItem(item);
			return item;
			}
	HTREEITEM item2,item3;
	if (tree.ItemHasChildren(item))
	{
		item2=SelectObject(tree.GetChildItem(item),o);
		if (item2)
			return item2;
	}
	item3=item;
	while(item3=tree.GetNextSiblingItem(item3))
	{
		item2=SelectObject(item3,o);
		if (item2)
			return item2;
	}

	return 0;
}
void CLeftView::OnUpdateDown(CCmdUI* pCmdUI) 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;
	DWORD o=tree.GetItemData(item);
	pCmdUI->Enable(o==TREE_TYPE_DLLS && tree.GetNextSiblingItem(item));
}

int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, 
		LPARAM lParamSort)
{
	return (int)lParam1-(int)lParam2;
}

void CLeftView::OnDown() 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;

	flyengine->dll.move_dll((char *)(LPCSTR)tree.GetItemText(item),1);

	HTREEITEM p=tree.GetParentItem(item);
	HTREEITEM i=tree.GetChildItem(p);
	int n=0;
	while(i)
		{
		tree.SetItemData(i,n++);
		i=tree.GetNextSiblingItem(i);
		}

	HTREEITEM a=tree.GetNextSiblingItem(item);
	int d=tree.GetItemData(a);
	tree.SetItemData(item,d);
	tree.SetItemData(a,d-1);

	TVSORTCB data;
	data.lParam=0;
	data.lpfnCompare=CompareFunc;
	data.hParent=p;
	tree.SortChildrenCB(&data);

	i=tree.GetChildItem(p);
	while(i)
		{
		tree.SetItemData(i,TREE_TYPE_DLLS);
		i=tree.GetNextSiblingItem(i);
		}

	GetDocument()->SetModifiedFlag();
}

void CLeftView::OnUpdateUp(CCmdUI* pCmdUI) 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;
	DWORD o=tree.GetItemData(item);
	pCmdUI->Enable(o==TREE_TYPE_DLLS && tree.GetPrevSiblingItem(item));
}

void CLeftView::OnUp() 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item==0) return;

	flyengine->dll.move_dll((char *)(LPCSTR)tree.GetItemText(item),-1);

	HTREEITEM p=tree.GetParentItem(item);
	HTREEITEM i=tree.GetChildItem(p);
	int n=0;
	while(i)
		{
		tree.SetItemData(i,n++);
		i=tree.GetNextSiblingItem(i);
		}

	HTREEITEM a=tree.GetPrevSiblingItem(item);
	int d=tree.GetItemData(a);
	tree.SetItemData(item,d);
	tree.SetItemData(a,d+1);

	TVSORTCB data;
	data.lParam=0;
	data.lpfnCompare=CompareFunc;
	data.hParent=p;
	tree.SortChildrenCB(&data);

	i=tree.GetChildItem(p);
	while(i)
		{
		tree.SetItemData(i,TREE_TYPE_DLLS);
		i=tree.GetNextSiblingItem(i);
		}

	GetDocument()->SetModifiedFlag();
}

void CLeftView::OnEditCut() 
{
	OnEditCopy();

	CFlyEditorDoc* pDoc = GetDocument();
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	HTREEITEM item2=tree.GetParentItem(item);
	DWORD type=tree.GetItemData(item);
	bsp_object *o=(bsp_object *)type;
	pDoc->dll.delete_class(o);
	tree.DeleteItem(item);
	if (tree.ItemHasChildren(item2)==0)
		tree.SetItemImage(item2,0,0);
	pDoc->SetModifiedFlag();
}

void CLeftView::OnUpdateEditCut(CCmdUI* pCmdUI) 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	DWORD type=0;
	if (item!=0) 
		type=tree.GetItemData(item);
	pCmdUI->Enable(type>255);
}

void CLeftView::OnEditCopy() 
{
	CFlyEditorDoc* pDoc = GetDocument();
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	DWORD type=tree.GetItemData(item);
	bsp_object *o=(bsp_object *)type;

	if ( ::OpenClipboard(0) )
	{
		EmptyClipboard();

		HGLOBAL hData=GlobalAlloc(GMEM_MOVEABLE,16384);
		char *buf=(char *)GlobalLock(hData);
		char str[256];
		int i,j;
		param_desc pd;
		for( i=0;i<pDoc->dll.ncd;i++ )
			if (pDoc->dll.cd[i]->get_type()==o->type)
				break;

		buf[0]=0;

		sprintf(str,"fly3dclass %s %s\r\n",pDoc->dll.cd[i]->get_name(),o->long_name);
		strcat(buf,str);

		j=o->get_param_desc(0,0);
		for( i=0;i<j;i++ )
		{
			o->get_param_desc(i,&pd);
			sprintf(str,"%s=%s\r\n",pd.name,pd.get_string());
			strcat(buf,str);
		}

		GlobalUnlock(hData);
		SetClipboardData( CF_TEXT, hData );

		CloseClipboard();	
	}
}

void CLeftView::OnUpdateEditCopy(CCmdUI* pCmdUI) 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	DWORD type=0;
	if (item!=0) 
		type=tree.GetItemData(item);
	pCmdUI->Enable(type>255);
}

void CLeftView::OnEditPaste() 
{
	if (IsClipboardFormatAvailable(CF_TEXT))
	{
		if (::OpenClipboard(0))
		{
			HGLOBAL hData=GetClipboardData(CF_TEXT);
			if (hData)
				{
				char *buf=(char *)GlobalLock(hData);

				char *c1=strchr(buf,'\r');
				*c1=0;
				c1+=2;
				char *c2=strchr(buf,' ');
				*(c2++)=0;
				char *c3=strchr(c2,' ');
				*(c3++)=0;

				bsp_object *o=flyengine->dll.add_class(c2);
				if (o)
					{
					strcpy(o->long_name,c3);
					strcat(o->long_name,"_copy");
					o->name[0]=0;

					param_desc pd;
					int i,j,k;
					j=o->get_param_desc(0,0);
					for( i=0;i<j;i++ )
					{
						o->get_param_desc(i,&pd);
						k=strlen(pd.name);
						if (memcmp(pd.name,c1,k)==0)
						{
						c2=&c1[k+1];
						c3=strchr(c1,'\r');
						*c3=0;
						c1=c3+2;
						pd.set_string(c2);
						}
					}

					CTreeCtrl& tree=tv->GetTreeCtrl();
					HTREEITEM item=tree.GetSelectedItem();
					HTREEITEM item2,item3;
					item2=tree.GetChildItem(item);
					if (item2==0)
						item3=tree.InsertItem(o->long_name,item);
					else 
						{
						while( item3=tree.GetNextSiblingItem(item2) )
							item2=item3;
						item3=tree.InsertItem(o->long_name,item,item2);
						}

					tree.SetItemData(item3,(DWORD)o);
					tree.SetItemImage(item3,TREE_TYPE_DYNOBJECT*2,TREE_TYPE_DYNOBJECT*2+1);
					tree.EnsureVisible(item3);
					tree.SelectItem(item3);
					tree.EditLabel(item3);
					}
				else AfxMessageBox("Could not paste !\nClass name not present in scene.",MB_OK|MB_ICONINFORMATION);

				GlobalUnlock(hData);
				GetDocument()->SetModifiedFlag();
				}
			CloseClipboard();
		}
	}
}

void CLeftView::OnUpdateEditPaste(CCmdUI* pCmdUI) 
{
	int pasteok=0;
	
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	if (item && tree.GetItemData(item)==TREE_TYPE_STOCK)
	if (IsClipboardFormatAvailable(CF_TEXT))
	{
		if (::OpenClipboard(0))
		{
			HGLOBAL hData=GetClipboardData(CF_TEXT);
			if (hData)
				{
				char *buf=(char *)GlobalLock(hData);
				CString s=tree.GetItemText(item);
				if (memcmp(buf,"fly3dclass ",11)==0)
					if (memcmp(&buf[11],s,s.GetLength())==0)
						pasteok=1;
				GlobalUnlock(hData);
				}
			CloseClipboard();
		}
	}
	pCmdUI->Enable( pasteok );
}

void CLeftView::OnEditDuplicate() 
{
	OnEditCopy();
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	tree.SelectItem(tree.GetParentItem(item));
	OnEditPaste();
}

void CLeftView::OnUpdateEditDuplicate(CCmdUI* pCmdUI) 
{
	CTreeCtrl& tree=tv->GetTreeCtrl();
	HTREEITEM item=tree.GetSelectedItem();
	DWORD type=0;
	if (item!=0) 
		type=tree.GetItemData(item);
	pCmdUI->Enable(type>255);
}

⌨️ 快捷键说明

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