linedlg.cpp

来自「VC做的矢量画图程序!」· C++ 代码 · 共 1,095 行 · 第 1/2 页

CPP
1,095
字号

void CTextDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTextDlg)
	DDX_Check(pDX, IDC_CHECK1, m_bDelete);
	DDX_Text(pDX, IDC_EDIT1, m_Startx);
	DDX_Text(pDX, IDC_EDIT2, m_Starty);
	DDX_Text(pDX, IDC_EDIT3, m_Text);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTextDlg, CDialog)
	//{{AFX_MSG_MAP(CTextDlg)
	ON_BN_CLICKED(IDC_FONT, OnFont)
	ON_BN_CLICKED(IDC_PENCOLOR, OnPencolor)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTextDlg message handlers

BOOL CTextDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	CComboBox* pcom1=(CComboBox *)GetDlgItem(IDC_COMBO1);
	pcom1->ResetContent();
	for(int i=0;i<p_GraphPara->n_LayerNumb;i++)
		pcom1->AddString(p_GraphPara->m_LayerList[i].m_Name);
	pcom1->SetCurSel(m_Layer);
	return TRUE;  // return TRUE unless you set the focus to a control
}

void CTextDlg::OnOK() 
{
	CComboBox* pcom1=(CComboBox *)GetDlgItem(IDC_COMBO1);
	m_Layer=pcom1->GetCurSel();
	UpdateData(1);
	m_pText->m_StartX=m_Startx;
	m_pText->m_StartY=m_Starty;
	m_pText->c_Text=m_Text;
	m_pText->m_TextLong=m_Text.GetLength();
	m_pText->m_Layer=m_Layer;				//所处层
	m_pText->m_ColorPen=m_ColorPen;			//笔色
	m_pText->b_Delete=m_bDelete;
	m_pText->m_TextHeight=m_TextHeight;		//字体高度
	m_pText->m_TextWide=m_TextWide;			//字体宽度
	m_pText->m_OffWide=m_OffWide;			//间隔宽度
	m_pText->m_Angle1=m_Angle1;				//标注角度
	m_pText->m_Angle2=m_Angle2;				//字体旋转角度
	EndDialog(IDOK);
}

void CTextDlg::OnFont() 
{
	TextFontDlg pDg1(m_TextHeight,m_TextWide,m_Angle1,m_Angle2,m_OffWide);
	if(pDg1.DoModal()==IDOK)
	{
		m_TextHeight=pDg1.m_FontHeight;
		m_TextWide=pDg1.m_FontWide;
		m_Angle1=pDg1.m_Angle1;
		m_Angle2=pDg1.m_Angle2;
		m_OffWide=pDg1.m_FontBetween;
	}
}

void CTextDlg::OnPencolor() 
{
	ColorSetDialog pDg1(m_ColorPen);
	if(pDg1.DoModal()==IDOK)
	{
		m_ColorPen=pDg1.m_ColorIndex;
		Invalidate();
	}
}

void CTextDlg::OnPaint() 
{
	CRect r1;
	CPaintDC dc(this); // device context for painting
	CBrush* pbrush;
	//以下用当前笔色绘制一个矩形区域
	pbrush=new CBrush(p_GraphPara->GetColor(m_ColorPen));
	CStatic* pStatic=(CStatic *)GetDlgItem(IDC_STATIC1);
	pStatic->GetWindowRect(r1);
	ScreenToClient(&r1);
	r1.top+=10;
	dc.FillRect(r1,pbrush);
	delete pbrush;
}
/////////////////////////////////////////////////////////////////////////////
// CTagDlg dialog


CTagDlg::CTagDlg(CDrawDoc* pDoc,CTag* pTag,CWnd* pParent /*=NULL*/)
	: CDialog(CTagDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTagDlg)
	m_bDelete = FALSE;
	m_xInsert = 0.0f;
	m_yInsert = 0.0f;
	m_ScaleX = 0.0f;
	m_ScaleY = 0.0f;
	m_idBlock = 0;
	//}}AFX_DATA_INIT
	m_pDoc=pDoc;
	m_pTag=pTag;
	m_xInsert=m_pTag->x_Insert;
	m_yInsert=m_pTag->y_Insert;
	m_ScaleX=m_pTag->x_Scale;
	m_ScaleY=m_pTag->y_Scale;
	m_bDelete=m_pTag->b_Delete;
	m_Layer=m_pTag->m_Layer;
	m_idBlock=m_pTag->idBlock;
	m_pBlock=m_pTag->p_Block;
}


void CTagDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTagDlg)
	DDX_Check(pDX, IDC_CHECK1, m_bDelete);
	DDX_Text(pDX, IDC_EDIT1, m_xInsert);
	DDX_Text(pDX, IDC_EDIT2, m_yInsert);
	DDX_Text(pDX, IDC_EDIT3, m_ScaleX);
	DDX_Text(pDX, IDC_EDIT4, m_ScaleY);
	DDX_Text(pDX, IDC_EDIT5, m_idBlock);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTagDlg, CDialog)
	//{{AFX_MSG_MAP(CTagDlg)
	ON_BN_CLICKED(IDC_BLOCK, OnBlock)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTagDlg message handlers

void CTagDlg::OnOK() 
{
	CComboBox* pcom1=(CComboBox *)GetDlgItem(IDC_COMBO1);
	m_Layer=pcom1->GetCurSel();
	UpdateData(1);	//将对话框控制中的内容存储到变量中
	if(m_idBlock<0)	//如果图形块识别号小于0
	{
		AfxMessageBox("没有选择图例属于的图形块,请按中“图形块识别号”按钮进行选择");
		return;
	}
	m_pTag->x_Insert=m_xInsert;
	m_pTag->y_Insert=m_yInsert;
	m_pTag->x_Scale=m_ScaleX;
	m_pTag->y_Scale=m_ScaleY;
	m_pTag->b_Delete=m_bDelete;
	m_pTag->m_Layer=m_Layer;
	m_pTag->idBlock=m_idBlock;
	m_pTag->p_Block=m_pBlock;
	EndDialog(IDOK);
}

BOOL CTagDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	CComboBox* pcom1=(CComboBox *)GetDlgItem(IDC_COMBO1);
	pcom1->ResetContent();
	for(int i=0;i<p_GraphPara->n_LayerNumb;i++)
		pcom1->AddString(p_GraphPara->m_LayerList[i].m_Name);
	pcom1->SetCurSel(m_Layer);
	return TRUE;  // return TRUE unless you set the focus to a control
}

void CTagDlg::OnBlock() 
{
	char p1[4];
	short nIndex=m_pDoc->GetBlockIndex(m_idBlock);
	BlockDialog pdlg(m_pDoc,nIndex,0);
	if(pdlg.DoModal()==IDOK)
	{
		nIndex=pdlg.m_BlockIndex;		//得到图形块的序号
		m_pBlock=m_pDoc->GetBlock(nIndex);	//得到指向图形块的指针
		m_idBlock=m_pBlock->m_iD;		//得到图形块的识别号
		sprintf(p1,"%d",m_idBlock);
		SetDlgItemText(IDC_EDIT5,p1);
	}	
}

/////////////////////////////////////////////////////////////////////////////
// CGraphDataDlg dialog


CGraphDataDlg::CGraphDataDlg(CDrawDoc* pDoc,CWnd* pParent /*=NULL*/)
	: CDialog(CGraphDataDlg::IDD, pParent)
{
	m_pDoc=pDoc;	//指向当前的文档对象
	m_GraphNumb=0;
	
	//{{AFX_DATA_INIT(CGraphDataDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void CGraphDataDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGraphDataDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CGraphDataDlg, CDialog)
	//{{AFX_MSG_MAP(CGraphDataDlg)
	ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1)
	ON_BN_CLICKED(IDC_ADD, OnAdd)
	ON_BN_CLICKED(IDC_DELETE, OnDelete)
	ON_BN_CLICKED(IDC_MODIFY, OnModify)
	ON_LBN_SELCHANGE(IDC_LIST2, OnSelchangeList2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGraphDataDlg message handlers

void CGraphDataDlg::OnSelchangeList1() 
{
	CButton* pbut;
	int nn=plist1->GetCurSel();
	if(nn<0)	//如果没有在第一个列表框中选择图形类别
	{
		//以下将几个按钮失效
		pbut=(CButton *)GetDlgItem(IDC_ADD);
		pbut->EnableWindow(FALSE);
		pbut=(CButton *)GetDlgItem(IDC_MODIFY);
		pbut->EnableWindow(FALSE);
		pbut=(CButton *)GetDlgItem(IDC_DELETE);
		pbut->EnableWindow(FALSE);
		return;
	}
	plist2->ResetContent();
	m_GraphNumb=0;
	int numb=m_pDoc->GetGraphUpperBound(nn+1);
	
	for(int i=m_pDoc->GraphNumbStart[nn];i<=numb;i++)
	{
		CDraw* pDraw=m_pDoc->GetGraph(nn+1,i);
		if(pDraw)
		{
			m_pDoc->m_Index[m_GraphNumb++]=i;
			MakeStr(pDraw);
			plist2->AddString(m_str);
		}
	}
	pbut=(CButton *)GetDlgItem(IDC_ADD);
	pbut->EnableWindow(TRUE);
	plist2->SetCurSel(0);
	OnSelchangeList2();
	return;
}

void CGraphDataDlg::OnAdd() 
{
	int nn1=plist1->GetCurSel();
	if(nn1<0)
		return;
	int id=m_pDoc->GetGraphID(nn1+1);	//得到要增加图形元素的的识别号

	switch(nn1)
	{
		case 0:	//直线
		{
			CLine* pLine=new CLine(p_View->m_pColor,p_View->m_brColor,1,0,p_View->m_Layer,id,0,0,0,0,0);
			CLineDlg pdlg(pLine);
			if(pdlg.DoModal()==IDOK)
			{
				m_pDoc->AddLine(pLine);	
				MakeStr(pLine);
				plist2->AddString(m_str);
				plist2->SetCurSel(m_GraphNumb);
				m_pDoc->m_Index[m_GraphNumb++]=m_pDoc->GetGraphUpperBound(nn1+1);
			}
			else
			{
				delete pLine;
			}
			break;
		}
		case 1:	//连续直线和多边形区域
		{

			CPline* pPLine=new CPline(p_View->m_pColor,p_View->m_brColor,
				1,0,p_View->m_Layer,id,0,0,p_View->PointXyz,0);
			CPLineDlg pdlg(pPLine);
			if(pdlg.DoModal()==IDOK)
			{
				pPLine=pdlg.m_pPline;
				m_pDoc->AddPLine(pPLine);	
				MakeStr(pPLine);
				plist2->AddString(m_str);
				plist2->SetCurSel(m_GraphNumb);
				m_pDoc->m_Index[m_GraphNumb++]=m_pDoc->GetGraphUpperBound(nn1+1);
			}
			else
			{
				pPLine=pdlg.m_pPline;
				delete pPLine;
			}
			break;
		}
		case 2:	//圆和圆形区域
		{
			CCircle* pCircle=new CCircle(p_View->m_pColor,p_View->m_brColor,1,0,p_View->m_Layer,id,0,0,0,10,0);
			CCircleDlg pdlg(pCircle);
			if(pdlg.DoModal()==IDOK)
			{
				m_pDoc->AddCircle(pCircle);
				MakeStr(pCircle);
				plist2->AddString(m_str);
				plist2->SetCurSel(m_GraphNumb);
				m_pDoc->m_Index[m_GraphNumb++]=m_pDoc->GetGraphUpperBound(nn1+1);
			}
			else
			{
				delete pCircle;
			}
			break;
		}
		case 3:	//圆弧
		{
			CArc* pArc=new CArc(p_View->m_pColor,p_View->m_brColor,1,0,p_View->m_Layer,id,0,0,0,10,0,0,(float)3.141592);
			CArcDlg pdlg(pArc);
			if(pdlg.DoModal()==IDOK)
			{
				m_pDoc->AddArc(pArc);
				MakeStr(pArc);
				plist2->AddString(m_str);
				plist2->SetCurSel(m_GraphNumb);
				m_pDoc->m_Index[m_GraphNumb++]=m_pDoc->GetGraphUpperBound(nn1+1);
			}
			else
			{
				delete pArc;
			}
			break;
		}
		case 4:	//标注文本
		{
			CText* pText=new CText(p_View->m_pColor,p_View->m_brColor,1,0,p_View->m_Layer,id,0,
				0,0,0,0,p_View->m_FontHeight,p_View->m_FontWide,0,0,"");
			CTextDlg pdlg(pText);
			if(pdlg.DoModal()==IDOK)
			{
				m_pDoc->AddText(pText);
				MakeStr(pText);
				plist2->AddString(m_str);
				plist2->SetCurSel(m_GraphNumb);
				m_pDoc->m_Index[m_GraphNumb++]=m_pDoc->GetGraphUpperBound(nn1+1);
			}
			else
			{
				delete pText;
			}
			break;
		}
		case 5:	//图例
		{
			CTag* pTag=new CTag(p_View->m_pColor,p_View->m_brColor,1,0,p_View->m_Layer,0,
				0,0,1,1,id,NULL);
			CTagDlg pdlg(m_pDoc,pTag);
			if(pdlg.DoModal()==IDOK)
			{
				m_pDoc->AddTag(pTag);	
				MakeStr(pTag);
				plist2->AddString(m_str);
				plist2->SetCurSel(m_GraphNumb);
				m_pDoc->m_Index[m_GraphNumb++]=m_pDoc->GetGraphUpperBound(nn1+1);
			}
			else
			{
				delete pTag;
			}
			break;
		}
	}
}

void CGraphDataDlg::OnDelete() 
{
	int nn1=plist1->GetCurSel();
	if(nn1<0)
		return;
	int nn2=plist2->GetCurSel();
	if(nn2<0)
		return;
	CDraw* pDraw=m_pDoc->GetGraph(nn1+1,m_pDoc->m_Index[nn2]);
	if(pDraw->IsDelete())	//如果这个图形元素已经处于删除状态,则恢复这个图形元素
		pDraw->Delete(0);
	else
		pDraw->Delete(1);
	MakeStr(pDraw);
	plist2->DeleteString(nn2);
	if(nn2==m_GraphNumb-1)		//如果操作的是列表框中最后一个图形元素
		plist2->AddString(m_str);
	else
		plist2->InsertString(nn2,m_str);
	plist2->SetCurSel(nn2);
	OnSelchangeList2();
}

//修改图形元素
void CGraphDataDlg::OnModify() 
{
	int nn1=plist1->GetCurSel();
	if(nn1<0)
		return;
	int nn2=plist2->GetCurSel();
	if(nn2<0)
		return;
	switch(nn1)
	{
		case 0:	//直线
		{
			CLineDlg pdlg((CLine *)(m_pDoc->GetGraph(nn1+1,m_pDoc->m_Index[nn2])));
			pdlg.DoModal();
			break;
		}
		case 1:	//连续直线和多边形区域
		{
			CPLineDlg pdlg((CPline *)(m_pDoc->GetGraph(nn1+1,m_pDoc->m_Index[nn2])));
			pdlg.DoModal();
			break;
		}
		case 2:	//圆和圆形区域
		{
			CCircleDlg pdlg((CCircle *)(m_pDoc->GetGraph(nn1+1,m_pDoc->m_Index[nn2])));
			pdlg.DoModal();
			break;
		}
		case 3:	//圆弧
		{
			CArcDlg pdlg((CArc *)(m_pDoc->GetGraph(nn1+1,m_pDoc->m_Index[nn2])));
			pdlg.DoModal();
			break;
		}
		case 4:	//标注文本
		{
			CTextDlg pdlg((CText *)(m_pDoc->GetGraph(nn1+1,m_pDoc->m_Index[nn2])));
			pdlg.DoModal();
			break;
		}
		case 5:	//图例
		{
			CTagDlg pdlg(m_pDoc,(CTag *)(m_pDoc->GetGraph(nn1+1,m_pDoc->m_Index[nn2])));
			pdlg.DoModal();
			break;
		}
	}
}

BOOL CGraphDataDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	plist1=(CListBox *)GetDlgItem(IDC_LIST1);
	plist1->ResetContent();
	plist1->AddString("直线");
	plist1->AddString("连续直线和多边形区域");
	plist1->AddString("圆或圆形区域");
	plist1->AddString("圆弧");
	plist1->AddString("标注文本");
	plist1->AddString("图例");
	plist2=(CListBox *)GetDlgItem(IDC_LIST2);
	plist2->ResetContent();
	OnSelchangeList1();
	return TRUE;  
}

void CGraphDataDlg::OnSelchangeList2() 
{
	CButton* pbut;
	int nn=plist2->GetCurSel();
	if(nn<0)
	{
		pbut=(CButton *)GetDlgItem(IDC_MODIFY);
		pbut->EnableWindow(FALSE);
		pbut=(CButton *)GetDlgItem(IDC_DELETE);
		pbut->EnableWindow(FALSE);
		return;
	}
	pbut=(CButton *)GetDlgItem(IDC_MODIFY);
	pbut->EnableWindow(TRUE);
	pbut=(CButton *)GetDlgItem(IDC_DELETE);
	pbut->EnableWindow(TRUE);
	return;
}

//产生在列表框中显示的字符串
void CGraphDataDlg::MakeStr(CDraw* pDraw) 
{
	char p1[10];
	int lb=pDraw->GetGraphLb();
	switch(lb)
	{
	case 1:	
		m_str="直线";
		break;
	case 2:
		if(pDraw->IsFill())
			m_str="多边形区域";
		else
			m_str="连续直线";
		break;
	case 3:
		if(pDraw->IsFill())
			m_str="圆形区域";
		else
			m_str="圆";
		break;
	case 4:
		m_str="圆弧";
		break;
	case 5:
		m_str="标注文本";
		break;
	case 6:
		m_str="图例";
		break;
	default:
		break;
	}
	sprintf(p1,"  %6d",pDraw->GetID());
	m_str+=p1;
	m_str+="  ";
	if(pDraw->IsDelete())
		m_str+="×";
}


void CPLineDlg::OnEditchangeCombo1() 
{
	// TODO: Add your control notification handler code here
	
}

⌨️ 快捷键说明

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