C#如何绘制跟随鼠标的十字线而不影响背景?
发布网友
发布时间:2022-05-15 12:56
我来回答
共3个回答
热心网友
时间:2022-05-15 14:25
第一步:
定义变量:
//画十字的点,因为中间有空白,所以用8个点
Point[] ps = new Point[] { new Point(2, 0), new Point(2, 1), new Point(0, 2), new Point(1, 2), new Point(3, 2), new Point(4, 2), new Point(2, 3), new Point(2, 4) };
//十字大小
int sizeP = 1;
//十字的位置
Point pos = new Point(0, 0);
第二步:
在你要的控件上划出你要的十字
我测试用的是form1,记得在事件Paint里面,其他地方容易丢失
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawLine(new Pen(Color.Red), ps[0].X + pos.X, ps[0].Y + pos.Y, ps[1].X + pos.X, ps[1].Y + pos.Y);
g.DrawLine(new Pen(Color.Red), ps[2].X + pos.X, ps[2].Y + pos.Y, ps[3].X + pos.X, ps[3].Y + pos.Y);
g.DrawLine(new Pen(Color.Red), ps[4].X + pos.X, ps[4].Y + pos.Y, ps[5].X + pos.X, ps[5].Y + pos.Y);
g.DrawLine(new Pen(Color.Red), ps[6].X + pos.X, ps[6].Y + pos.Y, ps[7].X + pos.X, ps[7].Y + pos.Y);
}
第三步:
改变大小,在你想改变大小的时候调用下 我测试是再
form_load里面设置为5
private void SetSize(int sizep)
{
sizeP = sizep;
for (int i = 0; i < 8; ++i)
{
ps[i].X *= sizeP;
ps[i].Y *= sizeP;
}
}
第四部:
改变位置
private void SetPos(int x, int y)
{
pos.X = x - sizeP * 2;
pos.Y = y - sizeP * 2;
}
我吧他放在MouseMove事件里面 记得要调用Refresh来重绘啊
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
SetPos(e.X, e.Y);
this.Refresh();
}
就写这么多 不懂再问我追问波形图片,十字坐标可以即时读出幅度。
窗体下方放置按钮,加载波形图片直接在窗体上绘制,双击鼠标变成带十字线。
十字线中心是透明,利用背景颜色来确认鼠标位置是否确实在波形曲线上。
鼠标右下角显示Tips小标签。
问:十字线是否利用双窗体来实现,或是有其他简单的方式。
追答按照你现在的需求,确实可以用双窗体来实现,不过,窗体的透明有点复杂,
利用背景颜色来确认鼠标位置是否确实在波形曲线上。
这个不好,不是不能实现,是不准确
可以通过鼠标坐标(x,y)来算,将x带入波形函数,然后算值,y 和算出的结果误差不大于多少时候就是
若不是y函数 就把Y带入,算出一个x,x误差不超过就是在曲线上
最后给你的建议有个非常好的
就是找一个gif图片做十字架,用image控件来显示图片,它支持透明层。然后tooltips就用image的tooltips就好了:)
保证可以实现你要的:)
十字架图片可以自己ps
记得要有透明层哦
热心网友
时间:2022-05-15 15:43
可以考虑把这个十字线弄成一个图片,而这个图片是放在一个控件上的,你移动只是移动控件,这样就会很流畅。追问移动picturebox,为何form的背景图片backgroundimage也会跟着晃动起来,怎么解决这个问题?
热心网友
时间:2022-05-15 17:18
g.DrawLine(new Pen(Color.Red), ps[0].X + pos.X, ps[0].Y + pos.Y, ps[1].X + pos.X, ps[1].Y + pos.Y);
g.DrawLine(new Pen(Color.Red), ps[2].X + pos.X, ps[2].Y + pos.Y, ps[3].X + pos.X, ps[3].Y + pos.Y);
g.DrawLine(new Pen(Color.Red), ps[4].X + pos.X, ps[4].Y + pos.Y, ps[5].X + pos.X, ps[5].Y + pos.Y);
g.DrawLine(new Pen(Color.Red), ps[6].X + pos.X, ps[6].Y + pos.Y, ps[7].X + pos.X, ps[7].Y + pos.Y);
}