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

📄 paintdoc.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	if(!OpenClipboard(NULL))//打开剪裁板
	{
		delete []p_Char;
		return FALSE;
	}
	::EmptyClipboard();//清空剪裁板
	//将全局堆内的字符串以DrawFormat格式存入剪裁板
	::SetClipboardData(DrawFormat,HMem);
	::SetClipboardData(CF_TEXT,HMem);
	HMem=0;
	::CloseClipboard();//关闭剪裁板
	delete []p_Char;
	return TRUE;
}

BOOL CPaintobjDoc::ReadClipBoard()
{	
	int n_Num[2];//存储各图形元素数量的数组
	double minx,miny;
	HANDLE HClipText;
	char *PClipText;
	char *CharTemp,*p_Char;
	if(!OpenClipboard(NULL))//打开剪裁板
		return FALSE;
	//读取DrawFormat格式的数据,成功则得到指向数据的句柄
	HClipText=::GetClipboardData(DrawFormat);
	if(HClipText==NULL)
	{
		return FALSE;
	}
	//给字符串指针分配能够存储句柄指向数据的空间
	CharTemp=new char[::GlobalSize(HClipText)];
	if(CharTemp==0)
	{
		::CloseClipboard();//关闭剪裁板
		return FALSE;
	}
	PClipText=(char *)::GlobalLock(HClipText);//锁定句柄
	if(PClipText==NULL)
	{
		return FALSE;
	}
	::lstrcpy(CharTemp,PClipText);//将句柄指向的剪裁板数据拷贝到字符串
	::GlobalUnlock(HClipText);//打开对句柄的锁定
	::CloseClipboard();//关闭剪裁板
	p_Char=CharTemp;//将字符串指针指向字符串
	//读出并得到各图形元素的数量
	char p1[11];
	strncpy(p1,p_Char,10);
	p_Char+=10;
	p1[10]=0;
	sscanf(p1,"%d,%d\n",&n_Num[0],&n_Num[1]);
	//读出插入点的坐标
	char p3[27];
	strncpy(p3,p_Char,26);
	p_Char+=26;
	p3[26]=0;
	sscanf(p3,"%f,%f\n",&minx,&miny);
	//得到插入点与图形元素基点的相对偏移	
	minx=minx;
	miny=miny;
	//以下根据图形元素的数目创建图形元素对象,并将图形元素对
	//象指针加入到记录图形元素对象指针的数组,调用toData函数
	//从字符串中读出并初始化数据成员,并对图形元素对象作相对
	//于插入点和基点的移动
	for(int i=0;i<2;i++)//只有两种图形元素对象,多则循环多次
	{
		for(int j=0;j<n_Num[i];j++)
		{
			if(i==0)//如果是直线
			{
				m_pSelectedTool= new CPaintLine();//创建一个直线对象				
				m_Objects.Add(m_pSelectedTool);//将对象指针加入对象数组
				p_Char=m_pSelectedTool->toData(p_Char);//从字符串中读出并初始化数据成员
				m_pSelectedTool->m_uFigureType=0;
				m_pSelectedTool->m_uPathId=m_uCurPathIdMax;
				m_uCurPathIdMax++;
				m_pSelectedTool->m_bSelect=TRUE;				
				m_pSelectedTool->Move(1.0,-1.0);//移动图形元素
				int index1=m_Objects.GetSize();
				BOOL bbb=AddSelectList(0,index1-1);					
				m_pSelectedTool=NULL;
			}
			else if(i==1)//如果是圆弧
			{
				m_pSelectedTool= new CPaintArc();//创建一个圆弧对象
				m_Objects.Add(m_pSelectedTool);//将对象指针加入对象数组
				p_Char=m_pSelectedTool->toData(p_Char);//从字符串中读出并初始化数据成员
				m_pSelectedTool->m_uFigureType=1;
				m_pSelectedTool->m_uPathId=m_uCurPathIdMax;
				m_uCurPathIdMax++;
				m_pSelectedTool->m_bSelect=TRUE;				
				m_pSelectedTool->Move(1,-1);//移动图形元素
				int index1=m_Objects.GetSize();
				BOOL bbb=AddSelectList(1,index1-1);				
				m_pSelectedTool=NULL;
			}
		}
	}
	delete []CharTemp;	
	return TRUE;
}
//存储选中的图形元素
BOOL CPaintobjDoc::AddSelectList(UINT Type, UINT Index)
{
	for(int i=0;i<m_nGraphSelect;i++)//判断此图形元素是否已经被选中
	{	//如果已经被选中,则不进行存储
		if((Type==GraphSelect[i].Type) && (Index==GraphSelect[i].Index))
			return FALSE;
	}
	//如果以前没有被选中,则进行存储,并使选中图形数目加1
	GraphSelect[m_nGraphSelect].Type=Type;
	GraphSelect[m_nGraphSelect].Index=Index;
	m_nGraphSelect++;
	return TRUE;
}

void CPaintobjDoc::OnUpdateViewMove(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_nGraphSelect);
	pCmdUI->SetCheck(m_bMove);
}

void CPaintobjDoc::OnViewMove() 
{
	// TODO: Add your command handler code here
	m_bMove= TRUE;//移动图形
	m_nSelectedTool = IDC_CURSORMOVE;
	GenerateTool();	
}

void CPaintobjDoc::GetSelectedBounds(double &xmin,double &xmax,double &ymin,double &ymax)
{
	double minx,maxx,miny,maxy;
	for(int i=0;i<m_nGraphSelect;i++)
	{	double minx1,miny1,maxx1,maxy1;
		CPainted*	pPainted;
		pPainted =GetShape(GraphSelect[i].Index);
		pPainted->GetBoundingRect(minx1,miny1,maxx1,maxy1);
		if(i==0)//如果是第一个图形元素
		{	minx=minx1;
			miny=miny1;
			maxx=maxx1;
			maxy=maxy1;
		}
		else//不是第一个图形元素,比较得到边界
		{
			if(minx>minx1)		minx=minx1;
			if(miny>miny1)		miny=miny1;
			if(maxx<maxx1)		maxx=maxx1;
			if(maxy<maxy1)		maxy=maxy1;
		}	
	}
	xmin=minx;
	ymin=miny;
	xmax=maxx;
	ymax=maxy;
}

void CPaintobjDoc::OnSelectTangency() 
{
	// TODO: Add your command handler code here
	m_bBrushwork=TRUE;//画法选择TRUE为相切画法	
}

void CPaintobjDoc::OnUpdateSelectTangency(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_bBrushwork);
}

void CPaintobjDoc::OnSelectNottangency() 
{
	// TODO: Add your command handler code here
	m_bBrushwork=FALSE;//画法选择TRUE为相切画法	
}

void CPaintobjDoc::OnUpdateSelectNottangency(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(!m_bBrushwork);
}
//得到m_uCurPathIdMax其值比最大的路径编号大1。
void CPaintobjDoc::GetPathIdMax()
{
	int max0=0;
	CPainted*	pPainted;
	int nShapes = m_Objects.GetSize();
	if(nShapes==0)
	{
		m_uCurPathIdMax=0;		
	}
	else
	{
		for (int index = 0; index < nShapes; index++)
		{			
			pPainted =(CPainted*) m_Objects[index];	
			int max1=pPainted->m_uPathId;
			max0=max(max0, max1);			
		}
		m_uCurPathIdMax=max0+1;
	}
}
//得到m_uCurNodeIdMax其值比最大的节点编号大1。
void CPaintobjDoc::GetNodeIdMax()
{
	int max0=0;
	CPainted*	pPainted;
	int nShapes = m_Objects.GetSize();
	if(nShapes==0)
	{
		m_uCurNodeIdMax=0;		
	}
	else
	{
		for (int index = 0; index < nShapes; index++)
		{			
			pPainted =(CPainted*) m_Objects[index];	
			int max1=pPainted->m_uStartNodeId;
			max0=max(max0, max1);
			int max2=pPainted->m_uEndNodeId;
			max0=max(max0, max2);
		}
		m_uCurNodeIdMax=max0+1;
	}
}

void CPaintobjDoc::OnToolLineNormal() 
{
	// TODO: Add your command handler code here
	m_bZoomIn= FALSE;
	m_bZoomOut= FALSE;
	m_nSelectedTool =ID_TOOL_LINE_NORMAL;
	m_PathPaintMode=0;//直线的绘制模式
	GenerateTool();
}

void CPaintobjDoc::OnToolLineStartnode() 
{
	// TODO: Add your command handler code here	
	CInputLineStartNode lll;
	int result=lll.DoModal(m_nGraphSelect);
	if(result==IDOK)
	{		
		m_pPaintStartNode.x=lll.m_startx;//绘图时给定的起点
		m_pPaintStartNode.y=lll.m_starty;//绘图时给定的起点
		m_bZoomIn= FALSE;
		m_bZoomOut= FALSE;
		m_nSelectedTool =ID_TOOL_LINE_STARTNODE;
		m_PathPaintMode=1;//直线的绘制模式		
	}
	GenerateTool();
}

void CPaintobjDoc::OnToolLineStartendnode() 
{
	// TODO: Add your command handler code here	
	CInputLineStartEndNode lll;
	if(lll.DoModal(m_nGraphSelect,m_banglelengthok)==IDOK)
	{
		m_pPaintStartNode.x=lll.m_uStartx;//绘图时给定的起点
		m_pPaintStartNode.y=lll.m_uStarty;//绘图时给定的起点
		m_pPaintEndNode.x=lll.m_uEndx;//绘图时给定的终点
		m_pPaintEndNode.y=lll.m_uEndy;//绘图时给定的终点
		m_bZoomIn= FALSE;
		m_bZoomOut= FALSE;
		m_nSelectedTool =ID_TOOL_LINE_STARTENDNODE;
		m_PathPaintMode=2;//直线的绘制模式
	}
	GenerateTool();
}

void CPaintobjDoc::OnToolLineAnglelength() 
{
	// TODO: Add your command handler code here
	m_bZoomIn= FALSE;
	m_bZoomOut= FALSE;
	m_nSelectedTool =ID_TOOL_LINE_ANGLELENGTH;
	m_PathPaintMode=3;
/*	CMainFrame *p_Wnd=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
	//CButton* bu=(CButton*)(p_Wnd->m_wndMyDialogBar1.GetDlgItem(IDC_CHECKED));
	CComboBox * pcom1=(CComboBox *)(p_Wnd->m_wndMyDialogBar1.GetDlgItem(IDC_COMBO1));
	CEdit * angle=(CEdit *)(p_Wnd->m_wndMyDialogBar1.GetDlgItem(IDC_ANGLE));
	CEdit * length=(CEdit *)(p_Wnd->m_wndMyDialogBar1.GetDlgItem(IDC_LENGTH));
	pcom1->EnableWindow();
	angle->EnableWindow();
	length->EnableWindow();
*/	GenerateTool();
}

void CPaintobjDoc::OnToolClockwiseNormal() 
{
	// TODO: Add your command handler code here
	m_bZoomIn= FALSE;
	m_bZoomOut= FALSE;
	m_nSelectedTool = ID_TOOL_CLOCKWISE_NORMAL;
	m_PathPaintMode=4;//圆弧的绘制模式
	GenerateTool();
}

void CPaintobjDoc::OnToolClockwiseRadius() 
{
	// TODO: Add your command handler code here	
	CInputArcRadius lll;
	if(lll.DoModal()==IDOK)
	{
		m_dPaintRadius=lll.m_dRadius;
		m_bZoomIn= FALSE;
		m_bZoomOut= FALSE;
		m_nSelectedTool = ID_TOOL_CLOCKWISE_RADIUS;
		m_PathPaintMode=5;//圆弧的绘制模式
	}
	GenerateTool();
}

void CPaintobjDoc::OnToolClockwiseStartnode() 
{
	// TODO: Add your command handler code here	
	CInputArcStartNode lll;
	if(lll.DoModal(m_nGraphSelect)==IDOK)
	{
		m_dPaintRadius=lll.m_dRadius;	
		m_pPaintStartNode.x=lll.m_dStartx;//绘图时给定的起点
		m_pPaintStartNode.y=lll.m_dStarty;//绘图时给定的起点
		m_bZoomIn= FALSE;
		m_bZoomOut= FALSE;
		m_nSelectedTool = ID_TOOL_CLOCKWISE_STARTNODE;
		m_PathPaintMode=6;//圆弧的绘制模式
	}
	GenerateTool();
}

void CPaintobjDoc::OnToolClockwiseStartendnode() 
{
	// TODO: Add your command handler code here	
	CInputArcStartEndNode lll;
	if(lll.DoModal(m_nGraphSelect)==IDOK)
	{
		m_dPaintRadius=lll.m_dRadius;	
		m_pPaintStartNode.x=lll.m_dStartx;//绘图时给定的起点
		m_pPaintStartNode.y=lll.m_dStarty;//绘图时给定的起点
		m_pPaintEndNode.x=lll.m_dEndx;//绘图时给定的终点
		m_pPaintEndNode.y=lll.m_dEndy;//绘图时给定的终点
		m_bZoomIn= FALSE;
		m_bZoomOut= FALSE;
		m_nSelectedTool = ID_TOOL_CLOCKWISE_STARTENDNODE;
		m_PathPaintMode=7;//圆弧的绘制模式
	}
	GenerateTool();
}
void CPaintobjDoc::OnToolAnticlockwiseNormal() 
{
	// TODO: Add your command handler code here
	m_bZoomIn= FALSE;
	m_bZoomOut= FALSE;
	m_nSelectedTool = ID_TOOL_ANTICLOCKWISE_NORMAL;
	m_PathPaintMode=8;//圆弧的绘制模式
	GenerateTool();
}

void CPaintobjDoc::OnToolAnticlockwiseRadius() 
{
	// TODO: Add your command handler code here	
	CInputArcRadius lll;
	if(lll.DoModal()==IDOK)
	{
		m_dPaintRadius=lll.m_dRadius;	
		m_bZoomIn= FALSE;
		m_bZoomOut= FALSE;
		m_nSelectedTool = ID_TOOL_ANTICLOCKWISE_RADIUS;
		m_PathPaintMode=9;//圆弧的绘制模式
	}
	GenerateTool();
}
void CPaintobjDoc::OnToolAnticlockwiseStartnode() 
{
	// TODO: Add your command handler code here	
	CInputArcStartNode lll;
	if(lll.DoModal(m_nGraphSelect)==IDOK)
	{
		m_dPaintRadius=lll.m_dRadius;	
		m_pPaintStartNode.x=lll.m_dStartx;//绘图时给定的起点
		m_pPaintStartNode.y=lll.m_dStarty;//绘图时给定的起点
		m_bZoomIn= FALSE;
		m_bZoomOut= FALSE;
		m_nSele

⌨️ 快捷键说明

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