关于winform画线的问题

文~若 2018-11-01 05:14:46
加精
现在有一个项目是这样的,winform开发的控制火车轨道的项目,里面的轨道都是用label标签弄的,现在遇到一个问题,就是道岔的地方没法弄,如果用gdi+画出来,就没法实现点击这个道岔,对它进行一些属性设置,比如Name或者右键事件,想问问大家有没有什么方法可以让道岔或者斜线能像操作winform控件一样对它进行各种属性设置和事件操作吗? wpf可以实现label倾斜,但是目前没法换,只能用winform
...全文
3726 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
文~若 2019-05-09
  • 打赏
  • 举报
回复
引用 79 楼 老夏 的回复:
我的流程箭头是这么做的,自定义控件,关键点,计算一个Region,也就是斜线向两边偏移一点构成的区域,重载OnPaint,既然是控件,自然支持鼠标操作,最最关键的是很省事啊。摘录代码如下供参考: public partial class FlowLine : UserControl { /// <summary> /// 线的起点(线矩形框为坐标系) /// </summary> private Point StartPoint; /// <summary> ///线的终点(线矩形框为坐标系) /// </summary> private Point EndPoint; protected override void OnPaint(PaintEventArgs e) { this.Region = GetWindowRegion(); //根据起点 终点获得闭合区域 this.BackColor = Color.Transparent; Pen pen = new Pen(Color.DodgerBlue, (float)1.5); if (selected) { pen.Width = 2; pen.Color = Color.Blue; } e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; pen.DashStyle = this.lineStyle; if (pen.DashStyle == DashStyle.Dash) { pen.Color = Color.Gray; } pen.CustomEndCap = new AdjustableArrowCap(5, 8); e.Graphics.DrawLine(pen, StartPoint, EndPoint); base.OnPaint(e); } private Region GetWindowRegion() { Point[] pts = new Point[5]; GetParallelPoint(out pts[0], out pts[1], offset); //起点终点 向上平行点 GetParallelPoint(out pts[3], out pts[2], -offset); //起点终点 向下平行点 pts[4] = pts[0]; //闭合区域 GraphicsPath path = new GraphicsPath(); path.AddLines(pts); return new Region(path); } }
谢谢回答,我最后就是用了region这个属性解决的,可以切割成任何形状
吹风的兔子 2018-11-19
  • 打赏
  • 举报
回复
直觉告诉我 写一个自定义组件(不是用户控件)就能解决问题。
蒋晟 2018-11-17
  • 打赏
  • 举报
回复
MFC有个DrawCli实例,别说斜线了,椭圆也画给你看啊 至于Winforms的也很多啊,https://www.codeproject.com/Articles/17893/Extensions-to-DrawTools就是一个。 至于什么属性啥的,设计界面旁边放一个property grid就行了。
雨云21 2018-11-15
  • 打赏
  • 举报
回复
引用 楼主 嘿喵警长的回复:
现在有一个项目是这样的,winform开发的控制火车轨道的项目,里面的轨道都是用label标签弄的,现在遇到一个问题,就是道岔的地方没法弄,如果用gdi+画出来,就没法实现点击这个道岔,对它进行一些属性设置,比如Name或者右键事件,想问问大家有没有什么方法可以让道岔或者斜线能像操作winform控件一样对它进行各种属性设置和事件操作吗? wpf可以实现label倾斜,但是目前没法换,只能用winform
weixin_38386478 2018-11-10
  • 打赏
  • 举报
回复
wpf比较容易
三打不溜 2018-11-09
  • 打赏
  • 举报
回复
你好大神帮忙回答一下,我用hbuilder设计网页之后,把网页链接发送到手机浏览,前几分钟网页正常显示,但是过了一会儿就打不开了,感觉是链接失效了,我发到手机浏览的链接是这样的:http//192.168.………html,这是怎么回事啊??网上又找不到相关解答
hh8527 2018-11-09
  • 打赏
  • 举报
回复
说错了,是特别复杂的时候
hh8527 2018-11-09
  • 打赏
  • 举报
回复
如果图形特别简单,建议内嵌cefsharp,然后用html +js写svg操作
朱桂繁 2018-11-08
  • 打赏
  • 举报
回复
看到好多大神
qq_43642352 2018-11-08
  • 打赏
  • 举报
回复
如果全是gdi+画,那么可根据捕获的鼠标位置找到目标
如果混杂 label标签,那么将道岔也做成控件
  • 打赏
  • 举报
回复
我是半路加入到这个项目的,现在感觉很棘手,所以不知道要怎么往下弄了,刚才你说到控件开发技术去设计,正是我想了解的,把这些都开发成单独的控件,但是我对这一块比较陌生,能不能给一个方向或者参考资料什么的,我好去研究该研究
老夏 2018-11-07
  • 打赏
  • 举报
回复
我的流程箭头是这么做的,自定义控件,关键点,计算一个Region,也就是斜线向两边偏移一点构成的区域,重载OnPaint,既然是控件,自然支持鼠标操作,最最关键的是很省事啊。摘录代码如下供参考:

public partial class FlowLine : UserControl
{
/// <summary>
/// 线的起点(线矩形框为坐标系)
/// </summary>
private Point StartPoint;

/// <summary>
///线的终点(线矩形框为坐标系)
/// </summary>
private Point EndPoint;

protected override void OnPaint(PaintEventArgs e)
{
this.Region = GetWindowRegion(); //根据起点 终点获得闭合区域

this.BackColor = Color.Transparent;

Pen pen = new Pen(Color.DodgerBlue, (float)1.5);
if (selected)
{
pen.Width = 2;
pen.Color = Color.Blue;
}

e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

pen.DashStyle = this.lineStyle;
if (pen.DashStyle == DashStyle.Dash)
{
pen.Color = Color.Gray;
}
pen.CustomEndCap = new AdjustableArrowCap(5, 8);
e.Graphics.DrawLine(pen, StartPoint, EndPoint);


base.OnPaint(e);
}

private Region GetWindowRegion()
{
Point[] pts = new Point[5];
GetParallelPoint(out pts[0], out pts[1], offset); //起点终点 向上平行点
GetParallelPoint(out pts[3], out pts[2], -offset); //起点终点 向下平行点
pts[4] = pts[0]; //闭合区域

GraphicsPath path = new GraphicsPath();
path.AddLines(pts);
return new Region(path);
}
}
爪云王子 2018-11-07
  • 打赏
  • 举报
回复
位移技术吧,可以去看winform的位移指令,你说的那个按钮事件可以通过命令代码执行属性设置也可以。
zalv5201314 2018-11-07
  • 打赏
  • 举报
回复
好厉害,这样都可以.......
FAN991 2018-11-07
  • 打赏
  • 举报
回复
wsaertfesgjkh zsdvasddffgdf无是非观额打个电话
zysm8888 2018-11-06
  • 打赏
  • 举报
回复
那是个用户控件,需要什么就加什么
damofengxue 2018-11-06
  • 打赏
  • 举报
回复
挺好的......
baishi1987 2018-11-06
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
[quote=引用 3 楼 nan1988113 的回复:] 道岔我写成了自定义控件,然后在自定义控件里面用gdi画线,但是有些单独斜着的线没法弄
从业务出发来建模,才知道技术该往哪里分类。 一整条轨道线,这就应该是一个控件。[/quote] 我不太同意你的观点。其实,这个用整个画布的思想来看,还更简单点,一个句柄完成,自定义鼠标事件。 如果是单挑轨道这样搞搞还是可以的,如果是N条轨道,纯粹的控件非常影响效率
weixin_43612029 2018-11-05
  • 打赏
  • 举报
回复
或者用gdi+来做
weixin_43612029 2018-11-05
  • 打赏
  • 举报
回复
同解以下 如果全是gdi+画,那么可根据捕获的鼠标位置找到目标
如果混杂 label标签,那么将道岔也做成控件
加载更多回复(41)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧