高手请进,请问怎么实现通过鼠标同时画三条平行线? 我现实现用鼠标选定起点后,移动鼠标自动在平面上画三条平行线,中间一条的起点为鼠标选定点,另外两条可以设定间距后随鼠标移动自动划线,也就是用鼠标在平面任意地方点一下,拖动鼠标就可以画三条平行线,请问怎么实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TO shuchen0829 : 既然easy,请赐教,谢谢! 上codeproject上找,先画一条线,然后再根据这一条线,在绘制时画另外两条线。主要是处理鼠标事件. mousedown 的事件.. 再调用三个DrawLine就可以搞定了. 座标点要自己计算一下..中间哪条线可以直接获得.其它的两条要跟据一下斜率来算一下座标点..麻烦一些 fromhttp://blog.sina.com.cn/u/589d32f501000aa3private Point downPoint = Point.Empty; // 鼠标按下的坐标private Point movePoint = Point.Empty; // 鼠标移动的坐标private double lineSpace = 12.0f; // 线条之间的距离private Point offsetPointA = Point.Empty; // 偏移坐标Aprivate Point offsetPointB = Point.Empty; // 偏移坐标Bprivate double PointToAngle(Point AOrigin, Point APoint){ if (APoint.X == AOrigin.X) if (APoint.Y > AOrigin.Y) return Math.PI * 0.5f; else return Math.PI * 1.5f; else if (APoint.Y == AOrigin.Y) if (APoint.X > AOrigin.X) return 0; else return Math.PI; else { double Result = Math.Atan((double)(AOrigin.Y - APoint.Y) / (AOrigin.X - APoint.X)); if ((APoint.X < AOrigin.X) && (APoint.Y > AOrigin.Y)) return Result + Math.PI; else if ((APoint.X < AOrigin.X) && (APoint.Y < AOrigin.Y)) return Result + Math.PI; else if ((APoint.X > AOrigin.X) && (APoint.Y < AOrigin.Y)) return Result + 2.0f * Math.PI; else return Result; }} /* PointToAngle */private void Form1_MouseDown(object sender, MouseEventArgs e){ downPoint = e.Location;}private void Form1_MouseMove(object sender, MouseEventArgs e){ if (downPoint != Point.Empty) { Graphics vGraphics = CreateGraphics(); if (movePoint != Point.Empty) { vGraphics.DrawLine(new Pen(BackColor), offsetPointA, new Point(movePoint.X + offsetPointA.X - downPoint.X, movePoint.Y + offsetPointA.Y - downPoint.Y)); vGraphics.DrawLine(new Pen(BackColor), offsetPointB, new Point(movePoint.X + offsetPointB.X - downPoint.X, movePoint.Y + offsetPointB.Y - downPoint.Y)); vGraphics.DrawLine(new Pen(BackColor), downPoint, movePoint); } movePoint = e.Location; double angle = PointToAngle(downPoint, movePoint); offsetPointA.X = (int)(Math.Cos(angle + 0.5f * Math.PI) * lineSpace + downPoint.X); offsetPointA.Y = (int)(Math.Sin(angle + 0.5f * Math.PI) * lineSpace + downPoint.Y); offsetPointB.X = (int)(Math.Cos(angle - 0.5f * Math.PI) * lineSpace + downPoint.X); offsetPointB.Y = (int)(Math.Sin(angle - 0.5f * Math.PI) * lineSpace + downPoint.Y); vGraphics.DrawLine(Pens.Red, offsetPointA, new Point(movePoint.X + offsetPointA.X - downPoint.X, movePoint.Y + offsetPointA.Y - downPoint.Y)); vGraphics.DrawLine(Pens.Red, offsetPointB, new Point(movePoint.X + offsetPointB.X - downPoint.X, movePoint.Y + offsetPointB.Y - downPoint.Y)); vGraphics.DrawLine(Pens.Blue, downPoint, movePoint); vGraphics.Dispose(); }}private void Form1_MouseUp(object sender, MouseEventArgs e){ downPoint = Point.Empty;} 感谢各位,zswang(伴水清清)的方法可行! FormView出现这样的情况,你发现过了? treeview绑定数据 请问webBrowser使用代理时如何屏蔽弹出的用户名与密码输入对话框 C#+wince,发现Forms类里面没有message 急。。。很急。。。。!!listview显示问题。 如何禁止DataGridView添加新行,也就是最下面的一行新行不显示? 怎样取DataGrid里的值 如何得到网页中的某个图片? 谁帮忙把这句话翻译成C#啊,谢谢,在线等待 请问如何生成html文件 请教:Window.open()弹出新窗口的有关问题 如何判断一个字符串全是数字?
中间哪条线可以直接获得.其它的两条要跟据一下斜率来算一下座标点..麻烦一些
http://blog.sina.com.cn/u/589d32f501000aa3private Point downPoint = Point.Empty; // 鼠标按下的坐标
private Point movePoint = Point.Empty; // 鼠标移动的坐标
private double lineSpace = 12.0f; // 线条之间的距离
private Point offsetPointA = Point.Empty; // 偏移坐标A
private Point offsetPointB = Point.Empty; // 偏移坐标Bprivate double PointToAngle(Point AOrigin, Point APoint)
{
if (APoint.X == AOrigin.X)
if (APoint.Y > AOrigin.Y)
return Math.PI * 0.5f;
else return Math.PI * 1.5f;
else if (APoint.Y == AOrigin.Y)
if (APoint.X > AOrigin.X)
return 0;
else return Math.PI;
else
{
double Result = Math.Atan((double)(AOrigin.Y - APoint.Y) /
(AOrigin.X - APoint.X));
if ((APoint.X < AOrigin.X) && (APoint.Y > AOrigin.Y))
return Result + Math.PI;
else if ((APoint.X < AOrigin.X) && (APoint.Y < AOrigin.Y))
return Result + Math.PI;
else if ((APoint.X > AOrigin.X) && (APoint.Y < AOrigin.Y))
return Result + 2.0f * Math.PI;
else return Result;
}
} /* PointToAngle */private void Form1_MouseDown(object sender, MouseEventArgs e)
{
downPoint = e.Location;
}private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (downPoint != Point.Empty)
{
Graphics vGraphics = CreateGraphics();
if (movePoint != Point.Empty)
{
vGraphics.DrawLine(new Pen(BackColor), offsetPointA,
new Point(movePoint.X + offsetPointA.X - downPoint.X,
movePoint.Y + offsetPointA.Y - downPoint.Y));
vGraphics.DrawLine(new Pen(BackColor), offsetPointB,
new Point(movePoint.X + offsetPointB.X - downPoint.X,
movePoint.Y + offsetPointB.Y - downPoint.Y));
vGraphics.DrawLine(new Pen(BackColor), downPoint, movePoint);
}
movePoint = e.Location;
double angle = PointToAngle(downPoint, movePoint);
offsetPointA.X = (int)(Math.Cos(angle + 0.5f * Math.PI) * lineSpace +
downPoint.X);
offsetPointA.Y = (int)(Math.Sin(angle + 0.5f * Math.PI) * lineSpace +
downPoint.Y);
offsetPointB.X = (int)(Math.Cos(angle - 0.5f * Math.PI) * lineSpace +
downPoint.X);
offsetPointB.Y = (int)(Math.Sin(angle - 0.5f * Math.PI) * lineSpace +
downPoint.Y);
vGraphics.DrawLine(Pens.Red, offsetPointA,
new Point(movePoint.X + offsetPointA.X - downPoint.X,
movePoint.Y + offsetPointA.Y - downPoint.Y));
vGraphics.DrawLine(Pens.Red, offsetPointB,
new Point(movePoint.X + offsetPointB.X - downPoint.X,
movePoint.Y + offsetPointB.Y - downPoint.Y)); vGraphics.DrawLine(Pens.Blue, downPoint, movePoint);
vGraphics.Dispose();
}
}private void Form1_MouseUp(object sender, MouseEventArgs e)
{
downPoint = Point.Empty;
}