事件触发及其顺序:
1、单击左键–确定圆心坐标。
2、鼠标移动–画虚线。
3、单击左键–确定椭圆A轴半径m_Axis1。
4、鼠标移动–画虚线,根据实时变化的椭圆B轴半径Axis2,画出实时变化的椭圆。
5、单击左键–确定椭圆B轴半径m_Axis2。
6、单击左键–确定开始角度m_StartAng。
7、鼠标移动–画虚线,根据实时变化的扫描角度SweepAng,画出实时变化的椭圆弧。
8、单击左键–确定扫描角度。
bool bMouseDown = false;
int bDrawArcStep = 0;//画弧的点击鼠标步骤序号
double m_dbArcAxis1 = 0;
double m_dbArcAxis2 = 0;
double m_dbArcStartAngle = 0;
double m_dbArcSweepAngle = 0;
private void pictureMark_MouseMove(object sender, MouseEventArgs e)
{
DrawDC.ClearDrawImage();
if (m_strDrawTool == "Arc")
{
if (bMouseDown)
{
double dbX = e.X;
double dbY = e.Y;
Pen pen = new Pen(Pens.DarkGreen.Brush, 1);
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Custom;
pen.DashPattern = new float[] { 10, 10 };
DrawDC.DrawLine(pen, (float)m_dotFirst.x, (float)m_dotFirst.y, (float)dbX, (float)dbY);
double dbxPos = 0;
double dbyPos = 0;
double dbWid = 0;
double dbHeight = 0;
if (bDrawArcStep == 2)
{
dbxPos = m_dotFirst.x - m_dbArcAxis1;
CDot dot = new CDot(e.X, e.Y);
double dbArcAxis2 = m_dotFirst.DistanceFromDot(dot);
dbyPos = m_dotFirst.y - dbArcAxis2;
dbWid = m_dbArcAxis1 * 2;
dbHeight = dbArcAxis2 * 2;
DrawDC.DrawEllipse(Pens.Blue, dbxPos, dbyPos, dbWid, dbHeight);
}
else if(bDrawArcStep == 3)
{
dbxPos = m_dotFirst.x - m_dbArcAxis1;
dbyPos = m_dotFirst.y - m_dbArcAxis2;
dbWid = m_dbArcAxis1 * 2;
dbHeight = m_dbArcAxis2 * 2;
DrawDC.DrawEllipse(Pens.Blue, dbxPos, dbyPos, dbWid, dbHeight);
double dbStartAngle = Math.Atan2((e.Y - m_dotFirst.y), (e.X - m_dotFirst.x));
dbStartAngle = (dbStartAngle / Math.PI) * 180.0;
if (dbStartAngle < -0.001)
dbStartAngle += 360;
string strStartAngle = dbStartAngle.ToString("0.00");
DrawDC.DrawText(Pens.DarkGreen, strStartAngle, e.X, e.Y);
}
else if (bDrawArcStep == 4)
{
dbxPos = m_dotFirst.x - m_dbArcAxis1;
dbyPos = m_dotFirst.y - m_dbArcAxis2;
dbWid = m_dbArcAxis1 * 2;
dbHeight = m_dbArcAxis2 * 2;
double dbEndAngle = Math.Atan2((e.Y - m_dotFirst.y), (e.X - m_dotFirst.x));
dbEndAngle = (dbEndAngle / Math.PI) * 180.0;
if (dbEndAngle < -0.001)
dbEndAngle += 360;
double dbSweepAngle = (dbEndAngle > m_dbArcStartAngle) ?
(dbEndAngle - m_dbArcStartAngle) : (360 - (m_dbArcStartAngle - dbEndAngle)); ;
DrawDC.DrawArc(Pens.Blue, dbxPos, dbyPos, dbWid, dbHeight, m_dbArcStartAngle, dbSweepAngle);
string strSweepAngle = dbSweepAngle.ToString("0.00");
DrawDC.DrawText(Pens.DarkGreen, strSweepAngle, e.X, e.Y);
}
}
}
pictureMark.Image = DrawDC.m_Bitmap;
}
private void pictureMark_MouseDown(object sender, MouseEventArgs e)
{
if (m_strDrawTool == "Arc")
{
if(e.Button == MouseButtons.Left)
{
if (bDrawArcStep == 0)//确定椭圆心
{
m_QuadSelect.Initial();
m_dotFirst = new CDot(e.X, e.Y);
DrawDC.NewBitMap();
bDrawArcStep++;
bMouseDown = true;
}
else if (bDrawArcStep == 1)//确定椭圆轴1
{
CDot dot = new CDot(e.X, e.Y);
m_dbArcAxis1 = m_dotFirst.DistanceFromDot(dot);
bDrawArcStep++;
}
else if (bDrawArcStep == 2)//确定椭圆轴2
{
CDot dot = new CDot(e.X, e.Y);
m_dbArcAxis2 = m_dotFirst.DistanceFromDot(dot);
bDrawArcStep++;
}
else if (bDrawArcStep == 3)//确定开始角度
{
double dbStartAngle = Math.Atan2((e.Y - m_dotFirst.y), (e.X - m_dotFirst.x));
m_dbArcStartAngle = (dbStartAngle / Math.PI) * 180.0;
if (m_dbArcStartAngle < -0.001)
m_dbArcStartAngle += 360;
bDrawArcStep++;
}
else if (bDrawArcStep == 4)
{
bDrawArcStep = 0;
bMouseDown = false;
DrawDC.m_CurBitmap = null;
panelDraw.Invalidate();
}
}
}
}